Créer un Twitterbot avec R : le Teletext suisse sur Twitter

«C’est comme si on arrivait à enfiler un vinyle dans un lecteur MP3
[Nicolae Schiau]

Dans ce billet de blog, nous décrivons le processus de réalisation d’un Twitterbot avec R. Le code est disponible ici.

If you do not read French but are just interested by how to code a Twitterbot with R, you can find the code here.

txtscreenshot
Une page du Teletext telle qu’elle apparaît une fois postée par @TeletextCH sur Twitter.

Hackathon SSR

Étant des amateurs inconditionnels du Teletext suisse, Adrien Schnarrenberger et moi-même avons décidé de réaliser un Twitterbot postant les «breaking news» de ce média mythique lors du premier hackathon de la SSR [dead link], les 20 et 21 novembre 2015. Le résultat se trouve ici :

@TeletextCH

Le principe est simple : le Teletext est disponible via une interface web où chaque écran est disponible sous forme d’image au format GIF. En particulier, la dernière page de nouvelles mise à jour (rubriques «Suisse», «Étranger» ou «Sport») s’affiche à la page 103 du Teletext jusqu’à ce qu’elle soit remplacée par une nouvelle news.

Dans la minute, notre (ro)bot récupère cette page et la poste sur Twitter. De par le mode de fonctionnement très rapide du Teletext suisse, ce procédé permet de rivaliser en vitesse avec les «breaking news» de la plupart des médias suisses.

Voici la présentation que nous avons faite de @TeletextCH, filmée par la RTS :

twitteR

Afin de réaliser ce projet, nous avons utilisé le langage de programmation R pour lequel il existe une librairietwitteR») permettant de passer des requêtes à l’API de Twitter. Cette librairie permet de récupérer des tweets et d’en poster en utilisant du code écrit en R. Elle permet donc d’utiliser les autres outils et librairies fournis par ce langage.

Le reste de ce billet explique le fonctionnement du bot. Le code qui tourne derrière est disponible librement ici.

Notre robot Twitter, @TeletextCH

Tout d’abord, nous initialisons le robot en téléchargeant l’image de la page 103 et sa date de création. Une fois ceci effectué, ne pas oublier de remettre les lignes en commentaire. Le script va être relancé chaque minute ou chaque deux minutes, donc il est nécessaire d’avoir un point de départ pour vérifier ensuite si la page a été mise à jour. Nous décrivons plus tard comment automatiser le lancement du script à intervalle régulier.

La commande GET de la libraire httr nous donne tout d’abord l’heure et la date de la dernière mise à jour de l’image. Puis, nous contrôlons si celle-ci a été actualisée depuis le dernier lancement du script. Si ce n’est pas le cas, le script s’arrête, avant d’être relancé une ou deux minutes plus tard. Dans l’intervalle, rien n’a été enregistré.

Si ça n’est pas le cas (crea.old est différent de crea.new), alors on exécute ce qui suit entre les accolades.

S’authentifier

Avant de lancer le script, nous avons ouvert un nouveau compte sur Twitter. Attention (1) : il est nécessaire de donner son numéro de téléphone. Attention (2) : en donnant votre numéro de téléphone, les personnes qui l’ont dans leur répertoire seront averties qu’un de leurs contacts s’est créé un nouveau compte Twitter.

Une fois le compte créé, il faut se rendre sur la page apps.twitter.com tout en restant connecté. Là, créer une nouvelle app, remplir les informations requises et utiliser la valeur de callback glissée en commentaire (source). Puis se rendre sous l’onglet “keys and access tokens” et générer un access token et un token secret. On les recopie dans le script, ainsi que les consumer key et consumer secret, et elle est belle !

Si l’authentification a fonctionné, lorsqu’on le lance, le script doit donner :

[1] Using direct authentication

Télécharger et convertir l’image

Ensuite, on télécharge l’image. À ce stade, il y a un léger tracas : Twitter optimise un tweet dont l’image est à peu près deux fois plus large que haute, tandis que le GIF que nous avons téléchargé est au format 640 pixels x 460 pixels. Il est facile d’ajouter des bandes noires à gauche et à droite de l’image originale. Pour cela,Afin de supprimer la bande publicitaire au bas de l’écran, nous avons besoin de convertir l’image de GIF à PNG en passant par le terminal et ImageMagick. Attention : il est possible qu’en appelant une application dans le terminal depuis R, celle-ci ne se lance pas. Dans la version du script qui tourne derrière @TeletextCH, ce problème a été résolu en recopiant le PATH devant la fonction convert.

