Vous avez un Raspberry Pi ou une machine sous Linux très souvent allumée ? Vous souhaitez la faire parler automatiquement sur Twitter en transmettant diverses informations ? Découvrez le script TweetBoxBot et son utilisation !

L'idée m'est venue après avoir consulté cet article rédigé par Angristan. J'ai beaucoup aimé l'idée de base (celle de faire parler un Raspberry Pi sur Twitter) mais les scripts ne me convenaient pas vraiment.

J'ai donc entrepris une p'tite réflexion et j'ai commencé le script en Python. Pourquoi Python ? Moi qui suit habitué au Bash, je commence à utiliser un peu plus le Python que je trouve très agréable à manier !

Ah, pour en parler maintenant, il fallait trouver un nom, ce sera donc TweetBoxBot. C'est le nom du script et le nom sur Twitter (@TweetBoxBot).

Les différentes infos transmises

L'objectif principal du script est de transmettre des informations diverses et variées relatives à la machine (ou pas) à partir d'un Raspberry Pi 2 sur le réseau social Twitter via un compte dédié. Je dis Raspberry Pi car j'ai écrit le script pour mon RPI à la base mais il est en principe compatible avec une distrib classique (testé sur Debian).

Plusieurs types d'informations sont récupérées et transmises sur Twitter, les voici en détails.

Uptime

Cette fonction est assez simple, elle lit la valeur retournée par la commande cat /proc/uptime. Les secondes sont ensuite converties sous une forme plus lisible.

Valeur retournée :

I'm up since 7 days, 12 hours, 27 minutes, 1 second

Charge CPU

La charge CPU (ou Load Average) de la dernière minute, des 5 dernières et enfin des 15 dernières est récupérée en parsant le /proc/cpuinfo.

Valeur retournée :

CPU Load :
Since 1 minute: 2%
Since 5 minutes: 5%
Since 15 minutes: 10%

Fréquence CPU

La fréquence du processeur est visible dans le fichier /proc/cpuinfo. Pour le Raspberry Pi, je récupère la fréquence courante.

Valeur retournée :

Current CPU frequency: 900 MHz

Température CPU

Sur un Raspberry Pi, la température CPU est assez simple à récupérer. En revanche, sur une machine classique, il vous faudra le paquet lm-sensors.

Valeur retournée :

Current CPU temperature: 37.83 °C

Charge mémoire

La mémoire utilisée est transmise par le script :

I have 456 MB free RAM of 728 MB

Kernel

Le kernel est récupéré de manière assez simple avec la commande uname -r.

Valeur retournée :

My #kernel is xx.xx.xx

Speedtest

Pour cette fonction, vous devez avoir le paquet speedtest-cli d'installé. Si vous êtes sur Debian, faites un simple apt-get install speedtest-cli. Si vous êtes sur un Raspberry Pi, le paquet n'est pas disponible. Installez d'abord le gestionnaire de paquets Python :

apt-get install python-pip

Puis, installez la version Python de speedtest-cli :

pip install speedtest-cli

Une fois l'installation terminée, faites un essai avec cette commande :

speedtest-cli --simple

La valeur retournée par le script TweetBoxBot est celle du retour de la commande précédente.

Ping

En complément du SpeedTest, le script propose de pinguer un host au hasard parmi ceux proposés (voir la variable PING_HOSTS en début de script).

Valeur retournée :

twitter.com: 37 ms

L'heure dans une ville du monde

TweetBoxBot retourne l'heure locale d'une capitale sélectionnée au hasard sous cette forme :

In Brussels (Belgium), it's 11:46 (2016-03-15)

Température d'une ville

TweetBoxBot récupère la liste des pays, en sélectionne un au hasard et récupère la température extérieure de sa capitale.

Valeur retournée :

It is 21°C to Paris (France)

GIF aléatoire

Le bonus du script : la récupération et l'affichage d'un GIF animé aléatoire provenant du site giphy.com.
Le script va faire un appel à l'API de giphy en recherchant un GIF aléatoire dans une catégorie parmi celles proposées en début de script via la variable GIF_CATEGORIES.

Valeur retournée :

Random GIF from @giphy {image}

Citation aléatoire de Chuck Norris

Pour un petit peu plus de fun, le script récupère une citation aléatoire de Chuck Norris à partir du site ICNDB.com.

Chuck Norris could use anything in java.util.* to kill you, including the javadocs.

Citation aléatoire de Ron Swanson

Ron Swanson est un personnage charismatique interprété par Nick Offerman dans la génialissime série TV Parks and Recreation. A l'aide du projet Ron Swanson Quotes, le script récupère une citation au hasard.

History began July 4th, 1776. Anything before that was a mistake.

Film populaire aléatoire

TweetBoxBot peut tweeter un titre de film aléatoire, récupéré via l'API de TheMovieDb.org. Le titre, l'URL pour accéder à la fiche du film ainsi qu'une image sont retournés.

The Martian themoviedb.org/movie/286217 @themoviedb {image}

Astronomy Picture Of the Day

L'APOD est une image diffusée par la NASA tous les jours. TweetBoxBot reprend cette image et sa légende.

NASA APOD of 2016-08-18 - Perseid Night at Yosemite @apod {image}

Installation de TweetBoxBot

Pré-requis

Vous devez avoir Python sur votre machine (normalement, c'est le cas par défaut).

Egalement, vous devez avoir un compte Twitter dédié (ou pas) aux envois des différents tweets du script.

Autres paquets

Comme vu dans les informations transmises, vous devez avoir le paquet speedtest-cli d'installé. Remontez un peu la page pour connaître la procédure pour l'installer.

Si vous n'êtes pas sur un Raspberry Pi, installez le paquet lm-sensors afin que le script puisse récupérer la température du CPU.

Twython

Pour communiquer avec Twitter à partir du script Python, j'utilise le paquet Twython. Installez-le avec :

pip install twython

Création de l'application Twitter

Pour pouvoir communiquer sur Twitter à partir du script, il faut créer une application Twitter. Rien de bien compliqué. Pour cela, rendez-vous sur https://apps.twitter.com/.

Cliquer sur le bouton "Create new app" et renseignez le nom et la description. Vous pouvez mettre ce que vous voulez dans le champ Website.

Ensuite, allez dans l'onglet "Permissions", modifiez l'accès pour qu'il soit sur "Read, Write and Access direct messages" :

Pour finir, rendez-vous dans l'onglet "Keys and Access Tokens" et cliquez sur le bouton en bas de page "Create my access token" pour créer les clés OAuth.

Gardez cette page ouverte, nous allons en avoir besoin plus tard.

Le script TweetBoxBot

Pour récupérer le script TweetBoxBot, téléchargez-le sur GitHub via le bouton "Download ZIP" à droite à partir de cette URL : https://github.com/shevabam/TweetBoxBot.
Si vous avez git sur votre machine, faites un git clone https://github.com/shevabam/TweetBoxBot.git du projet.

J'ai essayé de rendre le script assez simple. Chaque information transmise sur Twitter est une fonction. A la fin du script, je génère un chiffre aléatoire ayant pour maximum le nombre de fonctions disponibles. Ainsi, une fois le chiffre trouvé, le script lance la fonction correspondante et publie le contenu retourné sur Twitter !

Au début du script, vous devez modifier quelques variables qui contiennent les clés d'authentification pour votre application Twitter.

  • CONSUMER_KEY par votre Consumer Key (API Key)
  • CONSUMER_SECRET par votre Consumer Secret (API Secret)
  • ACCESS_TOKEN par votre Access Token
  • ACCESS_TOKEN_SECRET par votre Access Token Secret

Ensuite, vous avez aussi quelques variables que vous pouvez personnaliser :

  • GIF_CATEGORIES : contient les mots-clés de recherche pour un GIF aléatoire sur giphy.com
  • TMP_FILE : est le nom du fichier récupéré via l'API de Giphy ou de l'API de themoviedb.org (supprimé une fois le tweet envoyé)
  • OWM_APIKEY : clé de l'API openweathermap.org. C'est ma clé, mais vous pouvez la laisser
  • TMDB_APIKEY : clé de l'API themoviedb.org
  • PING_HOSTS : tableau contenant les hosts à pinguer, de manière aléatoire
  • TWITTER_SUFFIX : le contenu de cette variable sera ajouté au tweet final
  • DEBUG : passez cette variable à True pour activer le log
  • DEBUG_FILE : fichier utilisé pour le log

Pour finir, rendez exécutable le script via un :

chmod u+x TweetBoxBot.py

Pour faire un essai, lancez simplement la commande suivante dans le répertoire du script :

./TweetBoxBot.py

Vous devriez avoir un tweet sur votre compte Twitter !

Par défaut, si vous lancez ./TweetBoxBot.py, le script choisira aléatoirement une fonction à exécuter.
Toutefois, vous pouvez exécuter une fonction en particulier, en passant en argument le nom de la fonction : ./TweetBoxBot.py uptime.

Voici les arguments disponibles :

  • uptime
  • cpu_load
  • cpu_freq
  • cpu_temp
  • mem_load
  • kernel
  • speedtest
  • ping
  • time_city
  • weather
  • gif
  • chuck_quote
  • ron_quote
  • movie
  • apod

Rendre les tweets automatiques

Pour que l'envoi des tweets soit automatisé, vous devez ajouter une tâche cron sur votre machine.

La difficulté était de rendre aléatoire l'horaire d'envoi des tweets. Pour ma part, j'ai choisi une plage d'envoi toutes les 1.5 et 11.5 heures, toutes les 12h (à 5h puis à 17h) par jour grâce à la tâche cron suivante :

0 5,17 * * * sleep $(( 100 +  $(od -vAn -N2 -tu4 /dev/urandom) \% 600 ))m ; /usr/bin/python /root/TweetBoxBot.py

Pour l'expliquer brièvement, toutes les 12 heures (à 5h puis à 17h), la tâche lance la commande sleep $((...))m. Cette dernière permet d'attendre un nombre aléatoire de minutes comprises entre 100 et 700, soit entre 1.5 et 11.5 heures !

Pour finir, après avoir attendu un délai aléatoire, la tâche lance le script TweetBoxBot.py qui lui-même lancera une fonction au hasard et tweetera le résultat !

Conclusion

Ecrire TweetBoxBot a été très sympa à faire ! J'aime le résultat obtenu et c'est donc naturellement que je vous ai proposé, via cet article, de l'installer sur votre machine !
Certains diront que le résultat final est inutile et ne sert à rien mais moi, j'aime bien :)

Voici un exemple des données publiées sur Twitter, mais le plus simple est de vous rendre sur le compte Twitter dédié (@TweetBoxBot) :

Si vous avez des idées d'informations à transmettre sur Twitter, n'hésitez pas à m'en parler ou à forker le projet et à faire une pull-request !

Amusez-vous bien ;)