Développer un bot en Python qui surveille les tweets d’Elon Musk

Elon Musk, patron de Tesla, SpaceX et de The Boring Company est une célébrité de notre monde. Que l’on aime ou pas, il a une influence énorme sur les 45 millions d’abonnés qui le suivent sur Twitter. Depuis quelques mois, un simple tweet évoquant une action ou une crypto-monnaie fait s’emballer les foules, et les valeurs de ces éléments.

Mon frère observant cela, m’envoie alors un message :

Tout part d’une idée

Challenge accepté 🙂 Attention Elon, on arrive !!!

Elon Musk présentant DogeCoin au monde

Listons ce dont nous avons besoin :

  • un moyen de lire des tweets
  • quelques lignes de code pour analyser si les tweets sont intéressants de notre point de vue
  • un moyen d’être notifié avec le contenu du message

Alors oui, la mode est au No Code et il aurait été beaucoup plus simple de mettre en place ça avec IFTTT ou Zapier mais aussi beaucoup moins intéressant 😉

Le premier langage qui me vient à l’esprit pour développer cet outil est Python. Simple, avec suffisamment de librairies disponibles et plutôt orienté script.

Pour lire les tweets, la librairie Tweepy me semble simple et efficace. L’idée est de pouvoir récupérer tous les tweets du compte Twitter d’Elon.

Pour être notifié, nous pourrions envoyer un mail mais la complexité des serveurs SMTP et de la gestion des DNS me rebute toujours. Je décide donc de partir sur de la messagerie instantanée avec Telegram qui permet de créer facilement des bots.

Pour suivre ce tutoriel, vous devez avoir un environnement de développement Python (python3 pour moi), un compte développeur Twitter et un compte Telegram.


Démarrez en installant les librairies nécessaires à notre projet :

pip3 install tweepy python-telegram-bot

Nous commençons par récupérer les tweets du compte d’Elon Musk :

import tweepy

auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

tweets = api.user_timeline(screen_name='elonmusk',
                           count=100,
                           include_rts = False,
                           tweet_mode = 'extended')

Une boucle pour itérer sur la liste de tweets et les afficher :

for tweet in tweets:
     print("ID: {}".format(tweet.id))
     print(tweet.created_at)
     print(tweet.full_text)
     print("\n")

Passons maintenant à l’analyse des tweets pour savoir s’il est pertinent d’être notifié suivant son contenu. Nous partons sur quelque chose de simple que nous pourrons améliorer plus tard : tous les messages contenant le mot « crypto » ou le signe « $ » (souvent utilisé pour désigner une crypto-monnaie comme $BTC) :

# Dans la boucle for
if "crypto" in tweet.full_text or "$" in tweet.full_text:
    # Send the notification

Pour envoyer un message via Télégram, nous allons utiliser la librairie python-telegram-bot. Vous devez d’abord créer un bot grâce à @BotFather pour obtenir un token.

C’est assez simple à faire en passant par l’assistant https://telegram.me/BotFather

Nous initialisations le bot et envoyons un message à un utilisateur précis (moi) :

import telegram
bot = telegram.Bot(token='TOKEN')
MY_CHAT_ID = "09182098092804983092832"

# Dans la boucle for, après le if
bot.send_message(chat_id = MY_CHAT_ID, text = "Elon Musk a tweeté : " + tweet.full_text)

Pour obtenir votre CHAT_ID, il suffit de discuter avec le bot @userinfobot :

@userinfobot

Il nous reste un petit souci. Lorsque notre script va tourner de manière récurrente, si un tweet parmi les 100 derniers est intéressant, nous allons être notifié à chaque fois.
Je propose donc de sauvegarder l’ID des tweets déjà notifiés dans un fichier et vérifier à chaque lancement du script si les tweets n’ont pas déjà été envoyés.

f = open("tweet_ids", "r")
tweets_already_notified = f.read().splitlines()
f.close()

# Dans la boucle for, après le if
if str(tweet.id) not in tweets_already_notified:
   # Notify and store tweet ID in file
   f.write(str(tweet.id)+ '\n')

