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 :
Challenge accepté 🙂 Attention Elon, on arrive !!!
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 :
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
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. »
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
Bonjour,
Effectivement, il faut installer tous les paquets (et pas seulement tweepy et python-telegram-bot).
Voici la nouvelle commande :
pip3 install tweepy python-telegram-bot credentials
Pour votre deuxième erreur, il ne faut pas oublier de créer un fichier
credentials.py
contenant vos secrets. Vous pouvez trouver un exemple ici : https://github.com/cicoub13/elon-coin/blob/main/credentials.example.pyMerci pour vos retours, je vais mettre à jour l’article.
Cyril