03 Mai 2016

Comment créer un Bot Twitter complet en PHP

Google+ Commentaires Newsletter

3 mai 2016 : Petite mise à jour du tutoriel, support pour le PHP7.0, nouvelles commandes pour l’installation de Oauth pour PHP (méthode 2).

 

Vous souhaitez créer un bot Twitter ou vous êtes tout simplement curieux sur les possibilités que ce type script peut offrir ? Ce tutoriel est fait pour vous ! Je vais vous détailler toutes les étapes pour mettre en place un robot Twitter : de la création d’une application sur le site dev.twitter.com à la partie développement PHP. Bien entendu j’ai choisi PHP qui est mon langage de prédilection mais il est possible de le faire en Python, Java, Ruby, C++ ou tout type de langage qui peut gérer du JSON et les connexions REST.

Quelle pourrait être l’utilité d’un Bot Twitter ? Et bien il peut exister plusieurs cas : Parfois l’utilisation pourra être commerciale, souvent même (ex : les comptes twitters qui vous répondent un lien, d’autres qui vont auto like/fav des tweets contenants certains mots clés, d’autres qui vont vous follower pour tenter d’être suivi à leur tour et vous envoyer un DM) et ça je ne vous le conseille pas, sauf si vous êtes très habille et que vous pouvez rendre service. Si votre bot est là pour faire bêtement du spam (des article de blog, des produits à vendre), pareil je ne vous le conseille pas.

Mais après il y a des tas de bots Twitter qui sont créés pour pleins d’autres cas :

Personnel 🔒
Vous souhaitez avoir un compte qui répertorie tous les tweets (RT ou Likes/Fav) qui comportent des mots clés qui peuvent vous intéresser, comme par exemple tous les tweets contenants les termes « cdi » + « développeur ».
Informatif / Ludique 📰
Un bot qui répond à certaines questions, comme @LeWikiBot dont le but est de renvoyer un lien Wikipédia si quelqu’un tweete « C’est qui/quoi … ? » correspond à une fiche wiki existante.

D’autre pour rappeler les dangers de diffuser des informations personnelles sur le web, comme @NeedADebitCard qui retweet tous les tweets contenant une photo de carte bancaire

Humoristique 😝
Un bot généralement simple qui vient vous répondre lorsqu’un mot clé que vous avez mis dans un tweet correspond +/- au thème du dernier. Je pense à @Le_Marsu qui vous répond HOUBA HOUBA à chaque tweet contenant « ou pas ».

@EnjoyTheFilm qui vous spoile la fin de certains films renseignés sur Twitter du genre « I’m going to watch Star Wars the force Awakens yessss » >> Pas si drôle pour l’auteur du tweet je le reconnais.

 

Pour faire fonctionner le bot, il faudra utiliser l’API 1.1 de Twitter, et OAuth (application only authentification) qui est l’un des protocoles de connexion les plus simple à mettre en place selon les configurations (il y avait aussi REST mais peu utile pour notre cas, plus d’infos dans la doc Twitter).

Sur le net, les services clé en main proposant de créer ses propres bots ne manquent pas, avec plus ou moins de fonctionnalités. Il existe en revanche des tutos comme celui ci qui vous permettra de créer des bots de toute pièce et aussi du coup les comprends et en avoir la maîtrise à 100% (c’est mieux non ?). Je vais essayer de faire le maximum pour vous créer un vrai BON bot, qui se lancera toutes les minutes et qui sera très très restrictif en plus d’éviter au maximum d’importuner les utilisateurs (blacklist, traitement d’un objet tweet pour en deviner sa nature [si tweet personnel ou commercial etc]). Il y a pleins de choses à connaître avant d’arriver à obtenir un super bot : précis, drôle ou qui peut répondre en fonction des interactions avec la réponse du « twittos ». Prenez conscience qu’après ce tuto il faudra encore bosser pas mal d’heures pour monter votre robot (en fonction de ses besoins), car au final ce n’est que de la procédure qui pourra être simple comme compliqué, presque le même principe que l’intelligence artificielle dans les jeux vidéos…

Reeeeaaaady ?

Sommaire

 

Pré-requis

Les quelques pré-requis qui diffèrent un peu de l’ancien tutoriel (et oui on peut changer)

  • Un serveur dédié ou ou virtuel sous Linux (pour le tutoriel j’utilise Debian)
  • PHP 5.2 minimum

 

