Je vous présente @reniflr, mon robot perso !
La dernière fois, je vous ai indiqué comment créer un univers ; aujourd’hui, nous allons voir la conception d’un être vivant. Oui, je suis dans ma période un-poil-mégalo !
Vous connaissez certainement le réseau (qualifié de « social », à tort à mon avis) qu’est Twitter : celui-ci relie des utilisateurs et leur permet de s’échanger des messages très courts (limités à 140 caractères). Souvent très mal compris pour qui ne s’y est jamais frotté, moi le premier, c’est avant tout un fantastique réseau d’échange d’informations, ces échanges étant contraints pour être simples et concis.
Sur Twitter, chacun dispose d’une page de profil et d’un système de gestion des contacts (personnes auxquelles je suis connecté, personnes qui sont connectées à moi, souvent les deux en même temps). En outre, Twitter propose une API, c’est à dire une porte ouverte sur son réseau, qui peut être utilisée par n’importe qui/quoi pour interagir avec le réseau. De ce fait, il existe sur Twitter des robots (ou « bots ») comme il en existait autrefois sur IRC par exemple : des profils derrière lesquels il n’y a pas un utilisateur en chair et en os, mais un programme plus ou moins complexe, qui se ballade sur le réseau Twitter et interagit éventuellement. Il y a quelques temps, je vous avais fait part de ma rencontre avec l’un de ces robots.
Aujourd’hui, j’ai créé mon propre robot, et je me propose de vous le présenter !
Keskidi ?
Avant d’aller plus loin, je vous propose un petit lexique des termes sur Twitter, qui vous aidera à comprendre de quoi il retourne par la suite :
Tweet : Un tweet est un message limité à 140 caractères et posté sur le réseau Twitter ; il est lisible par tout le monde, et chacun peut y répondre sous la forme d’un nouveau tweet. (je tweete, tu tweetes, il tweete…).
Retweet : (ou « RT ») Message qui répète à l’identique le tweet d’un autre utilisateur, pour lui donner plus de visibilité et propager l’information qu’il contient (je retweete, tu retweetes, il retweete…).
Hashtag : Mot-clé précédé d’un dièse (#), les hashtag sont des mots cliquables dans des tweets, qui permettent d’obtenir une liste de tweets contenant tous ce même hashtag. Les hastags sont utilisés pour insister sur des thèmes particuliers dans les tweets qui les emploient.
Mention : Dans un tweet, un mot précédé d’un arobase (@) réfère à un nom d’utilisateur de Twitter. Un clic dessus renvoie vers sa page de profil et ses derniers tweets. Un tweet qui commence par une mention est très souvent une réponse à un tweet de l’utilisateur ainsi mentionné.
Par exemple, le tweet ci-dessous a été envoyé par l’utilisateur @bonjour404, il a été retweeté par mon robot @reniflr, il contient une mention de l’utilisateur @studionetiko et le hashtag #robot :
Followers : Nombre de personnes abonnées à un utilisateur de Twitter, et qui reçoivent donc automatiquement tous ses nouveaux tweets. Sur Twitter, les abonnement ne sont pas à double sens (contrairement à Facebook, par exemple).
DM : (pour « Direct Message ») Message privé adressé et lisible uniquement par un utilisateur précis. Les DM suivent les même règles que les tweets.
Principe global et technologies
Comme je l’ai dit plus haut, Twitter propose une API, qui peut être employée par n’importe qui et de n’importe quelle façon. D’un point de vue très technique, et pour commencer, il vous faut un compte pour votre robot. Pour ma part, j’ai créé celui de @reniflr. L’API fonctionne de la manière suivante : il vous faut créer et déclarer une nouvelle application, qui aura l’autorisation d’utiliser l’API de Twitter au travers du compte précédemment créé. Une fois ceci fait, pensez à lui donner tous les droits, notamment la lecture et l’envoi de DM. Pour plus de détails, on trouve de très bons tutoriels sur le web. Par la suite, cette appli permettra d’interagir sur votre compte via l’API, un peu à la manière d’une marionnette (le compte) animée par une croix de bois (le robot) attachée à des fils (l’API) par des noeuds (l’application).
Le robot lui-même peut être programmé avec n’importe quel langage de programmation. Pour ma part, j’ai choisis le PHP (langage que je connaissais déjà) combiné à une base de données MySQL qui sert de mémoire au robot.
Toutes les heures, le script principal du robot est relancé automatiquement. Celui-ci est constitué d’une succession d’actions à réaliser (que je vous décris par la suite) : réponse aux messages, rechercher, partage d’information, etc. Le principe est récapitulé dans le schéma ci-contre.
Réponses
Premier comportement rigolo quoi que pas des plus utile : le robot répond quant quelqu’un s’adresse à lui !
Deux possibilités. La première, si son nom est mentionné dans un tweet : dans ce cas, il se contente de retweeter le message en question.
La seconde, si quelqu’un s’adresse directement à lui : dans ce cas, il rédige une réponse personnalisée. La réponse est construite à partir de quatre segments de réponses dont le contenu est sélectionné aléatoirement parmi plusieurs possibilités. De cette façon, les réponses peuvent être assez différentes.
Une sécutité de non-bouclage a été ajoutée dans le processus de réponse. Ainsi, si quelqu’un envoie une réponse à un tweet précédent du robot, ce dernier de répondra pas. Cela permet d’éviter les discussions qui ne finirait que quand l’interlocuteur ne répondrai pas (le robot étant alors programmé pour répondre indéfiniment à tous les tweets). Ce problème de boucle a déjà été rencontré dans des version précédentes de @reniflr : une conversion était engagée avec un autre robot, lui aussi programmé pour répondre à tous les tweets qui lui sont adressés, ce qui créé une boucle infinie !
Partage de liens
Le robot est capable de partager des liens variés. Cette fonction est essentielle pour deux raisons :
- C’est l’une des vocations principale de Twitter, de partager des informations externes ;
- Les comptes qui se contentent de réponses automatiques et de retweets (cf. paragraphe ci-dessous) sont considérés comme du spam.
Pourtant, à l’heure actuelle, la fonction de partage de liens de mon robot est assez primaire. Celui-ci se contente de tirer au hasard une adresse de flux RSS parmi une liste pré-enregistrée, puis sélectionne dans le flux un article au hasard et en poste le lien sur Twitter. Cela présente l’avantage d’avoir des articles relativement nouveau régulièrement.
En ce qui me concerne, j’utilise cette fonction de mon robot de la façon suivante… Je me suis aperçu que dans mon lecteur RSS,régulièrement, je m’abonne à des flux très interessants mais avec un trop grand nombre de mises à jour, ce qui fait que je n’ai pas le temps de (tous) les lire. Du coup, quand j’identifie un tel flux, je me désabonne sur mon lecteur, et je le sous-traite à mon robot. Cela me permet d’avoir quelques articles aléatoires du flux en question de temps en temps.
Décisions et Retweets
En première version, le robot effectuait une recherche des 10 tweets les plus populaires sur un hashtag donné, puis en retweetait un au hasard. Evidement, il n’y avait aucun moyen de maitriser le contenu du tweet en question, et la notion de « populaire » pour Tweeter est était une jolie inconnue.
Du coup, j’ai implémenté dans mon robot un modèle de décision ! Cela lui permet de décider de lui-même quel est le tweet le plus interessant parmi un ensemble de plusieurs messages. Ainsi, le robot réalise toujours une recherche sur un hashtag donné 1, récolte les 10 tweets les plus récents (et non plus les « plus populaires »), réalise un classement de ces 10 tweets en fonction de leur interet via le modèle de décision, puis retweet le premier du classement et garde une trace en base de données des 5 premiers.
Pour déterminer si un tweet est interessant, le modèle de décision se base sur sa popularité, sa densité d’information, sa portée et sa pertinence. Pour ce faire, il emploie 6 critères simultanément :
- Le nombre de fois où le tweet a été retweeté (indicateur de sa popularité) ;
- Le nombre de followers qui suivent l’auteur du tweet (indicateur de portée du message) ;
- Le nombre de mentions (plus il y a de mentions dans le tweet, moins sa portée est grande) ;
- Le nombre de hashtags (un nombre élevé implique un risque de multiplication des thèmes du tweets, diminuant sa pertinence) ;
- Le nombre de liens (un nombre élevé, reliés au hashtags recherché à l’origine, est un indicateur de pertinence) ;
- La longueur du tweet (indiquant une densité d’information).
Bien entendu, le choix de ces critères, le choix de leur interprétation, ainsi que la manière de paramétrer leur gestion est extrèmement subjective… et c’est le but ! Ce modèle de décision ne vise par l’objectivité, mais vise bien à imiter la façon dont je déciderais moi-même.
DM : réponses et instructions
Si le robot vous répond lorsque vous vous adressez à lui publiquement, c’est aussi le cas par DM. Même principe : une réponse est construite à partir de 4 fragments aléatoires de phrases.
Mais j’ai réservé aux DM envoyés au robot une autre fonction nettement plus intéressante : la possibilité de lui envoyer des instructions ! Pas la peine de passer par le code PHP ou par un terminal, @reniflr est capable de reconnaître et d’exécuter un certain nombre d’instructions (en fait, quatre pour l’instant). Une instruction envoyée au robot ressemble à ceci :
motmagique instruction {parametres}
Où « motmagique » est un mot de passe à définir lors de la mise en place du robot. Il permet tout simplement de dissocier une instruction d’un message quelconque. « instruction » correspond à ce que vous voulez qu’il fasser. « parametres » permet d’indiquer des infos complémentaires éventuellement nécessaires à l’exécution de l’instruction.
Pour l’instant, le robot sait executer 4 instructions :
- Publier un statut donné ;
- Suivre un utilisateur de Twitter donnée ;
- Arrêter de suivre un utilisateur de Twitter donnée ;
- Blacklister un utilisateur (cela à pour effet de le supprimer des bases de données du robot et de l’ignorer purement et simplement, en particulier lors de la recherche de messages à retweeter).
Exemple d’instruction :
Et le résultat :
Etablissement de contacts & Follow Fridays
Comme indiqué plus haut, lorsque le robot effectue une recherche de messages intéressants pour en retweeter un, il garde une trace de sa recherche dans sa base de données (je ne vais pas entrer plus que ça dans les détails). Du coup, il devient ensuite possible de réaliser des opérations sur ces informations.
Par exemple, suggérer un utilisateur à propos d’un thème donné si ses tweets sont revenu fréquemment lors des recherches. Et c’est précisément ce que fait le robot. Tous les quatre jours, il tire au hasard un hashtag et recherche l’utilisateur qui l’a le plus tweeté dans sa base de données. Il le suggère alors publiquement, indique les hashtags employés par cet utilisateur qu’il a lui-même mémorisé et l’ajoute dans sa propre liste de personnes à follower (contacts). L’ajout de « cc @ekhorizon » en fin de tweet permet d’attirer mon attention sans me cibler directement (une habitude des utilisateurs de Twitter).
Autre exemple : la coutume des #FollowFriday (ou #FF). Sur Twitter, le vendredi, il est de coutume de proposer à un certain nombre de personnes de se découvrir les unes les autres, en général du fait d’au moins un point commun. Pour cela, il suffit de faire un message contenant le hashtag #FF ainsi que les mentions des personnes que vous souhaitez faire échanger. En utilisant sa base de donnés, @reniflr propose lui-aussi des #FF : il lui suffit de sélectionner un hashtag puis de mentionner les dernières personnes à avoir employé ce hashtag et qu’il a lui-même retweeté (ce qui est sensé être un gage de qualité).
Ici encore, mon propre nom est automatiquement mentionné.
Ces deux comportements du robot ne font pas partie de son script principal : elles ne s’excutent pas toutes les heures, mais à une fréquence bien moindre (une fois pas semaine le vendredi pour les #FF, une fois tous les quatre jours pour les suggestions).
Conclusion, bugs et perspectives
Pour conclure, j’ai donc conçu un petit robot autonome sur Twitter, capable de chercher des informations, de les collecter, de les sélectionner et de les partager, tout en rendant de menus services, comme la propositions d’utilisateurs intéressants ou les #FF. Bien sûr, @reniflr est entièrement paramétrable ! Pour ma part, je lui ai entré des paramètres fortement orientés « geek » au sens large, mais si vous êtes fana de courses de chevaux par exemple, rien ne vous empêche de paramétrer le robot pour être lui-aussi pointu dans le domaine.
Certains bugs demeurent malgré tout, notamment au niveau des modules de réponse automatique, tant en public que (surtout) dans les messages privés. Toutefois, il est difficile pour moi de faire la part des choses entre des bugs inhérents à mon robot, et des bugs générés par Twitter (et il y en a!). Par exemple, Twitter m’indique régulièrement que j’ai de nouveaux messages privés (sur mon compte @ekhorizon), alors qu’ils ont plusieurs mois. S’il fait de même avec @reniflr, il est normal que celui-ci réagisse bizarrement…
Enfin, vous vous en doutez, les perspectives sont extrêmement nombreuses sur les bases du travail que je vous ai présentées aujourd’hui. On pourrait par exemple facilement imaginer que @reniflr apprenne par lui-même de nouveaux hashtags pertinents à surveiller. Compte tenue des recherches qu’il effectue et mémorise sur Twitter, il pourrait aussi devenir un formidable annuaire, capable de suggérer des comptes à suivre à partir d’interrogation des utilisateurs, ou inversement. Vous l’aurez peut-être noté : le robot suit des utilisateurs (followers) mais n’en fait rien de concret ! On pourrait ici imaginer d’affiner les « relations » entre @reniflr et les personnes qu’il suit. Autre idée : et si plusieurs instances du robot (i.e. plusieurs robots différents basés sur le même modèle) pouvaient communiquer entre eux et échanger des informations ?!? Sachez que certains algorithmes utilisés dans le domaine de l’intelligence artificielle et de l’optimisation sont précisément basés sur ce concept…
Affaire à suivre follower…
- En fait, il réalise la recherche sur plusieurs hashtags différents simultanément, mais peu importe.[↑]
@ juju:
Je serais curieux de voir sa réaction face à un risque de bombing… Sachant que certains paramètres de son modèle de décision ne s’acquièrent poas facilement (nombre de followers, nombre de RT…).
Après, il n’a pas vocation non plus de remplacer un humain, mais au moins de l’imiter grossièrement. Et ça marche pas mal : régulièrement, les tweets qu’il RT sont interessants ! En proportion, bien plus que ma timeline (composée des tweets des différentes personnes que je follow moi-même).
Plutôt que de le faire répondre à des ordres à partir d’un mot magique, pourquoi est-ce que tu ne le fais pas simplement répondre uniquement aux ordre qui viennent de toi ? Il doit pouvoir tester la provenance d’un DM, non ?
Et je ne vois pas pour quelle autre raison tu lui enverrais un DM. Tout coup, je ne vois pas l’intéret du mot magique
Qu’il puisse recevoir des ordres de plusieurs personnes ? 🙂
Dans ce cas, il suffit d’avoir une liste de personnes accréditées, non ?
Et tu peux tout de même garder un check spécial sur ton pseudo pour que tu ais plus de droits (comme par exemple, des ordre pour donner accréditation à une personne, ou l’enlever 😉 )
Oui, j’avais pensé à une liste de « maitres » pour le robot, paramètrable via les DM, par exemple.
C’est une autre perspective intéressante.
Mais d’ici là, j’ai gardé cette idée de mot magique pour que le robot puisse recevoir des instructions de plusieurs personnes de façon simple.
Boah, c’est pas compliqué, hein XD
Un fichier texte bateau avec sur chaque ligne le nom d’un maître. Au démarrage tu le charge en mémoire et voila ! ^^
Ou si tu as une base de donnée, une bête table. au lieu de vérifier sur la DM commence par le mot magique, tu vérifie si elle est envoyé par un nom qui est dans la table. Basta !
Certe, je n’ai pas dit que c’était compliqué.
Il faut créer une table avec les noms des maitres, inclure le bout de code qui l’appelle et vérifie donc la provenance des DM lorsque le bot reçoit une instruction ; puis ajouter le code permettant la gestion des maitres par DM (ajout, suppression, éventuellement listing). Et puis après, il faut gérer la liste de maitres : lors d’un #FF, est-ce qu’il inclus tout les maitres ? Quid s’il y en a trop ? Idem pour les suggestions…?
Bref, pas compliqué, mais ça demande du temps et de la réflexion, et pour cette première version, je n’en avais plus (du temps, je veux dire ; de la réflexion, j’en ai toujours). C’est pourquoi j’ai mis le mot magique. 🙂