Modification mineure ou nouvelle image ?

À ce stade, deux cas de figure : soit l’image est celle d’une page préalablement postée moyennant une modification mineure, soit il s’agit d’une nouvelle. Pour tester si nous sommes dans le premier cas, on compare l’image à une image antérieure (la première fois, se servir dans les images disponibles dans le dossier sur GitHub). S’il y a en effet eu modifications ET que celles-ci concernent moins de 3% des pixels, alors on supprime la dernière image postée. C’est un hack un peu radical, mais qui fonctionne le plus souvent.

Poster et sauver

Finalement, quel que soit le résultat à l’étape précédente, on sauve et poste l’image qui nous a occupés jusqu’ici, élargies de ses deux magnifiques bandes noires.

Automatiser

Le script fonctionne lorsqu’on le lance depuis R. C’est sympa, mais peu pratique, car nous aimerions qu’il se lance régulièrement et automatiquement.

Pour résoudre ce problème, la solution que nous avons choisie se décompose en trois parties :

  1. Utiliser ou mettre en place un serveur afin que le script puisse être lancé automatiquement.
  2. Utiliser la commande Rscript qui permet de lancer un script R depuis le terminal.
  3. Mettre en place un job dans cron, par exemple toutes les deux minutes entre 6h et minuit.

Conclusion

Au moment d’écrire ce billet de blog, notre robot tourne depuis quinze jours et a posté 779 pages 103 du Teletext suisse((La version RTSun.)), soit plus de cinquante par jour. Il en a loupées quelques-unes au dans la période de lancement, et quelques-unes entre 6h et 9h le jour de l’introduction de la nouvelle numérotation du Teletext((Avant le 2 décembre 2015, la page 104 jouait le rôle de l’actuelle page 103.)). Depuis, les erreurs sont rares.

Satisfaite de son boulot, notre équipe a songé à d’autres Twitterbots, des sérieux comme des débiles, qu’elle n’attend que de pouvoir implémenter.

N’hésitez pas à emprunter des parties de notre script et à implémenter les vôtres, ou à nous faire des suggestions !

Remerciements

  • À nos plus de cent followers, et en particulier à Nicolae Schiau et Magali Philip qui ont aidé à faire connaître ce compte.
  • À Sarah Dégallier Rochat 💕 pour la mise en place du serveur.
  • À la SSR et la RTS pour l’excellente organisation et l’accueil chaleureux au 16e étage de leur bâtiment !
Subscribe
Notify of
guest

4 Comments
Inline Feedbacks
View all comments
Martin Grandjean
9 years ago

Bravo pour ce projet !
En tant qu’utilisateur de Twitter, je ne vois pas vraiment l’intérêt de ne publier qu’un screenshot du Teletext, qui sera nécessairement illisible sur mobile ou Tweetdeck sans un clic sur l’image, sans parler de l’indexation nulle dans le moteur de recherche de Twitter, l’absence de hashtag, la difficulté à remonter son fil avec des dizaines d’images qui se ressemblent énormément, etc.
Est-ce que ce serait compliqué de faire figurer le titre de la page dans le tweet en plein texte ?
Au fait, il semble que depuis aujourd’hui Twitter ne redimensionne plus les images, un problème de moins pour @TeletextCH 🙂

Martin Grandjean
9 years ago
Reply to  Yannick Rochat

Ah oui, c’est juste une question de calibrage du public-cible. Je m’étais laissé emporter par tes expressions “réaliser un Twitterbot postant les «breaking news» de ce média mythique” ou “rivaliser en vitesse avec les «breaking news» de la plupart des médias suisses” qui préfiguraient un service de news et moins une oeuvre d’art à destination des aficionados.
Et c’est vrai que je n’avais pas réalisé que teletext.ch n’offre que des images et pas du plein texte, et que ce serait effectivement dommage de devoir passer par “webtext” pour le texte brut, en perdant l’affichage original tellement sympathique.