Créer une application Twitter

Tout d’abord, il faut créer une application à l’aide de son compte Twitter (un compte vérifié à l’aide d’un numéro de téléphone mobile). Une fois loggé allez sur la page apps.twitter.com et cliquez sur « Create new app ».

twitterbot creation nouvelle application

Renseignez les champs obligatoires, indiquer un site web (ou votre site perso si votre bot ne sera pas lié à un site web). Pas besoin de remplir d’autres champs que les champs obligatoires.

twitterbot creer nouvelle app renseigner les informations

Une fois votre application créée, allez dans l’onglet « Permissions » afin de donner l’accès complet à votre application : Lecture, écriture et accès aux messages privées.

twitterbot activer les droits de lecture/écriture

Puis, dans l’onglet « Keys and Access Token » vous trouverez une clé API et API secret a récupérer. Vous devriez avoir un token d’accès à générer en dessous, générez-la et récupérez la clé Token et sa clé secret.

twitterbot récuper clé privée public et token accès

C’est tout. Votre application a été crée sur Twitter, vous pouvez y ajouter un avatar, ajouter une description détaillée si vous vous sentez mégalo, ça ne regarde que vous !

 

Installer l’extension OAuth pour PHP

Si vous avez déjà OAuth, vous pouvez passer cette étape. Il y a plusieurs façon d’installer OAuth. La première est la plus simple, mais si vous avez la version 7 de PHP vous devrez utiliser la méthode 2 (car à l’heure ou j’écris ce tuto, pas de librairie oauth dans les repo debian ou ubuntu). Selon votre configuration, l’une d’entre elle fonctionnera :

Méthode 1 :

1
sudo apt-get install php5-oauth

Activez Oauth en éditant php.ini (faites le à la fois pour la version FPM/CGI et CLI car vous allez utilisez OAuth avec PHP en ligne de commande une fois que vous lancerez la tâche CRON !)

1
sudo nano /etc/php5/cli/php.ini # et /etc/php5/fpm ou cgi/php.ini

Ajoutez dans la partie « extension= » de votre php.ini (en faisant une recherche Ctrl+W) la ligne suivante :

1
extension=oauth.so

Redémarrez Apache/Nginx ou PHP selon votre type d’installation ou serveur (note : en CLI, pas besoin de relancer PHP puisque PHP.ini est pris en compte à chaque nouveau processus PHP).

1
/etc/init.d/apache2 ou php5-fpm ou nginx restart

Méthode 2 :

En installant les paquets PECL et en incorporant l’extension OAuth à php.ini :

1
sudo apt-get install gcc make autoconf libc-dev pkg-config

Pour les versions 5.4, 5.5 et 5.6 de PHP :

1
sudo apt-get install php5-dev libpcre-dev

Pour PHP 7.0 :

1
sudo apt-get install php7.0-dev

Ensuite, installez Oauth via la commande PECL :

1
2
sudo apt-get install libcurl3-openssl-dev
pecl install oauth

Ajoutez dans la partie « extension= » de votre php.ini (en faisant une recherche Ctrl+W) la ligne suivante :

1
extension=oauth.so

Personnellement, j’ai du mettre ceci puisque j’ai installé PHP depuis les paquets non officiels debian : via dotweb :

1
extension=/usr/lib/php/extensions/no-debug-non-zts-20131226/oauth.so

Si vous êtes dans mon cas, allez vérifier ce que contient le dossier « /usr/lib/php/extensions/ » pour changer le chemin de l’extension si dessus :

1
ls -l /usr/lib/php/extensions/

Redémarrez Apache/Nginx ou PHP selon votre type d’installation ou serveur (note : en CLI, pas besoin de relancer PHP puisque PHP.ini est pris en compte à chaque nouveau processus PHP).

1
/etc/init.d/apache2 ou php5-fpm ou nginx restart

 

Première Class TwitterBot et test de connexion vers l’API Twitter

Maintenant que nous avons les accès et installé OAuth, nous allons créer un premier fichier PHP que l’on appellera directement (en console ou par navigateur).

Créez le fichier tweet.php :


1
<!--?php date_default_timezone_set('GMT'); require('TwitterBot.php'); header('Content-Type: text/html; charset=utf-8'); $twitter = new TwitterBot('<Consumer_key>', '<Consumer_secret>'); $twitter->setToken('<Access_token>', '<Access_token_secret>'); $twitter->test(); ?-->