Le script final ressemble donc à ça :

import tweepy
import telegram
import credentials

# Twitter API Auth
auth = tweepy.OAuthHandler(credentials.API_KEY, credentials.API_SECRET)
auth.set_access_token(credentials.ACCESS_TOKEN, credentials.ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)

# Telegram Bot Auth
bot = telegram.Bot(token=credentials.BOT_TOKEN)

# Function to test if tweet is "interesting"
def is_tweet_interesting(tweet_text):
    return "crypto" in tweet_text or "$" in tweet_text

# Fetch last 100 tweets
tweets = api.user_timeline(screen_name='elonmusk',
                           count=100,
                           include_rts = False,
                           tweet_mode = 'extended')

# Read already notified tweets
f = open("tweet_ids", "r")
tweets_already_notified = f.read().splitlines()
f.close()

f = open("tweet_ids", "a")
for tweet in tweets:
    # If tweet already notified
    if str(tweet.id) not in tweets_already_notified:
        if is_tweet_interesting(tweet.full_text):
            # Notify Telegram user
            bot.send_message(chat_id = credentials.MY_CHAT_ID, text = "Elon Musk a tweeté : " + tweet.full_text)
            print("ID: {} notified".format(tweet.id))
            # Store Tweet ID in file to notify only once
            f.write(str(tweet.id)+ '\n')

f.close()

Le code est disponible sous Github ici : https://github.com/cicoub13/elon-coin

Ça marche

Il ne reste plus qu’à lancer ce script toutes les X minutes (fréquence à votre discrétion) avec un cron :

*/5 * * * * python3 ~/workspace/elon-coin/bot_one_user/bot_one_user.py

Vous pourrez aussi trouver dans le repository Github une version multi utilisateurs. L’idée est d’enregistrer chaque utilisateur qui envoie /start au bot pour ensuite lui envoyer un message lors d’une détection de tweet intéressant.
C’est un peu plus complexe mais intéressant comme variante.

Et bien sûr le Bot est disponible ici : https://telegram.me/eloin_coin_bot


Liste des choses à améliorer si vous voulez explorer cette idée :

  • Ajouter plus d’informations dans le message envoyé par Télégram (comme le lien du tweet)
  • Améliorer la détection de tweets intéressants en utilisant une librairie de Natural Language Processing pour obtenir un sentiment lié au texte
  • Stocker les IDs des tweets et des utilisateurs connectés au Bot dans une base de données (SQLite par exemple)
  • Ajouter quelques commandes au bot comme « Donne moi les 10 derniers tweets intéressants. »

Vous aimerez aussi...

2 réponses

  1. neainvest dit :

    Bonjour , merci beaucoup pour votre article. Il y a malheureuseùment un erreur au lancement du script:
    python3 Python3 ~/Python-3.8.2/elon-coin/bot_one_user/bot_one_user.py
    Traceback (most recent call last):
    File « /home/xxx/Python-3.8.2/elon-coin/bot_one_user/bot_one_user.py », line 3, in
    import credentials
    ModuleNotFoundError: No module named ‘credentials’

    J’ai donc installé le module credentials grâce a la commande : pip3 install credentials
    Downloading https://files.pythonhosted.org/packages/45/d6/e0555289e0139895366dd67f6b000c6834fcba84f7728a93f95de18440f9/credentials-1.1-py2.py3-none-any.whl
    Installing collected packages: credentials
    Successfully installed credentials-1.1

    Une fois le module installé, une nouvelle erreur apparait:
    python3 ~/Python-3.8.2/elon-coin/bot_one_user/bot_one_user.py
    Traceback (most recent call last):
    File « /home/xxx/Python-3.8.2/elon-coin/bot_one_user/bot_one_user.py », line 6, in
    auth = tweepy.OAuthHandler(credentials.API_KEY, credentials.API_SECRET)
    AttributeError: module ‘credentials’ has no attribute ‘API_KEY’

    Auriez-vous une idée?

    D’avance Merci pour votre retour et votre contenu sur ce site

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *