Créer un bot Twitter envoyant des images − le script

Objectif

Créer un bot Twitter qui envoie chaque jour une image, avec une légende et un lien hypertexte vers la source.

Contrainte

Nécessité d'une solution codée en PHP (plutôt qu'en Javascript ou Python, dont les scripts sont beaucoup plus répandus) pour pouvoir le déposer simplement sur une instance virtuelle d'un serveur web dédié (type Simple Hosting chez Gandi) basiquement configuré en PHP+MySQL.

Solution

Utiliser le script ready-to-use Picturebot.php de la suite Twitterbot créée par Mrbellek, sous licence GPL 2 et disponible sur Github.

C'est un script qui fonctionne remarquablement bien, sans bugs apparents et son auteur est très réactif. À ma demande, il a ajouté la fonctionnalité de récupération d'informations sur les images stockées dans un fichier JSON.

MIlle mercis à lui ! :-)

Mise en œuvre

Le script est plutôt bien documenté en lui-même, mis à part le script de commande qu'il est nécessaire de créer soi-même (sur la base des exemples founis).

Les étapes sont les suivantes :

1. télécharger l'archive, puis dans le dossier où se trouvent les scripts créer les fichiers suivants ;

2. créer un fichier 'credential.php' avec les clés et jetons Twitter que vous aurez créé pour l'occasion ;

