Faire des trucs #1 : Générer des images grâce à du texte et les tweeter

Julien
Get news

Julien

Ingénieur de production
Backpacker quand la prod n'est pas down.
Curieux de nature, j'aime bien "faire des trucs" tech-related avec mes amis.
Si tu m'embêtes je t'automatise en Bash.
Julien
Get news

Il y a quelques jours, entre deux rush de fin de projet, j’ai eu une idée assez simple : écrire un programme qui tweete des images générées.

Voici le git du projet : KnowledgeIsChicken

Le concept des images est simple une phrase de 3 mots (Knowledge is Power, I love Chicken, …).

Vous pouvez retrouver le profil twitter ici.

celebrateyourvictories

dontwearmakeup

Mais celles-ci ne sont pas les images qu’on va tweeter. L’idée est de couper verticalement ces images en 3 parties puis de les reconstituer aléatoirement.

L’aléatoire nous permet d’obtenir des phrases amusantes. Une des premières images générée était « Knowledge is Chicken », le projet avait un nom ! Le concept peut être resumé comme ceci : We have 3-words-sentences. We mix them and we tweet them with nice colors. 🙂 

listenthinkjust
believethespeak

Vous êtes intéressé par le principe ? Comment générer des images avec du texte ? Comment tweeter automatiquement des images ? Je vais tout vous expliquer !

J’utilise plusieurs outils pour faire tourner ce petit principe : bash, python, imagemagick, tweepy et cron ! Le tout sur un serveur Debian 8.

D’abord j’ai un script qui génère des images avec du texte. J’ai un fichier avec une centaine de phrases de 3 mots, une liste de (jolies) couleurs en Hexadécimal et une liste de polices. Pour générer une image, on va « piocher » un élément aléatoirement dans chaque fichier : une phrase, une couleur, une police.

Pour piocher j’utilise shuf, par exemple pour avoir une phrase aléatoire je fais :

text=`shuf -n 1 phrases`

Ma variable text contient maintenant une phrase de mon fichier phrases. Le concept est le même pour la couleur et la police.

Ensuite j’utilise convert (fourni avec imagemagick). La commande pour créer une image est celle là.

convert -size 900×300 -background « #$random_back » -fill « #$text_color » -font « $font » -pointsize 41 -gravity center label:$text.jpg

Les paramètres de la commande parlent d’eux même, size pour la taille de l’image, background pour la couleur de fond de l’image (si vous voulez utiliser un code hexadécimal comme moi, il faut ajouter le #, idem pour la couleur du texte), fill pour la couleur du texte, pointsize pour la taille de la police, gravity pour le placement et enfin label pour le nom du fichier !

Désormais, on a généré une image. Il suffit de faire des boucles pour générer assez d’images pour travailler.

Ensuite, j’ai un script bash qui va découper nos images en 3 images contenant 1 mot chacune. La aussi on utilise convert. Afin de couper au mieux l’image en 3 parties égales, j’utilise la commande identify -format. La variable picture contient le nom de l’image.

width=`identify -format « %w » $picture`
height=`identify -format « %h » $picture`
width_crop=`echo $((width / 3))`

On récupère alors les dimensions de l’image et on peut travailler avec. La variable width_crop contient  la largeur de notre image.

convert « $picture » -crop « $width_crop »x »$height » « $picture »

Le nom des images créées va être du type : nom_photo-0, nom_photo-1, …

À ce stade, on a nos images coupées. Personnelement, je range les photos dans différents dossiers en fonction de leur place (1ère partie dans un dossier « First », 2ème partie dans un dossier « Second » … ). Comme la première image aura comme nom nom_photo-0, vous pouvez ranger facilement.

Mais pourquoi on rangerait les images ?

Parce que ça va être plus simple pour réassembler ! Pour ça, j’ai un dernier script bash. Celui-ci utilise  convert +append (encore imagemagick !). J’utilise encore shuf pour piocher une image au hasard dans les dossiers First, Second et Third. Ensuite avec convert +append j’assemble le tout et on a une image drôle !

convert +append ../First/$f_part ../Second/$s_part ../Third/$t_part ../Result/$name.jpg

Cette commande va placer les images côte à côte et enregistrera le résultat.

Maintenant qu’on a nos images, on veut les tweeter !

Voici le code que j’ai écrit.
import subprocess
import os
import sys
import tweepy
import glob
import re
consumer_key = 'CONSUMER KEY'
consumer_secret = 'CONSUMER SECRET'
access_token = 'ACCESS TOKEN'
access_token_secret = 'ACCESS TOKEN SECRET'
### Twitter auth
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
picture_dir = '/path/to/file/Result'
picture = max(glob.iglob(picture_dir+'*.jpg'))
name = picture.split("/Result")[1]
name = name.split(".")[0]
status=""
api.update_with_media(picture, status="%s" % (status))

Vous pouvez utiliser ce code mais il vous faudra utiliser vos identifiants de l’API twitter. Si vous ne savez pas comment faire je vous invite à regarder cet article. Il faudra aussi changer la variable picture_dir en indiquant le chemin vers les images. Enfin, si vos images ne sont pas en jpg, il faudra modifier la variable picture. Enfin, la variable status sera le texte de votre tweet !

La dernière instruction, api.update_with_media(picture, status= »%s » % (status)), tweete l’image avec le texte.

Bravo vous avez tweeté une image que vous avez généré sans aller sur Twitter !

Maintenant, pour automatiser le procéssus vous pouvez utiliser Cron. Personnelement je tweete chaque heure une nouvelle image. Extrait de mon /etc/crontab :

0  *    * * *   gin python /path/to/script/KnowledgeIsChicken.py

Voila, j’espère que le concept vous a amusé. Dites moi si ça vous a inspiré ou si vous voulez davantage d’information. 🙂

N’oubliez pas de follow le compte Twitter ! 🙂


Références :

  1. Imagemagick :  imagemagick
  2. Utiliser l’API Twitter : naelshiab
  3. Tweepy : tweepy
  4. Crontab : cron
  5. Github : KnowledgeIsChicken
_______________________
Sharing is caring😜
Share on FacebookTweet about this on TwitterShare on LinkedIn


Comments