Twitter en ligne de commande (même avec oAuth)
Il y a quelque temps, j'avais écrit un billet sur comment envoyer les alertes de votre serveur Nagios sur un compte Twitter (ou comment réunir les SI et le Web 2.0). Malheureusement, depuis cette date, Twitter a changé la méthode d'authentification pour poster des tweets. Ce n'est plus une authentification HTTP classique (qui pouvait donc être facilement faite en ligne de commande avec curl par exemple) mais une authentification oAuth, beaucoup plus souple mais nettement plus complexe.
Nous allons donc dans ce nouveau billet voir comment mettre en place l'authentification oAuth pour un script Python qui permettra à partir d'une simple ligne de commande de mettre à jour une timeline Twitter.
A vos fourneaux !
Les ingrédients...
Pour suivre cette recette il faut:
- un compte Twitter
- la librairie Python python-tweepy
- un navigateur Web (pour enregistrer votre application)
Installation de Python-tweepy
Cette librairie Python va vous permettre de parler oAuth avec le serveur Twitter. Il existe un PPA pour Ubuntu (pour les autres distribution GNU/Linux, il faut installer la bête en suivant ces instructions):
sudo add-apt-repository ppa:chris-lea/python-tweepy
sudo aptitude update && sudo aptitude install python-tweepy
Update: Sous Debian la procédure à suivre est la suivante (merci Benjamin):
apt-get install python python-setuptools python-json python-twitter
wget http://pypi.python.org/packages/source/t/tweepy/tweepy-1.7.1.tar.gz
tar xvfz tweepy-1.7.1.tar.gz
cd tweepy-1.7.1
python ./setup.py install
Enregistrement de votre script
C'est la première étape: déclarer votre application (votre script) sur le serveur Twitter. Dans la suite de ce billet je vais procéder à l'enregistrement d'une application qui s'appellera 'tweetit' (c'est le nom de mon script en ligne de commande qui permettra de mettre à jour ma Timeline).
Pour cela, il faut se rendre à l'URL suivante: http://twitter.com/oauth_clients
Puis cliquer sur Register a new application »
On saisie ensuite le formulaire:

Une fois le formulaire validée, vous devriez être redirigé vers une page contenant deux informations importantes: Consumer key (la clés) et Consumer secret (le mot de passe) de votre application.

Il faut bien sur mettre ces informations de coté.
Connecter votre script à votre compte Twitter
Nous allons utiliser la librairie python-tweepy pour faire cette étape qui ne devra être faite qu'une seule fois lors du développement de votre application.
Le plus simple est de reprendre le script écrit par Jeff Miller sur son blog. On va donc créer un script nommé tweetit-register.py contenant le code suivant (remplacer les codes):
#!/usr/bin/env python
import tweepy
CONSUMER_KEY = 'VOTRE CODE CONSUMER KEY'
CONSUMER_SECRET = 'VOTRE CODE CONSUMER SECRET'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth_url = auth.get_authorization_url()
print 'Please authorize: ' + auth_url
verifier = raw_input('PIN: ').strip()
auth.get_access_token(verifier)
print "ACCESS_KEY = '%s'" % auth.access_token.key
print "ACCESS_SECRET = '%s'" % auth.access_token.secret
On exécute le script:
chmod a+x tweetit-register.py
./tweetit-register.py
Le script va vous afficher une URL et attendre un code PIN:
Please authorize: http://twitter.com/oauth/authorize?oauth_token=Ndddb0DBsjd6PNYccSEtl8vtdYkNsPRCk5joO7djqO8PIN:
On copie l'URL dans un navigateur Web:


On récupère ensuite le code PIN que l'on entre dans notre terminal:
PIN: 0665141
On obtient en retour la clés et le mot de passe d'accès :
ACCESS_KEY = '7707822-TWzha9rf3icVF1h0FhGnaK5q7iLyNIRzHXDY8aagt4'
ACCESS_SECRET = '3dbTcWkU1LIYG4MtwmraausjaoSne5coGbXKOXhDfG0'
Création du script
Voilà (enfin), on peut développer notre application (tweetit.py):
#!/usr/bin/env python
import sys
import tweepy
# Authentification oAuth
CONSUMER_KEY = 'Consumer Key'
CONSUMER_SECRET = 'Consumer Secret'
ACCESS_KEY = 'Access Key'
ACCESS_SECRET = 'Access Secret'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
# Main program
api.update_status(sys.argv[1])
On rend le script executable:
chmod a+x tweetit.py
Test de l'application
On lance le script avec le texte à tweeter:
./tweetitcli.py 'Petit test depuis la ligne de commande Linux...'
Et voilà le travail:

Et voila, bientôt un prochain billet pour voir comment intégrer ce nouveau script à Nagios ![]()
Source pour la rédaction de cet article:







Twitter:
Rss:
Commentaires (de mes chers lecteurs):
Merci pour ce retour, c’est très utile.
Tu peux préciser que la commande add-apt-repository n’est disponible qu’à partir d’Ubuntu 9.10.
Avant faut rajouter le dépot à la main dans le sources.list
D’ailleurs je crois que c’est pas installable avant ubuntu 9.10 car on est en python 2.5 , et il faut au minimum la version 3
Bonjour,
J’ai testé ce tutoriel sur une ubuntu 10.04 et tout fonctionne parfaitement.
Remarque @Bartounet :ma version de python est 2.6.5.
Je tente de le faire fonctionner sous Debian mais pour l’instant sans succès.
Voici mes erreurs :
Debian-test scripts # ./tweetcli.py ‘test’
Traceback (most recent call last):
File “./tweetcli.py”, line 16, in
api.update_status(sys.argv[1])
File “build/bdist.linux-i686/egg/tweepy/binder.py”, line 179, in _call
File “build/bdist.linux-i686/egg/tweepy/binder.py”, line 162, in execute
tweepy.error.TweepError: Status is a duplicate.
Quelqu’un pourrait-il m’aider ?
Merci par avance.
Benjamin
@Benjamin: tu es sur que tu n’as pas essayé de poster deux fois le même message dans un intervalle de temps court:
“tweepy.error.TweepError: Status is a duplicate.”
–== duplicate… ==–
Pffff… La journée fut longue… Désolé.
Tout est fonctionnel. C’était bien un problème de tweet identique.
Voici donc la procédureà suivre pour que le tweet depuis un serveur DEBIAN fonctionne :
apt-get install python python-setuptools python-json python-twitter
wget http://pypi.python.org/packages/source/t/tweepy/tweepy-1.7.1.tar.gz
tar xvfz tweepy-1.7.1.tar.gz
cd tweepy-1.7.1
python ./setup.py install
Le reste est déjà dans l’article.
Bon tweet à tous !
@Nicolargo : Merci à toi pour ton aide.
Benjamin
@Benjamin: merci pour le retour. Je viens de mettre à jour le billet avec ta procédure d’installation du module Python Tweepy pour Debian.
Merci pour les infos.
je cherchais justement comment poster sur twitter…. maintenant qu’on ne peut plus utiliser curl.
Accessoirement, ça fait aussi un bon plugin pour munin
Erreur est la suivante je ne sais pas d’ou cela peut venir:
Traceback (most recent call last):
File “./tweetit1.py”, line 16, in
api.update_status(sys.argv[1])
File “/usr/local/lib/python2.6/dist-packages/tweepy-1.7.1-py2.6.egg/tweepy/binder.py”, line 179, in _call
return method.execute()
File “/usr/local/lib/python2.6/dist-packages/tweepy-1.7.1-py2.6.egg/tweepy/binder.py”, line 143, in execute
raise TweepError(‘Failed to send request: %s’ % e)
tweepy.error.TweepError: Failed to send request: [Errno 110] Connection timed out
Merci beaucoup pour ce tuto

j’ai essayer toute quesq vous avez dit , et tt va bien
Bonjour,
Est-il possible de faire passer ça avec un proxy derrière? Je lance avec le proxy dans les variables d’environnement mais sans succès, je dois manquer quelque chose.
Vais tester de la maison ce soir sans proxy mais ça m’intéresserait de le faire du bureau (==> nagios)
Sinon belle explication, merci
Oui petite précision j’ai récupéré les infos de la première partie de l’explication, c’est à partir de là
Création du script
…
que ça coince
Bonjour moi j’ai cet erreur et je n’arrive pas a le debugger File ”
./tweetit.py”, line 16, in
api.update_status(sys.argv[1])
File “/home/nattyseydi/tweepy-1.7.1/tweepy/binder.py”, line 179, in _call
return method.execute()
File “/home/nattyseydi/tweepy-1.7.1/tweepy/binder.py”, line 162, in execute
raise TweepError(error_msg, resp)
tweepy.error.TweepError: Incorrect signature
Merci pour cet excellent. J’ai compris maintenant comment intégrer OAuth dans mon application. Mais j’aimerais qu’on m’éclaircisse sur quelques points.
Je souhaite développer une application qui permet d’interagir avec Twitter en ligne de commande et la distribuer.
- Est-ce un bon choix d’utiliser mon propre CONSUMER_KEY et mon CONSUMER_SECRET dans l’application? Ou est-ce que je dois laisser les utilisateurs créer leur propre application sur Twitter et utiliser leur CONSUMER_KEY et CONSUMER_SECRET dans le code que je vais distribuer?
- Comment récupérer le username de l’utilisateur lorsqu’il autorise l’application? Ou est-ce que ce n’est pas nécessaire?