Ensuite créez le fichier TwitterBot.php ou nous allons y tester la connexion et créer notre première fonction de test « Hello World » :


1
<!--?php class TwitterBot{ protected $url_update = 'https://api.twitter.com/1.1/statuses/update.json'; private $oauth; public function __construct($key, $secret){ $this->oauth = new OAuth($key, $secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI); $this->oauth->disableSSLChecks(); } public function setToken($token, $secret){ $this->oauth->setToken($token, $secret); } public function test(){ $array = array( 'status' => 'Hello World !' ); $this->oauth->fetch($this->url_update, $array, OAUTH_HTTP_METHOD_POST); } } ?-->

Dès à présent, vous pouvez tester l’exécution de tweet.php (si vous avez renseigné vos accès dessus…). Si vous lancer le fichier depuis une console, pensez à rajouter ceci dans tweet.php juste avant <?php :


1
#!/usr/bin/php

Si vous n’avez aucune erreur, c’est que tout à fonctionné. Allez sur votre compte twitter, vous devriez voir votre nouveau status :). Félicitation ^^ ! Vous êtes prêt pour la suite ?

 

Création des fonctions de base du Bot

Nous allons remplir la class TwitterBot() avec de nouvelles fonctions. Pour que vous compreniez mieux, on va partir du principe que l’on souhaite rechercher les nouveaux tweets qui font mention à certains mots clés. Une fois récupéré, on va tout simplement leur répondre !

Pour illustrer ce tutoriel, nous serons le bot DogBot. Ce Bot répondra « Woof Woof » (je sais c’est ridicule mais il fallait bien trouver un exemple rapidement ^^) à chaque fois qu’un twittos écrit « c’est ouf » dans un tweet… En gros je vais plus ou moins reproduire ce que fait le compte @Le_Marsu (qui répond « Houba Houba » à chaque tweet contenant « ou pas ») ^^.

twitterbot-demo-recherche

Vous noterez que j’ai recherché le terme « c’est ouf » avec les guillemets, car on souhaite avoir « c’est » + « ouf » ensemble dans le même ordre (sinon on récupère les tweets contenant ces mêmes termes dans tous les sens…). Les mots clés peuvent être plus poussés, à la manière des expressions régulières. Par exemple « -love » pour ne pas afficher de résultat contenant le mot « love, « love OR hate » pour tout ce qui contient soit soit « love », soit « hate » soit les 2 etc… Vous trouverez toute la liste dans la doc de l’API ici.

 

1. Création du/des termes de recherche

Dans la class TwitterBot, ajoutez en haut 3 nouvelles variables :


1
2
3
4
5
6
class TwitterBot{
    protected $url_update = 'https://api.twitter.com/1.1/statuses/update.json';

