«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.
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 :
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 :
Afin de réaliser ce projet, nous avons utilisé le langage de programmation R pour lequel il existe une librairie («twitteR») 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 :
- Utiliser ou mettre en place un serveur afin que le script puisse être lancé automatiquement.
- Utiliser la commande Rscript qui permet de lancer un script R depuis le terminal.
- 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 !
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 🙂
Merci Martin pour ce commentaire !
Le compte @TeletextCH n’a pas pour but de copier les services de «breaking news» habituels, cela serait redondant. L’indexation n’a d’ailleurs aucun intérêt pour nous. Ici, l’information apparaît dans la timeline comme un message push sur le haut de l’écran de téléphone. C’est aussi simple que cela. On retrouve la simplicité et la convivialité du Teletext sur l’écran de l’ordinateur et du téléphone.
Au passage, sur mon smartphone les images se sont toujours très bien affichées ^^ Et dès maintenant, cela devrait être résolu pour tous les modèles (mais probablement pas pour Tweetdeck, toujours coincé deux ans en arrière).
Ce compte n’a pas cette vocation malade à attirer des followers en masse, mais propose tout simplement un service, et manifestement il y a des amateurs qui arrivent à différencier le contenu des images 😉
Pour les titres, je pense que ce ne serait pas compliqué de faire une reconnaissance optique de caractères, par exemple avec abbyyR ou en apprenant les formes exactes des lettres, mais cela alourdirait alors les tweets en dupliquant du texte déjà contenu dans l’image.
Concernant ta dernière remarque, c’est au contraire un problème de plus puisque j’ai dû aller mettre à jour le code…
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.
Je ne vois pas de contradiction entre un «service de news» et notre projet 🙂
C’est en effet dommage de ne pas avoir accès directement au texte du Teletext, pour les news mais aussi pour les résultats sportifs (pages 200+ et 300+). Mais si nécessaire, ce devrait être facile à décrypter.