3. créer un nouveau dossier 'pics' et le remplir des images à envoyer (attention : les noms de fichiers sont les identifiants d'accès aux informations sotckées dans le fichier JSON) ;

4. créer un fichier JSON pour stocker les informations de chaque image, nommé de la façon suivante '[username]-extra.json'.
Attention, c'est la partie la plus longue : il faut littéralement créer tous les tweets à venir. Son contenu sera structuré de la manière suivante :
{ "fichier01.jpg": { "description": "my wedding photo", "source": "https://www..." } }

5. créer un script de commande PHP appelant le script 'twitterbot.php', le fichier 'credential.php' et le fichier '[username]-extra.json'.
Attention c'est la partie la plus ardue pour qui n'est pas familier avec la programmation en PHP, je donne mon exemple ci-dessous.

6. lancer le script avec la commande : php mytwitterbot.php et en programmer l'exécution via CRON.

Exemple

Voici en guise d'exemple le contenu des trois fichiers indispensables au fonctionnement du script tels que je les ai configurés pour le bot #1day1legislature. Je les ai commentés pour plus de clarté.

'credentials.php'

<?php
// Définition des codes API Twitter
define('CONSUMER_KEY', 'xxxxxxxxxxxxxxxxxxx');
define('CONSUMER_SECRET', 'xxxxxxxxxxxxxxxxxxx');
define('ACCESS_TOKEN', 'xxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx');
define('ACCESS_TOKEN_SECRET', 'xxxxxxxxxxxxxxxxxxx');

'laspic-extra.json'

{
    "Afghan_01.jpg": {
        "country": "Afghan",
        "description": "Old Afghan parliament building",
        "source": "https://en.wikipedia.org/wiki/File:Afghan_parliament_in_2006.jpg"
         },
    "Afghan_02.png": {
        "country": "Afghan",
        "description": "The new building of the Afghan Parliament",
        "source": "https://commons.wikimedia.org/wiki/File:New_Afghan_Parliament_Building.png"
         },
     "Albania_01.jpg": {
        "country": "Albania",
        "description": "Kuvendi i Shqipërisë",
        "source": "https://en.wikipedia.org/wiki/Parliament_of_Albania#/media/File:Kuvendi_i_Shqip%C3%ABris%C3%AB.jpg"
         }
}

'mytwitterbot.php'

<?php
define('MYPATH', dirname(__FILE__));    # on précise dans quel répertoire on travail
require_once('credentials.php');    # chargement des identifiants Twitter personnels
require_once('picturebot.php');        # chargement du script du bot proprement dit

### Script de commande du bot
$oTwitterBot = new PictureBot(array(
    # on déclare le username qui va poster les tweets (associés aux identifiants)
   'sUsername'         => 'laspic',      
   # on déclare où se situent les photos
   'sPictureFolder' => MYPATH . '/pics',  
   # puis on déclare quels sera le contenu des tweets.
   'sTweetFormat'    => '#1day1legislature' . # un hashtag (pour la postérité)
                        chr(13) . chr(10) . chr(13) . chr(10) . #on saute une ligne
                        ':description (:country).' .  # la description de la photo
                        chr(13) . chr(10) . chr(13) . chr(10) . #on saute une ligne
                        '(source: :source)', # la source de l'image
));

### Lancement du bot !
$oTwitterBot->run();
?>

Notes sur le script de commande :

→ pour chaque image, le script va chercher dans le fichier JSON les informations correspondant au nom de fichier de la dite image.

→ pour appeler les informations associées à chaque fichier dans le fichier '[username]-extra.json', il suffit de le mentionner chaque champ en le faisant précéder du caractère « : ». Par exemple « :description » ou « :source » dans notre cas.

→ pour effecter des retours à la ligne dans le tweet cible, il faut insérer « . chr(13) . chr(10) . » dans la déclaration du format du tweet, à l'endroit souhaité (ou deux fois de suite pour un saut de ligne).

Exécution avec CRON

À ce stade, le script fonctionne lorsqu'il est lancé à la main, mais quelques réglages restent à faire pour son déclenchement automatique.

Exécution depuis un répertoire distinct

Lorsque le script est exécuté depuis un répertoire qui n'est pas celui où le fichier est situé, on s'aperçoit que l'exécution ne se fait pas. Je n'ai pas d'explication claire à ce sujet mais il semble que ce soit un problème lié à la déclaration relative des chemins d'accès aux différentes parties du script.

En tous les cas, la solution (trouvée ici) est d'ajouter en tête de script la ligne suivante :

chdir(dirname(__FILE__));

L'heure de déclenchement avec ANACRON

Chez Gandi, les instances Simple Hosting ne fonctionne pas avec CRON mais avec ANACRON qui ne permet pas de choisir d'heure (ou de plage horaire) de déclenchement. On ne peut que choisir une fréquence d'exécution (horaire, journalière, etc.) et le script s'exécutera alors à n'importe quel moment (en fonction de la disponibilité des ressources de l'hébergeur) tant que la condition est réuni. Ceci fait que si l'on choisit un déclenchement quotidien, les images soient postées en pleine nuit (heure française) ce qui n'est pas très heureux.

Pour contrer cela, l'astuce est de choisir un déclenchement toute les heures et d'ajouter au script une condition d'exécution à l'heure choisie.

Le script de commande final

Ces derniers ajouts donnent le script 'mytwitterbot.php' final suivant :

<?php

chdir(dirname(__FILE__));        # astuce pour le lancement via cron
define('MYPATH', dirname(__FILE__));    # on précise dans quel répertoire on travail

require_once('credentials.php');    # chargement des identifiants Twitter personnels
require_once('picturebot.php');        # chargement du script du bot proprement dit

### Script de commande du bot

$oTwitterBot = new PictureBot(array(
    # on déclare le username qui va poster les tweets (associés aux identifiants)
   'sUsername'         => 'laspic',

   # on déclare où se situent les photos
   'sPictureFolder' => MYPATH . '/pics',

   # puis on déclare quels sera le contenu des tweets.
   'sTweetFormat'    => '#1day1legislature' .  # un hashtag (pour la postérité)
                        chr(13) . chr(10) . chr(13) . chr(10) . #on saute une ligne
                        ':description (:country).' .  #la description de la photo
                        chr(13) . chr(10) . chr(13) . chr(10) . #on saute une ligne
                        '(source: :source)', #la source de l'image
));

### Lancement du bot !

$hour_exec = "11";         # on déclare l'heure à laquelle on veut voir le bot s'exécuter
$hour_now = date('H');  # on récupère l'heure en cours

if ($hour_now == $hour_exec) { # on vérifie si l'heure est venue
   $oTwitterBot->run();        # si oui, on lance le bot
}

?>

 

Et voilà !

Les commentaires sont fermés.