    private $replies = array();
    private $oauth;
    private $screenName;

Puis à la fin de la classe, ajoutez la fonction d’ajout de termes de recherche et la fonction run() que j’expliquerai après :


1
2
3
4
5
6
7
public function addReply($terms,$regex,$type){
    $this->replies[] = array('terms' => $terms,'regex' => $regex,'type' => $type);
};

public function run(){
    //
}

Dans le fichier tweet.php, commentez la fonction de test() et ajouter les 2 nouvelles fonction à exécuter. addReply() contiendra le terme de recherche à envoyer vers Twitter (et sa variante regexp dans le cas ou on désire récupérer des termes dans le tweet).


1
2
3
4
5
//$twitter->test();

$twitter->addReply(array('%22c%27est ouf%22 -RT'),'~c'est ouf (.*)~i','dogbot');

$twitter->run();

Dans addReply(), plusieurs choses sont à comprendre :

  • Le premier terme de recherche sera les mots clés envoyé vers Twitter. Ils sont encodés en ASCII comme les urls : les guillemets deviennent donc des %22n l’apostrophe %27 etc… (plus d’infos ou convertisseur). Notez que les espaces peuvent rester des espaces.
  • Toujours dans le premier paramètre, j’ai rajouté « -RT », vous verrez que c’est bien utile, car dans les résultats s’afficheront tous les RT (Retweets, les partages quoi) et vous trouverez donc des doublons inutiles puisque vous allez répondre à toutes personnes qui ont RT alors qu’elles ne sont pas les auteurs (sauf si vous le souhaitez vraiment).
  • Le second paramètre est une expression régulière. Il s’agira dans les résultats de récupérer après « c’est ouf » un mot (plus long que les autres) ou une phrase que l’on pourra analyser (et vous ferez ce que vous voulez avec ^^). Par exemple le tweet suivant « Hé mais c’est ouf mec ce tuto ! », la regexp va récupérer « mec ce tuto », si je souhaite le plus long mot j’obtiens « tuto », et si je veux le rajouter à la réponse du bot, j’aurai « Woof Woof Tuto ! »…
  • Le dernier paramètre, tout simplement le nom de votre paramètre, histoire de le différencier dans la class si vous faisez plusieurs mots clés et que vous proposez des réponses différentes…

Vous aurez compris qu’en codant en objet, les possibilités sont multiples, ici vous pourrez par exemple ajouter autant de terme de recherche que possible, et côté Class vous pourrez ajouter autant de fonctions à appeler que souhaité.

 

2. Récupération de la liste des derniers tweets

Pour récupérer les derniers tweets, nous allons d’abord créer un petit fichier pour stocker l’id du tout dernier tweet, ce qui nous permettra ensuite de charger uniquement les nouveaux tweets depuis cet id (pour nous éviter aussi les doublons, une seule réponse suffira ^^). Pour cela, nous allons ajouter un getter/setter dans la class TwitterBot :


1
2
3
4
5
6
7
8
9
10
11
public function getSinceId($file='since_id'){
    $since_id = @file_get_contents($file);
    if(!$since_id){
        $since_id = 0;
    }
    return $since_id;
}

public function setSinceId($max_id=null,$file='since_id'){
    file_put_contents($file, $max_id);
}

Créez un fichier vide since_id (avec les droits d’écriture adéquat, sinon 777).

Ensuite nous allons créer une fonction qui vérifiera si la connexion fonctionne, et récupérera l’username Twitter du bot :


1
2
3
4
5
6
7
8
9
10
private function verifyAccountWorks(){
    try{
        $this->oauth->fetch($this->url_verify, array(), OAUTH_HTTP_METHOD_GET);
        $response = json_decode($this->oauth->getLastResponse());
        $this->screenName = $response->screen_name;
        return true;
    }catch(Exception $ex){
        return false;
    }
}

On ajoute de nouvelles variables tout en haut de la class, juste en dessous de $url_update utilisé pour nos tests :


1
2
3
4
5
6
7
class TwitterBot{
    protected $url_update = 'https://api.twitter.com/1.1/statuses/update.json';
    protected $url_search = 'https://api.twitter.com/1.1/search/tweets.json?q=%s&result_type=recent&count=50&since_id=%s';
    protected $url_verify = 'https://api.twitter.com/1.1/account/verify_credentials.json';
    protected $url_token = 'https://twitter.com/oauth/request_token';
    protected $url_token_access = 'https://twitter.com/oauth/access_token';
    protected $url_auth = 'http://twitter.com/oauth/authorize';

Enfin on insère les appels de ses fonctions dans run(), et on effectue la récupération de la liste :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public function run(){
    //echo '========= ', date('Y-m-d g:i:s A'), ' - Started ========='."n
";
    $since_id = $this->getSinceId();

    $max_id = $since_id;

    if ($this->verifyAccountWorks()){
        /* For each request on tweet.php */
        foreach ($this->replies as $key => $t){
            /* find every tweet since last ID, or the maximum lasts tweets if no since_id */
            $this->oauth->fetch(sprintf($this->url_search, urlencode($t['terms'][0]), $since_id));
            $search = json_decode($this->oauth->getLastResponse());
            if($search){
                //echo 'Terms #'.$key.' : '.count($search->statuses).' found(s)'."
n
";
                /* Store the last max ID */
                if ($search->search_metadata->max_id_str > $max_id){
                    $max_id = $search->search_metadata->max_id_str;
                }

                $i = 0;
                foreach ($search->statuses as $tweet){
                    echo '<b><a style="
color: red;" href="https://twitter.com/'.$tweet->user->screen_name.'" target="_blank">@'.$tweet->user->screen_name.'</a> :</b> <a style="color: black; text-decoration: none;" href="https://twitter.com/'.$tweet->user->screen_name.'/status/'.$tweet->id.'" target="_blank">'.$tweet->text.'</a>
';
                }
                //echo '
Terms #'.$key.' : '.$i.' valid(s)'."n
";
            }
        }

        /* setting new max id */
        $this->setSinceId($max_id);
        //echo '========= ', date('Y-m-d g:i:s A'), ' - Finished ========='."
n
";;
    }
}

Vous devriez afficher une liste de tweets ! Vous pouvez aussi dé-commenter les commentaires pour avoir plus d’informations. Notez que si vous réexecuter l’opération, vous devriez afficher seulement les nouveaux tweets. Si tout fonctionne, vous pouvez passer à l’étape suivante !

 

3. On crée nos appels dans tweet.php

Maintenant que vous pouvez récupérer les tweets en fonction des termes de recherche, nous allons mieux les filtrer et envoyer une réponse à chacun. Pour cela, nous allons éditer la boucle foreach ($search->statuses as $tweet) de run() :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
foreach ($search->statuses as $tweet){
    /* If you are the author of the tweet, we ignore it */
    if ($tweet->user->screen_name == $this->screenName){
        continue;
    }
    /* if tweet is a quote (like a RT), we ignore it */
    if($tweet->is_quote_status){
        continue;
    }

    $pass = false;

    switch($t['type']){
        case('dogbot'):
            //echo '<b><a style="color: red;" href="https://twitter.com/'.$tweet->user->screen_name.'" target="_blank">@'.$tweet->user->screen_name.'</a> :</b> <a style="color: black; text-decoration: none;" href="https://twitter.com/'.$tweet->user->screen_name.'/status/'.$tweet->id.'" target="_blank">'.$tweet->text.'</a>
';

            $t['
word'] = null; /* initialisation variable mot additionnel */

            /* if the regex specified found something, we try to get the content */
            if(preg_match($t['
regex'], $tweet->text, $content)){
                /* get the longest word after keyword */
                $words = explode('
',$content[1]);
                $maxword = null;$maxlength = 0;
                foreach($words as $w){
                    $wlength = strlen($w);
                    if($wlength >= $maxlength){
                        $maxword = $w;
                        $maxlength = $wlength;
                    }
                }
                if($maxword){
                    $t['
word'] = $maxword;
                }
            }

            $pass = true;
            $i++;
            break;
        default:
            echo '
ERROR: NO TYPE DEFINED';
        break;
    }

    if($pass){
        $this->sendReply($tweet, $t);
        /* wait 100ms */
        usleep(100000);
    }
}
//echo '
Terms #'.$key.' : '.$i.' valid(s)'."n
";

Pensez à regarder le contenu d’un objet $tweet à l’aide d’un print_r(), vous verrez beaucoup d’information comme la fiche de l’auteur, les urls, les images etc. Si vous voulez utiliser ces informations pour votre bot, libre à vous de le faire.

A la fin de chaque boucle, on utilise la fonction sendReply() qui va envoyer une réponse :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private function sendReply($tweet, $tab, $nodie=false){
    switch($tab['type']){
        case('dogbot'):
            $m3 = [' ☺',' ☺',' ????',' ????',' ????',':)','!',';)','!'];
            $reply = 'Woof Woof ! '.($tab['word'] ? $tab['word'].' ' : '').$m3[array_rand($m3)];
            break;
        default:
            echo 'ERROR: NO TYPE DEFINED';
            die();
    }
    try{
        $this->oauth->fetch($this->url_update, array('status' => '@'.$tweet->user->screen_name.' '.$reply,'in_reply_to_status_id' => $tweet->id_str,), OAUTH_HTTP_METHOD_POST);
    }catch(OAuthException $ex){
        echo 'ERROR: '.$ex->lastResponse;
        if(!$nodie){
            die();
        }
    }
}

Testez votre code, pour cela, commentez $this->sendReply($tweet, $t); et dé-commentez les echos, ensuite exécutez la page sur votre terminal ou mieux, un navigateur :

Laissez charger quelques secondes, et voilà 50 tweets (oui parce que la limite de l’API c’est 50 à priori, bien suffisant). Les tweets sont de vrais tweets, j’ai mis des liens dessus. Patientez quelques minutes et relancez la page, vous devriez avoir une page vide ou quelques nouveaux tweets. Si vous avez ce résultat, alors tout va bien ! Vous pouvez re-commenter et passer à l’étape next !

 

Tester manuellement et mettre en place un CRON

Je tiens à vous prévenir, si vous tester EXACTEMENT ce tutoriel, vous risquez d’en enerver plus d’un, car il y a entre 1 et 3 tweets avec le terme « c’est ouf » par minutes sur le site de micro-blogging ^^. Pensez donc à aller sur votre compte Twitter et supprimez vos réponses le temps de faire vos tests, j’ai vécu ça aussi et NON je ne dévoilerai pas le bot dont je suis l’auteur !!!!

Il va falloir automatiser le lancement de votre script. Retournez dans votre invite de commande (en mode root ou non)…

1
crontab -e

Dans la capture d’écran ci-dessus, je fait appel à mon script toutes les 2 minutes (= */2), pour éviter les éventuelles erreurs d’appel API sur du long terme (et être en tweetlimit), mais essayez de le faire toutes les minutes pour vos tests, après libre à vous d’indiquer une périodes (je recommande entre 2 et 5 minutes pour des mots clés fréquents) :

1
* * * * * /usr/bin/php /path/to/directory/tweet.php

Voilà. Vous avez un bot Twitter tout simple en PHP ! Si vous voulez vraiment vous investir dans un bot, je vous conseille vivement de continuer l’étape suivante, notamment la gestion d’une liste noire ou encore interagir avec les réponses des auteurs de tweets sur vos réponses…

 

Aller plus loin : réponses, blacklist

Notre script est en PHP Objet, et le fichier tweet.php va permettre d’ajouter autant de recherche possible. C’est le moment d’utiliser une blackliste ! Pourquoi une blacklist :

  • Tout d’abord pour les utilisateurs que vous dérangez (même s’ils peuvent vous bloquer mais ce n’est pas bon de bloquer un bot, des admins Twitter pourraient en venir à clôturer votre compte)
  • Retirer les méchants Twittos ou des rageux qui vous insultent…

C’est le cas de @LeWikiBot et @Le_Marsu (j’ai que ceux là en tête désolé), chacun à leur manière : @Le_Marsu vous blackliste si vous lui répondez avec une des insulte suivante : gueule, ferme, putain, connard… La suite et bien plus. @LeWikiBot lui propose d’envoyer « STOP @LeWikiBot » et vous serez blacklisté (marche aussi en remplaçant STOP par chut ou ta gueule), cependant « REVIENT @LeWikiBot » vous fait automatiquement retiré de la blacklist…

Pour créer une blacklist, vous allez devoir recréer un fichier stop.php qui reprendra les mêmes éléments que tweet.php :


1
#!/usr/bin/php<!--?php date_default_timezone_set('GMT'); require('TwitterBot.php'); header('Content-Type: text/html; charset=utf-8'); $twitter = new TwitterBot('<Consumer_key>', '<Consumer_secret>'); $twitter->setToken('<Access_token>', '<Access_token_secret>'); $twitter->detectSTOP(); ?-->

Pourquoi je vous recommande de recréer un fichier stop.php et pas tout simplement mettre detectSTOP() à la suite des fonctions dans tweet.php ? Parce que vous allez appeler tweet.php toutes les minutes, alors que pour stop.php il suffira de l’appeler qu’une fois par heure par exemple…

Créez un fichier vide stop_id comme since_id (avec les droits d’écriture adéquat, sinon 777). Ce fichier mémorisera le dernier id de Tweet comme l’ancien script.

Créez un fichier vide stop (avec les droits d’écriture adéquat, sinon 777). Ce fichier enregistrera sous la forme d’un tableau JSON tous les pseudos Twitter à blacklister.

Passez à la fonction detectSTOP() que vous rajouterez à votre Class TwitterBot() :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public function detectSTOP(){
    $since_id = $this->getSinceId('stop_id');
    $max_id = $since_id;

    if (!$this->verifyAccountWorks()){
        die();
    }

    $this->oauth->fetch(sprintf($this->url_search, urlencode('stop OR chut @dogbot'), $since_id));
    $search = json_decode($this->oauth->getLastResponse());
    $passprincipal = false;

    if($search){
        $stop = json_decode(file_get_contents(__DIR__.'/stop'), true);
        $tweetArray = array();
        foreach ($search->statuses as $tweet){
            $pass = false;
            if(!in_array($tweet->user->screen_name,$stop)){
                $stop[] = $tweet->user->screen_name;
                $tweetArray[] = $tweet;
                $pass = true;
                $passprincipal = true;
            }
        }
        if($passprincipal){
            file_put_contents(__DIR__.'/stop',json_encode(array_values($stop)));
        }
        if($search->search_metadata->max_id_str > $max_id){
            $max_id = $search->search_metadata->max_id_str;
            $this->setSinceId($max_id,'stop_id');
        }
        if($pass && $tweetArray){
            foreach ($tweetArray as $tweet){
                $this->sendReply($tweet, array('type' => 'STOP'), true);
                usleep(200000);
            }
        }
    }
}

Remplacez @dogbot par le pseudo Twitter de votre robot, le code va vérifier que les personnes ayant tweeté STOP n’existent pas déjà dans le tableau et va les ajouter. Elle renvoit ensuite une réponse via la fonction sendReply qu’il faudra du coup modifier.

Rajouter une réponse dans switch($tab[‘type’]) de sendReply() :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch($tab['type']){
    case('dogbot'):
        $m3 = [' ☺',' ☺',' ????',' ????',' ????',':)','!',';)','!'];
        $reply = 'Woof Woof ! '.($tab['word'] ? $tab['word'].' ' : '').$m3[array_rand($m3)];
        break;
    case('STOP'):
        $reply = 'Woof ciao ????';
        break;
    case('REVIENT'):
        $reply = 'Woof Merci !';
        break;
    default:
        echo 'ERROR: NO TYPE DEFINED';
        die();
}

Je vous ai rajouté le cas REVIENT c’est cadeau. Pour ReEVIENT c’est la même chose que STOP, créez un fichier revient.php, remplacez $twitter->detectSTOP() par $twitter->detectREVIENT() et dans TwitterBot ajoutez cette fonction qui enlèvera la personne de la blacklist :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public function detectREVIENT(){
    $since_id = $this->getSinceId('revient_id');
    $max_id = $since_id;

    if (!$this->verifyAccountWorks()){
        die();
    }

    $this->oauth->fetch(sprintf($this->url_search, urlencode('revient @dogbot'), $since_id));
    $search = json_decode($this->oauth->getLastResponse());
    $passprincipal = false;

    if($search){
        $stop = json_decode(file_get_contents(__DIR__.'/stop'), true);
        $tweetArray = array();
        foreach ($search->statuses as $tweet){
            $pass = false;
            foreach($stop as $k => &$s){
                if($s == $tweet->user->screen_name){
                    unset($stop[$k]);
                    $tweetArray[] = $tweet;
                    $pass = true;
                    $passprincipal = true;
                }
            }
        }
        if($passprincipal){
            file_put_contents(__DIR__.'/stop',json_encode(array_values($stop)));
        }
        if ($search->search_metadata->max_id_str > $max_id){
            $max_id = $search->search_metadata->max_id_str;
            $this->setSinceId($max_id,'revient_id');
        }
        if($pass && $tweetArray){
            foreach ($tweetArray as $tweet){
                $this->sendReply($tweet, array('type' => 'REVIENT'), true);
                usleep(200000);
            }
        }
    }
}

Si vous voulez tout simplement répondre à la personne, je n’ai pas besoin de vous expliquer : Vous faites une nouvelles fonction dans TwitterBot() et vous recherchez soit n’importe quelle réponse que vous filtrerez par des regex, soit des réponses prédéfinies :


1
2
3
4
5
6
public function detectREPONSE(){
    /* ... */
    $this->oauth->fetch(sprintf($this->url_search, urlencode('@dogbot'), $since_id)); /* n'importe quelle réponse */
    $this->oauth->fetch(sprintf($this->url_search, urlencode('ok OR merci OR super OR %22je t%27aime%22 OR jtm OR excellent @dogbot'), $since_id)); /* type de réponse positive... */
    $this->oauth->fetch(sprintf($this->url_search, urlencode('%22pas intéressé%22 OR non @dogbot'), $since_id)); /* type de réponse négative... */
    /* ... */

 

Conclusion

Voilà voilà, j’espère que ce tuto n’est que le début pour vous… Amusez-vous bien ! Woof fini…

Désolé pour le code mal indenté, c’est WordPress qui fait ça, mais ne soyez pas déçu, voilà la source complète ici : TwitterBot_1.0 ????. Attention ne reprenez pas bêtement ce fichier sans faire ce tutoriel sans quoi vous aurez du mal à continuer votre bot, autant bien comprendre les mécanismes de base !

Continuez sur le site...

Restez informés des Actus, Tutos et Bons-Plans en suivant BXNXG :

Tags