Article archivé
Cet article est une archive qu'il n'y a normalement plus trop lieu de consulter sauf si vous êtes tellement mega fan de moi que vous voulez vraiment très fort lire la vieille intro trop longue qui suit.
Voici le lien vers la dernière version de l'article.
Introduction et billet d'humeur que personne n'a demandé
Bluesky est un clone de Twitter (pardon, X) décentralisé (sauf qu'en fait il est centralisé en ce moment mais le mot "décentralisé" ça fait comme le mot quantique, ça a l'air mystique et génial en même temps alors que c'est probablement du caca de vache sur une trotinette).
Mis-à-part que l'entrée sur le réseau social est toujours sur invitation en ce moment, je pense que ça aiderait à l'adoption d'avoir un moyen de poster en même temps sur Twitter et Bluesky (et Mastodon aussi en bonus).
Je promet d'expliquer comment poster en même temps sur Twitter et Bluesky plus loin en détails et accessible aux néophytes (qui ont tout de même légèrement envie de chipoter) étape par étape.
Avant que ça faut que je radote sur le sens de la vie mais vous êtes bien entendu libres de passer cette intro.
L'ambiance sur Bluesky est aussi plus proche du vieux Twitter que de... X.
On rencontre beaucoup plus d'enthousiastes de la tech, d'artistes et de milléniaux qui ont envie de rigoler que de #JambonBeurre (j'en ai trouvé aucun) ou autres personnages ultra sérieux dans leur désir de vous vendre un sac sur la société qui s'écroule à cause des élites qui organisent des Squid Game où ils tirent des seringues de vaccins covid sur de pauvres hères dont le café cabaret a été remplacé par un kebab.
C'est clair qu'il y a un biais progressiste sur Bluesky. Normalement il y en avait un sur Twitter aussi, d'ailleurs il est toujours vaguement là mais enterré sous 40 tweets d'Andrew Tate.
Je sais pas trop ce qui est parti en ribotte avec Twitter, si c'est le confinement et/ou diverses élections américaines mais les gens ont arrêté de rire et quelqu'un a décide que les BOTs c'était le mal et que la liberté d'expression était décédée sur Twitter.
Alors, pour faire un pas vers Musk, c'est vrai que les gens bannis sur Twitter faisaient à peu près tous partie du même bord politique et la gauche avait très largement gagné tout internet. Je m'attendais un peu à ce qu'il y ait un virage un jour ou l'autre parce qu'on commençait à aller un tout pitit peu trop loin avec le progressi..v progressisvme. Non pas que ça soit anormal pour les jeunes gens d'arborer des opinions un peu extrêmes.
Après le rachat, les gens bannis à l'époque de Gamergate sont revenus sur Twitter après des années d'hibernation où je pensais perso qu'ils avaient grandi et possiblement évolué dans leurs croyances. Ben non c'est les mêmes gens qui disent exactement les mêmes choses juste 5 ans plus tard.
Ceci et d'autres éléments que je me permet d'omettre dans cette intro déjà trop longue m'ont convaincu que bannir ces opinions qui dérangent n'aide absolument pas à les changer et c'est aujourd'hui, selon moi, plus productif de laisser tout le monde s'exprimer que d'essayer de défendre la CaNC3l CultVRe qui a été historiquement un des fers de lance de la presse de droite pour renforcer leur position.
MAIS, voilà, les opinions anti-progressistes (anti-woke comme ils disent) c'est pas super à la mode dans le sens où les gens qui vendent leur pub sur Twitter ils ont pas super envie que le produit se retrouve en face d'un aéropage de conspirationnistes qui pensent que la terre est plate et qu'une grande quantité de personnes trans psychopathes vaccinés vont agresser des femmes dans des WC publics.
Ce qui nous amène au jour d'aujourd'hui où Musk pleurniche parce que, suprise, les publicitaires sont pas super fans de son réseau social "champion de la liberté d'expression" où il faut en fait payer pour que des gens voient votre réponse à n'importe quel tweet un peu populaire en plus d'Elon lui-même qui tweet des trucs bizarres tous les jours qui semblent apparaître automatiquement sur la page d'accueil d'à peu près tout le monde.
Exemple, le fameux tweet a l'origine de la controverse la plus récente, c'est cette suite:
Il s'agit d'une réponse à quelqu'un (un juif, je précise) qui dit, en gros, "Yo les gens qui disent que Hitler avait raison, venez nous le dire en face!"
Ce à quoi un mec (visiblement suivi par Musk) répond:
Okay.
Les juifs ont soutenu exactement le même type de dialogue à l'encontre des BLANCS et là, ils veulent qu'on ne l'utilise pas contre eux.
Je vais pas verser une larme parce que les juifs de l'occident se rendent enfin compte que les hordes de minorités en faveur d'envahir leur pays ne les aiment pas trop en fait.
Vous voulez la véritié, la voilà.
Ce à quoi Musk répond: "Ah bah oui c'est totalement vrai".
Cet enchaînenent est difficile à décortiquer tellement il invoque de couches de stupidité.
Je traduis pour les gens normaux: le mec trouve que les "juifs d'occident" (je pense qu'il veut secrètement dire les dirigeants d'entreprise / Hollywood de gauche?) n'ont que ce qu'ils méritent parce qu'ils ont trop favorisé les minorités avec leur DISCOURS WOKE et maintenant ils se rendent compte qu'en fait les minorités et l'extrème gauche sur Internet ils sont tous pro-Hamas/destruction d'Israël et en fait ils aiment pas les juifs.
Alors, c'est vrai que l'extrême gauche est fort antisémite en ce moment mais je pense pas que les "juifs d'occident" soient d'extrême gauche ni ne favorisent l'extrême gauche des jeunes communistes non-binaires de Twitter. Au contraire ils sont plutôt très, très capitalistes.
Les gens de la droite alternativo-conspirationniste pensent que toutes les décisions de représentation des minorités dans les médias, ben c'est un juif il l'a décidé. Ouaip.
Mais c'est quoi que les Juifs d'occident ont dit de pas sympa envers les blancs? Ils les ont traité de biscuits salés? De TUC? Je vois vraiment pas de quoi ils parlent. Il y a du racisme anti-blanc sur Twitter certes mais je vois pas comment on peut penser que ça vient des juifs.
Le sentiment "anti-blanc" c'est un truc en marge qui est overdramatisé par la droite et là, ce qu'Elon voulait dire avec sa réponse c'est genre: Haha vous avez voulu que la petite sireine soit noire, mais regardez, les noirs ils aiment pas les juifs lol bien fait pour vous les wokistes.
J'essaye même pas d'exagérer pour rendre le truc rigolo je suis 99% sûr que c'est vraiment ce qu'il pense.
Pour revenir sur le sujet de la droite, y a tout un tas de juifs fort de droite dont plusieurs influenceurs très connus aux US. Le gouvernement Israélien est de droite aussi. Les juifs orthodoxes sont très conservateurs et pas très chauds transidentité ni métissage d'ailleurs.
Les juifs occidentaux ne participent pas au "sentiment anti-blanc", au contraire il y en a quelques uns qui sont bien nationalistes.
Là il y en a un au fond qui se dit "Mais DK, il répond clairement à quelqu'un qui est d'extrême gauche ou qui supporte le W0k1sme". He ben non. Il répond à un juif conservateur qui a un gros drapeau américain dans sa bio. Alors oui, le mec est "pro-Israel" surprise surprise mais il est pas du tout progressiste.
Je pourrais encore pousser l'analyse mais vous avez compris, tout cet échange ne rassure pas sur l'équilibre d'un éventuel dirigeant d'entreprise qui a quelques opinions qui fâchent, parfois.
Et, en réalité, je ne trouve pas que ce tweet soit "antisémite" comme ça a été présenté partout dans la presse, et je pense pas que Musk lui-même soit antisémite. Il est juste tellement profond dans le monde magique du club des victimes-d'ado-activistes-sur-internet qu'il se rend pas compte que le tweet qu'il acquiesce n'a qu'un bout du petit orteil dans la réalité et le reste est du caca étalé sur des corps encore chaud.
C'est plus une histoire d'être totalement à l'ouest que d'être antisémite, quoi. Pourquoi se manifester sous ce genre de tweets juste après qu'Israel ait subi un genre de 11 septembre? Il pouvait pas juste rien dire, ou attendre? Comment t'arrives encore à être étonné quand tes partenaires te regardent comme un alien et retirent leur soutien?
J'aurais pu choisir plein d'autres exemples, les oopsies de "changement d'API", les réunions où il chie sur la partie technique de Twitter en disant qu'il faut "tout re-écrire", le fait que son tweet épinglé actuel c'est un vieux proverbe naze qui a l'air d'avoir été pompé sur Facebook ...
Pire encore, je reprends la rédaction de cet article le lendemain, et apparemment El Musk propose de réinstaurer Alex Jones, un célèbre conspirationniste d'internet. Les conneries qu'il débitent sont évidemment un business.
Il était banni de Twitter pour avoir raconté des bêtises suite à une tuerie dans une école, si je me souviens bien. Un truc du genre. C'était apparemment suffisamment grave pour qu'il ne fasse pas partie de la bande des extrémistes bannis qui sont revenus après le rachat.
Mais là, maintenant que les publicitaires sont de toutes façon partis, autant bouter le feu à mon jouet acheté 44 milliars.
Le surlendemain on voit apparaître un live (que j'ai fort envie de regarder mais pas le temps) avec du beau monde:
Le mec a des problèmes. Parlons donc de Bluesky.
Pourquoi Bluesky?
Le projet date de 2019, avant le rachat de Twitter.
J'ai cru comprendre que l'idée était de créer un gros clone de Mastodon et lui donner exactement la même apparence que Twitter, ce qui est OK parce que le projet a été créé par Twitter.
Et ouais, ça vous épate hein?
De fait, il y avait déjà Mastodon. Mais tout le monde s'en balance de Mastodon avec une force cosmique.
Bon ce qui fait un peu plus peur c'est qu'il y avait potentiellement des plans d'insérer de la BLOCKCHAIN dans Bluesky et le CEO actuel travaillait pour un truc de crypto obscur auparavant. Et Dorsey (ex. PDG de Twitter) lui même est un peu bizarre.
La bonne nouvelle c'est qu'il n'y a rien d'adjacent à la blockchain ou cryptomonnaie dans le projet Bluesky.
Le réseau fonctionne pour l'instant sur invitation. Si vous avez des amis, il y en a sûrement l'un ou l'autre qui pourra vous avoir une invite. Moi j'ai pas d'amis et j'ai eu une invitation donc je pense que ça ira.
Sinon, il y a une liste d'attente qui ressemble plutôt à un pipe vers /dev/null (ça veut dire que votre fax tombe tout de suite dans la poubelle).
Le premier truc chouette non encore abordé dans mon intro interminable c'est que la vue par défaut vous montre les posts des gens que vous suivez et pas un torrent de tweets de Musk et de comptes à gimmick bizarres sans oublier les pubs.
Par défaut Twitter vous montre le flux "pour vous" qui contient naturellement tout ce que Twitter a envie de vous montrer c'est à dire des comptes déjà très populaires avec pas mal d'engagement et un facteur de drame non négligeable.

Youtube a la même stratégie. Perso j'ai désactivé l'historique de mes vidéos donc ils me montrent toujours la même page d'accueil moche qui explique qu'ils ne peuvent pas me proposer des "vidéos à mon goût" parce que j'ai désactivé l'historique. Et évidemment les abonnements sont sur un autre onglet qui est plus bas.
Second point en faveur de Bluesky: je ne vois pas de pub.
C'est bien tout en étant un peu effrayant parce que je vois pas trop comment ils vont gagner de l'argent.
Ils ont le plan bizarre de vendre des noms de domaine. Ce qui n'est pas si bizarre parce qu'ils proposent déjà une vérification DNS de la propriété de votre nom de domaine pour pouvoir l'utiliser comme pseudo.
Par exemple, je pourrais m'appeler @dkvz.eu au lieu de dkvz.bsky.social.
Si j'ai bien compris (c'est pas clair du tout) on peut acheter un domaine en passant par Bluesky, ce qui leur rapporte une petite marge.
Une tranche du capital de Bluesky vient du rachat par Musk (si j'ai bien compris LOL).
Si d'aventure ça devient vraiment une chouette plateforme où tout le monde peut être entendu, ça veut dire qu'Elon aura accompli sa mission de sauver la liberté d'expression sur Internet. Juste pas avec Twitter et en perdant plus de 40 milliards de dollars dans l'histoire.
Un excellent businessman somme toute.
Pour revenir aux avantages de Bluesky, c'est pour l'instant plus réactif et on a l'impression d'avoir beaucoup plus d'intéractions parce que les petits comptes ne sont pas planqués par l'algorithme en plus d'être de toutes façons derrière les 130 quidam qui payent l'abonnement Twitter.
Les "influenceurs" sont aussi plus ou moins absents.
Ce que j'entends par influenceur, ce sont par exemple ces comptes tech qui ont récolté 5GB de memes pourris sur l'informatique et les repostent à longueur de journée pour créer de l'engagement, après s'être créé un public en ayant suivi le max de gens par jour, tous les jours, pendant des années (c'est ce type de compte qui a 300k follower et suit 450k autres gens).
Ces comptes font du placement de produit entre deux memes, parce que c'est une carrière en fait.
Pour finir, même si je ne pense pas que "les bots" étaient un sérieux problème sur Twitter (les robots-russes n'auraient même pas vraiment réussi à influencer significativement les élections américaines), le système d'invitation a tendance à réduire le nombre de ce type de gens qui insultent tout le monde et démarrent des guéguerres exprès parce qu'ils ont que ça à faire ou parce qu'ils aiment voir le monde brûler (je sais pas trop, ce sera un sujet pour une autre fois), mais vu que personne ne les invite... Ben ils sont pas là.
J'ai aussi entendu dire que même Thierry Breton est sur Bluesky.
Vif du sujet: poster en même temps sur Twitter et Bluesky
Bon... Je vais pas vous cacher que ça va pas être ultra simple à moins que vous soyez un professionnel des technologies de l'information et du numérique mais je pense que c'est jouable pour quelqu'un de motivé.
Il semble exister des services de marketing qui proposent du post simultané (payant, évidemment, et cher). Si vous êtes en campagne présidentielle, c'est probablement une meilleure piste que mon plan à base de script Python des familles.
Je m'étonne moi même qu'il n'y ait pas plus de projets de crossposting comme on dit dans la langue de Michael Jordan, le seul projet fonctionnel qui revient régulièrement est sur Github à cette adresse: https://github.com/Linus2punkt0/bluesky-crossposter.
C'est ça que je vous propose d'utiliser. Le code n'est pas vraiment une exemple de pur beauté algorithmique mais au moins ça fonctionne et je remercie d'ailleurs les 4 contributeurs mentionnés sur le projet pour leur travail gracieusement mis à notre disposition. Et puis c'est un projet Python sans framework donc fallait pas s'attendre à un truc bien clair et structuré.
Nous verrons qu'il y a plusieurs manières de le lancer.
C'est censé être enregistré comme tâche planifiée sur un ordinateur qui tourne tout le temps, ou lancé en tant que container avec un délai configurable entre les exécutions répétées.
Vous pouvez aussi très bien le lancer à la main de temps en temps pour synchroniser tous vos... Skeets? Je pense c'est comme ça qu'on appelle les posts de Bluesky.
Copier le script
Il s'agit de se rendre à l'URL mentionnée plus haut, et choisir une méthode pour copier le script sur votre machine.
Le plus simple consiste à récupérer le code sous forme de fichier zip en cliquant sur "Code" puis "Download ZIP":
Si vous connaissez git et Github, vous pouvez cloner le repositoire (sais pas si ça se dit comme ça mais j'aime bien) ou le fork sur votre propre compte, puis cloner ce fork sur votre machine.
Une fois le zip dézippé ou le repositoire cloné, vous devirez être en face des fichiers du projet dont plusieurs fichiers .py.
Récupérer tous les identifiants
Il va nous falloir une dizaine de clés et autres identifiants exotiques relatifs à Twitter et bluesky (et Mastodon éventuellement mais j'en parle pas dans cette note).
Les clés Twitter
Rendez-vous sur https://developer.twitter.com pour aventure laquelle que je pensais pas que ça allait être aussi fantasque donc accrochez-vous à vos braies.
Quelque part sur la page d'accueil devraient se trouver les plans tarifaires pour l'API Twitter.
Vient ensuite un écran un peu louche où ils demandent d'écrire un exposé de 250 caractères minimum pour décrire nos "cas d'utilisation" de l'API de Twitter. Oui c'est très bizarre.
Vous pouvez écrire une phrase puis copier coller Wikipedia.
Moi je dis j'en ai besoin pour poster depuis un script, puis en dessous je colle un paragraphe qui vient de ChatGPT expliquant à quel point c'est important dans la vie les scripts.
I need the Twitter API to post data automatically from a script.
In the contemporary landscape of technology, computer scripts play a pivotal role in shaping the way we interact with and harness the power of digital systems. These lines of code, executed by computers, have evolved from simple automation tools to indispensable components of our daily lives, impacting various facets of business, education, communication, and entertainment.
Le portail développeur devrait ensuite s'afficher (sinon faut rafraichir la page quelque fois). Il s'agit de déployer "Projects & Apps" et de découvrir que, normalement, il y a un "projet" déjà présent, et même peut-être une "app" aussi.

On a droit qu'à une seule "app" donc il faut virer celle qui existe en cliquant sur "Edit" et en cherchant le bouton rouge pour effacer le projet.
Sur un autre compte mon projet n'avait pas d'app déjà créée mais il y avait une standalone app. Je ne comprends absolument pas pourquoi ni quelle est la différence, mais si vous avez une "standalone app" il faut aussi l'effacer pour pouvoir créer une app sous le projet.
En soi vous pouvez aussi effacer le projet par défaut et en créer un autre avec un plus joli nom mais comme on paye pas on a droit qu'à un seul projet quoi qu'il en soit.
Après avoir fait le ménage, l'écran d'info du projet devrait arborer un bouton "Add App".
Le prochain écran demande de nommer l'app. Ce nom n'a aucune importance.
Il vous sort ensuite trois clés top secrètes.
Important: copier coller au moins les deux premières clés quelque part (genre dans un fichier devoirs.txt sur le bureau) parce qu'on va en avoir besoin plus tard. Le "Bearer Token" nous est inutile mais autant le copier avec dans votre documentation ultra secrète.
Ces infos permettent potentiellement de poster avec votre compte, d'où l'intérêt de garder tout ça secret.
Les clés ne peuvent plus être récupérées après la mise en place. Si vous les perdez, vous pouvez les regénérer depuis quelque part dans l'interface.
Une fois l'app créée, on peut cliquer dessus dans le menu de gauche. Sa page d'info affiche ensuite un bouton en bas et en regard de User authentication settings nommé "Set up". C'est là qu'on clique pour la suite.
Le bouton nous amène à un autre écran avec tout un tas d'options. Il s'agit de cocher:
- Read and write au niveau permissions;
- Web App, Automated App or Bot pour le type d'app (aucune idée de ce que ça veut dire lel);
- Remplir une URL dans App Info pour le Callback URI et le Website URL — Vous pouvez renseigner n'importe quel site pour autant que je sache, nous n'allons pas utiliser les facultés d'authentification de toutes manièress.
Le portail vous affiche ensuite deux nouveaux "secrets" qui nous sont totalement inutiles. Notez-les tout de même quelque part par soucis de complétion, en petits caractères.
Vous pensez que dans tous ces codes et identifiants on a tout ce qu'il nous faut. Ben non.
Depuis la page de l'app qui vient d'être créée il y a un bouton "Generate" en regard de "Access Token and Secret".
Les deux éléments affichés ensuite sont importants pour la config du script, gardez-les précieusement.
Nous en avons enfin terminé avec Twitter. Le plus important et d'avoir rassemblé les quatre valeurs suivantes:
- Les valeurs API Key et API Key Secret révélées lors de la création de l'app;
- Les Access Token et Access Token Secret générés un peu plus haut.
La clé Bluesky
Vous avez bien lu, il n'y a qu'une seule clé à générer sur Bluesky qui se récupère en deux clics.
Joie.
Copiez soigneusement ce mot de passe dans votre fichier de trucs secrets parce que vous ne pourrez plus le voir par la suite (comme pour les clés Twitter) — Vous pouvez toujours supprimer le mot de passe et en générer un autre si besoin.
Configurer et exécuter le script
C'est le moment de placer nos secrets, clés et autres mots de passe au bon endroit pour que le script puisse les utiliser.
Vous allez me croire si je vous dis qu'il y a plusieurs manières de le faire? Il y a plusieurs manières de le faire.
Méthode débutants, sous Windows, sans Docker
En vrai utiliser Docker est plus simple mais ceux qui ont un Docker fonctionnel (sous Windows de surcroit) n'ont probablement pas besoin de mon guide.
Installer Python
Nous allons avoir besoin de Python 3 et sur Mac et Windows, il faut l'installer manuellement. Je vais expliquer pour Windows, où il y a aussi deux options:
- Aller le chercher dans le Microsoft Store (la boutique Microsoft?);
- Télécharger le programme d'installation sur site de Python — Prendre celui qui s'appelle "Windows Installer (64-bit)" de la version 3.11.7 ou ultérieures (je sais que 3.12 fonctionne, après ça j'ai pas test).
Le plus simple reste le Windows Store, il suffit de l'ouvrir et lancer une recherche pour "python" et vous devriez trouver une page de ce genre:
Installer Python via le Microsoft Store permet de l'utiliser en ligne de commande partout, je ne suis pas certain que l'installation "manuelle" propose cette option par défaut.
Editer les fichiers du projets
C'est bon? Python il est installé?
Alors passons à la prochaine étape: éditer les fichiers auth.py, settings.py et paths.py.
Ouvrir les fichiers avec le bloc notes est probablement le moyen le plus simple de les modifier. Il suffit de cliquer droit sur un fichier puis choisir "Modifier" et ça devrait ouvrir le bloc notes.
Commençons par auth.py.
Les lignes à modifier dans ce fichier sont (placez vos valeurs entre les doubles guillemets):
bsky_handle = "votrenomsurbluesky.bsky.social"
bsky_password = "la clé Bluesky créé plus haut"
TWITTER_APP_KEY = "votre clé d'app Twitter"
TWITTER_APP_SECRET = "votre secret d'app Twitter"
TWITTER_ACCESS_TOKEN = "votre token oauth"
TWITTER_ACCESS_TOKEN_SECRET = "votre secret du token oauth"
Les 4 dernières valeurs étant les codes récupérés sur le portail développeur de Twitter, dans le même ordre.
Je vous mets aussi une image du fichier ouvert dans un éditeur avec les lignes concernées entourées:
Ensuite, modifions settings.py pour juste désactiver le post simultané vers Mastodon, en changeant cette ligne:
Mastodon = True
En:
Mastodon = False
Enregistrez les modifications et ouvrez maintenant paths.py.
Ce fichier doit absolument être modifié si le projet n'est pas lancé avec Docker, il s'agit de changer cette ligne:
basePath = "/"
En:
basePath = ""
Si ce n'est pas le cas et qu'il y a un problème avec les chemins ou permissions vous verrez ce type d'erreur qui indique que le script n'arrive pas à créer de fichiers:
C'est tout pour la config. Si vous avez fork le projet sur Github ou cloné le repo, attention de ne pas envoyer ces fichiers dans un projet public puisqu'il y a de quoi poster automatiquement à votre place sur Twitter et Bluesky dans le fichier auth.py.
C'est aussi valide si vous décidez d'archiver le projet quelque part, c'est censé être un endroit relativement sûr, et ne filez pas vos valeurs de auth.py à quelqu'un d'autre.
Exécuter le script
On est pas encore au bout de nos peines.
Histoire de vous rendre tout de suite fans de Python, on va se lancer dans la création d'un environnement virtuel pour l'exécution du script (je vous passe les explications de ce que c'est pour une fois me remerciez pas).
Comme je suis très dans l'ère du temps, j'ai décidé de travailler avec Powershell.
J'imagine que certains d'entre-vous ne sont peut-être pas familiers avec la LIGNE DE COMMANDE. Je vous livre ici une astuce pour ouvrir facilement une session Powershell dans le répertoire en cours — Il convient dès lors d'ouvrir préalablement le répertoire du projet dans l'explorateur Windows.
Il suffit alors de cliquer droit dans la barre d'adresse, choisir "Modifier", puis taper "powershell". Vous inquiétez pas voici un gif animé qui illustre l'opération:
Une fois la session en face de vous, on va commencer par autoriser le lancement de scripts non signés parce que pratiquement tous les scripts Powershell au monde sont non-signés et par défaut vous ne pouvez pas les exécuter.
Autoriser les scripts non-signés c'est comme, juste autoriser les scripts.
Il y a un petit risque de sécurité qui accompagne ce changement mais il suffit de ne pas exécuter n'importe quel script (comme il suffit de ne pas exécuter n'importe quel programme) et vous êtes tranquilles et de toutes façons notre session Powershell n'est pas en mode administrateur (pas besoin) et le changement ne concerne que notre utilisateur en cours.
Du coup tapez ceci et pressez Enter:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
S'il se passe rien, c'est normal. S'il se passe un truc, c'est probablement normal aussi (??).
Créons maintenant l'environnement virtuel pour Python. Je décide de le faire dans le répertoire "dbhost" du projet parce qu'il est dans le gitignore mais on pourrait le mettre ailleurs vu que de toutes façons on peut pas envoyer le projet via git tel quel. Si vous avez rien compris à ce que je viens de dire c'est pas grave.
Tapez ces commandes une par une suivie de enter:
mkdir dbhost
python -m venv dbhost\venv
dbhost/venv/Scripts/Activate.ps1
Note pour ceux qui seraient déjà en train de traduire cette procédure pour Linux ou Mac (c'est pratiquement la même chose): le script d'activation est dans "bin" et pas "Scripts" sur Mac et Linux, et la commande à passer est source dbhost/venv/bin/activate.
Si tout s'est bien passé vous devriez avoir un joli "venv" qui apparaît dans la ligne de commande comme illustré ci-dessous:
Nous devons encore installer les dépendances du script (ben ouais) — Cette opération doit être effectuée au moins une fois (pas nécessaire de le refaire lors des prochaines exécutions) avec la commande:
pip install -r requirements.txt
Attendez que tout se télécharge tranquillement. Nous pourrons ensuite enfin exécuter le script.
Pour ce faire, il ne reste plus qu'à taper:
python crosspost.py
Et ça y est! Vous êtes en train de répliquer vos skeets sur votre compte Twitter. Enfin si tout va bien. Et je pense qu'il y a une limite de temps pour les skeets qui sont copiés, il y a un paramètres qui traine dans settings.py qui affecte la durée max de skeets à copier (enfin je crois lol).
Exemple d'exécution sans encombres:

Le script devrait créer un fichier database.json qui sert à gérer l'état de ce qui a déjà été répliqué ou non. D'expérience, ça fonctionne pas toujours super bien et mon fichier a du JSON malformé donc je sais pas trop mais mes posts sont bien répliqués de toutes manières.
C'est ça être un hacker.
Bonus: tâche planifiée
Comme on est partis il est nécessaire de répéter pas mal d'opérations si vous fermez la session Powershell:
- Ouvrir à nouveau Powershell dans le répertoire du projet ;
- Lancer le script d'activation de l'environnement virtuel: dbhost/venv/Scripts/Activate.ps1 ;
- lancer le script lui-même: python crosspost.py
Vous pourriez créer une tâche planifiée Windows qui lance le script automatiquement lors de certaines conditions, par exemple quand Windows démarre, ou tous les X temps.
Histoire de se faciliter la vie, écrivons d'abord un script Powershell qui va lancer toutes les commandes nécessaire à l'exécution du script.
Dans le répertoire du projet, créer un fichier texte nommé Run.ps1 avec ces deux lignes dedans:
.\dbhost\venv\Scripts\Activate.ps1
python crosspost.py
Une fois ce fichier enregistré, ouvrons les tâches planifiées — Je commence à taper "Tâche" (ou "Task" en anglais) dans le menu démarré ouvert, ce qui devrait afficher le Planificateur de tâche en premier dans les résultats (c'est Task scheduler en anglais).
Vous devriez être face à un écran comme que celui qui va suivre en image (en anglais, désolé).
Repérez l'action rapide "Créer une tâche" (attention, pas la version "basique") dans le menu de droite et cliquez dessus.
On se retrouve dans un nouveau plan de hacker avec plusieurs onglets.
Depuis l'onglet "General", sélectionner l'option "lancer ce truc même si l'utilisateur n'est pas connecté" et la case à cocher juste en dessous qui indique de ne pas stoquer le mot de passe dans la tâche planifiée.
Vous devez aussi donner un nom à votre tâche, c'est le premier champ de la fenêtre.
Le second onglet qui s'appelle Trigger en anglais (déclencheur en Français?) va nous permettre de créer une ou plusieurs conditions pour le lancement du script.
Je vous laisse découvrir et choisir ça vous mêmes, je pense que c'est assez clair.
Le troisième onglet concerne les "Actions", c'est là qu'on doit caser le script Run.ps1 que l'on vient de créer.
Cliquez pour créer une nouvelle action et choisissez "Lancer un programme".
Dans le champ Programme/script, entrer la valeur "powershell".
Dans le champ des arguments qui suit, ajouter:
-File “D:\scripts\Python\bluesky-crossposter\Run.ps1”
Où vous devrez remplacer D:\scripts\Python\bluesky-crossposter par le chemin complet du projet sur votre ordinateur.
Gardez ce chemin dans le presse papier parce qu'il s'agit de l'insérer aussi dans le dernier champ texte, "Start in" en anglais ("Démarrer dans"?). Dans mon cas c'est:
D:\scripts\Python\bluesky-crossposter
Je pose une capture d'écran mais je suis pas sûr que ça aide beaucoup parce que les champs texte sont minuscules:
Une fois la tâche créée vous pouvez aussi la lancer sur demande avec un clic droit puis "Démarrer la tâche".
Il faudra juste vérifier de temps en temps que ça fonctionne toujours parce que je ne peux pas vous le garantir, dieu sait ce qu'il peut se passer avec l'API Twitter qui devient de plus en plus payante et celle de Bluesky qui pourrait changer ou un gag avec l'une ou l'autre librairie Python.
Méthode avec Docker
Je sais pas trop comment se comporte la version Windows ou Mac de Docker de nos jours, fut un temps ou c'était pas terrible donc je vous présente comment ça se passe sous Linux qui est l'habitat naturel de Docker.
Notez qu'il n'est pas nécessaire d'installer localement Python, il sera présent dans le container.
Je propose de se fixer le prérequis d'avoir docker-compose. Sur les versions récentes de Docker, il est inclus et accessible via docker compose (c'est la même mais sans le tiret).
Sur de plus anciennes versions il faut manuellement installer un paquet qui doit s'appeler docker-compose, en toute logique.
Ils fournissent un Dockerfile, et un fichier docker-compose.yml qui déploie en fait un mono-container (celui construit par le Dockerfile).
Comme je le comprends, la seule raison d'utiliser docker-compose c'est de bénéficier de son intégration automatique du fichier .env. On pourrait se passer de docker-compose et utiliser le Dockerfile en configurant tout dans les fichiers directement — Je ne m'attarde pas là dessus et suppose que vous avez compose de dispo.
Dans le répertoire du projet, vous devriez voir un fichier env.example avec tout un tas de variables d'environnement qui représentent à peu près toutes les options à remplir dans auth.py et settings.py.
De plus, .env est dans le .gitignore, ce qui réduit les risque d'envoyer tous nos secrets quelque part sur les Internets.
Il s'agit donc de copier env.example en tant qu'un nouveau fichier nommé .env (le "." devant est important, je précise au cas où) et remplir les valeurs qui vont bien (j'ai juste copié les lignes à modifier):
BSKY_HANDLE=votrenombluesky.bsky.social
BSKY_PASSWORD="votre clé bluesky créée précédemment"
TWITTER_APP_KEY="CLE APP TWITTER"
TWITTER_APP_SECRET="SECRET APP TWITTER"
TWITTER_ACCESS_TOKEN="TOKEN OAUTH TWITTER"
TWITTER_ACCESS_TOKEN_SECRET="SECRET TOKEN OAUTH TWITTER"
TWITTER_CROSSPOSTING=true
MASTODON_CROSSPOSTING=false
Notez bien que BSKY_PASSWORD n'est pas votre vrai mot de passe Bluesky, c'est la clé qui a été générée auparavant dans les paramètres de votre compte.
Si vous comptez laisser tourner ce container en arrière plan sur votre machine ou un serveur, vous pouvez utiliser la variable RUN_INTERVAL qui est aussi dans le .env et lui donner une valeur en secondes. Le script se lance alors toutes les X secondes (pourvu que le container ne soit pas arrêté).
La valeur par défaut est de 3600 secondes.
Une fois le fichier .env prêt, il suffit de lancer:
docker compose up
Dans le répertoire du projet.
Vous pouvez aussi ajouter l'option "-d" pour que le service continue de tourner en arrière plan:
docker compose -d up
Puis ben je vous fait pas un cours de docker compose, vous pouvez toujours RTFM.
Le container est totalement jetable, un répertoire local (dbhost) est monté pour enregistrer la DB. Constatez que si vous utilisez le script sans Docker, la DB ne sera pas enregistrée dans dbhost, mais je conseille pas de mixer les deux techniques.
Note pour ceux qui ont suivi le tuto pour Windows: il ne faut pas toucher au fichier paths.py avec la méthode Docker. Si vous l'avez modifié, replacez le fichier original du projet. En fait il faut laisser tous les fichiers tels quels, on fait tout avec le .env.
Méthode locale sous Linux ou Mac
Python doit être installé en local sur votre machine. C'est déjà le cas sur les distribution Linux modernes mais pas sur Mac.
Sinon, on va procéder un peu comme dans la procédure pour Windows mais pas avec Powershell, quoi.
Tant qu'on y est, on pourrait épicer un peu l'affaire en utilisant tout de même le fichier .env plutôt que d'éditer auth.py et settings.py parce qu'on peut exporter toutes les variables du fichier .env avec une chtitle ligne de bash (ou zsh ou un autre copain).
En soi, c'est possible de charger les variables du .env en Powershell sous Windows aussi. Il m'a juste semblé que c'était un peu beaucoup pour des débutants potentiels.
Premièrement, copions le fichier env.example en tant .env. Il s'agit de modifier les mêmes variables que celles présentées dans la section ci-dessus sur Docker.
Avant de continuer il faut aussi modifier paths.py. C'est cette ligne qui doit être changée:
basePath = "/"
En:
basePath = ""
Note: Si vous voulez passer à Docker pour une raison ou une autre, il faudra remettre le "/" ou ça va pas le faire.
Ensuite, je propose de créer et activer un environnement virtuel avec Python histoire d'éviter les gags d'une installation globale des dépendances (qui de toutes manières ne fonctionne pas du tout sur ma machine).
Je le mets dans le répertoire dbhost parce qu'il est dans le .gitignore mais vous pouvez le mettre à votre endroit habituel s'il en existe un pour le Python (j'ai écrit du Python deux fois dans ma vie).
Toujours depuis le répertoire du projet:
mkdir -p dbhost
python -m venv dbhost/venv
source dbhost/venv/bin/activate
Vous pouvez vérifier que ça a fonctionné avec la commande type, le binaire python ne devrait plus être /usr/bin/python mais sa version locale au venv:
# type python
python is /home/william/Projects/bluesky-crossposter/dbhost/venv/bin/python
Tant qu'on y est, ne pas oublier d'installer les dépendances, au moins une fois:
pip install -r requirements.txt
Reste plus qu'à exécuter le script, en exportant d'abord tout ce qui est dans le .env en variables d'environnement:
set -o allexport && source .env && set +o allexport
python crosspost.py
Et ça devrait fonctionner.
Notez que tous vos secrets Twitter se retrouvent en mémoire et accessibles dans la session de terminal en cours — Ne gardez pas cette session ouverte pour toujours.
J'avais présenté un plan de tâche planifiée sous Windows, vous pouvez créer quelque chose de similaire sous Mac ou Linux en utilisant cron.
Si vous laissez ce script tourner tout le temps, vous pouvez ajuster RUN_INTERVAL en secondes et surtout aller jeter un coup d'oeil au fichier logs de temps en temps où à la sortie d'erreur cron ou les logs Docker ou autres histoire de vérifier que ça fonctionne toujours parce que j'ai moyen confiance.
On se follow ou quoi?
Retrouvez-moi sur Bluesky ici: https://bsky.app/profile/dkvz.bsky.social
Joyeuses fêtes et bonjour au chat.






























Commentaires
Il faut JavaScript activé pour écrire des commentaires ici
#1