{"id":1038,"date":"2011-02-06T19:14:28","date_gmt":"2011-02-06T17:14:28","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=1038"},"modified":"2011-02-06T19:14:28","modified_gmt":"2011-02-06T17:14:28","slug":"utiliser-twitter-dans-une-application","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2011\/02\/utiliser-twitter-dans-une-application\/","title":{"rendered":"Utiliser Twitter dans une application"},"content":{"rendered":"<p>Il est assez facile de cr\u00e9er un petit script ou d&rsquo;inclure dans une application la possibilit\u00e9 d&rsquo;envoyer un message sur Twitter m\u00eame si depuis quelques mois Twitter impose un syst\u00e8me d&rsquo;authentification plus compliqu\u00e9 que la simple identification par identificateur\/mot-de-passe utilis\u00e9e pr\u00e9c\u00e9demment. <em>OAuth<\/em> est un syst\u00e8me d&rsquo;identification qui repose, pour sch\u00e9matiser, sur un syst\u00e8me de clef publique et de clef priv\u00e9e. Il faut que l&rsquo;application qui va utiliser Twitter soit enregistr\u00e9e et autoris\u00e9e par Twitter. De m\u00eame, il faut que le titulaire du compte Twitter, que l&rsquo;application va utiliser, ait donn\u00e9 son autorisation. Ce n&rsquo;est que dans ce cas que l&rsquo;application recevra le <em>token<\/em> n\u00e9cessaire \u00e0 l&rsquo;acc\u00e8s au compte Twitter. <\/p>\n<p>Il existe plusieurs modules python permettant d&rsquo;utiliser Twitter. Par exemple <em>python-tweepy<\/em> ou <em>python-twitter<\/em>. C&rsquo;est ce module-l\u00e0 que je vais utiliser pour l&rsquo;avoir d\u00e9j\u00e0 tester dans le pass\u00e9 lorsque Twitter n&rsquo;utilisait que la simple authentification. Jusqu&rsquo;il y a peu, ce dernier module n&rsquo;\u00e9tait pas compatible <em>OAuth<\/em>. La mise \u00e0 jour vers <em>OAuth<\/em> ayant \u00e9t\u00e9 faite r\u00e9cemment, la version utilisant <em>OAuth<\/em> n&rsquo;est pas encore dans les d\u00e9p\u00f4ts. Il va donc falloir l&rsquo;installer manuellement \u00e0 partir des sources et penser \u00e0 installer dans la foul\u00e9e ses d\u00e9pendances.<\/p>\n<h3>Installation de python-twitter<\/h3>\n<p>Pour fonctionner, <em>python-twitter<\/em> a besoin des paquets suivants: <em>python-simplejson<\/em> et <em>python-httplib2<\/em> qu&rsquo;il suffit d&rsquo;installer de la mani\u00e8re habituelle puisque ces paquets sont dans les d\u00e9p\u00f4ts:<\/p>\n<pre class=\"codesource\">\r\n$ sudo aptitude install python-simplejson python-httplib2\r\n<\/pre>\n<p>Il faut aussi installer <em>python-oauth2<\/em> qui est le module permettant d&rsquo;utiliser ce m\u00e9canisme d&rsquo;authentification et sur lequel repose <em>python-twitter<\/em>. Ce module n&rsquo;est malheureusement pas disponible dans le d\u00e9p\u00f4ts mais il existe n\u00e9anmoins un <em>ppa<\/em> offrant la version voulue:<\/p>\n<pre class=\"codesource\">\r\n$ sudo add-apt-repository ppa:chris-lea\/python-oauth2\r\n$ sudo aptitude update\r\n$ sudo aptitude install python-oauth2\r\n<\/pre>\n<p><em>Python-twitter<\/em> lui-m\u00eame est \u00e0 t\u00e9l\u00e9charger sur le site <a href=\"http:\/\/code.google.com\/p\/python-twitter\/\">http:\/\/code.google.com\/p\/python-twitter\/<\/a>.<br \/>\nLa derni\u00e8re version est la 0.8.1. <\/p>\n<p>D\u00e9compressez et d\u00e9sarchivez le fichier. Rendez-vous dans le r\u00e9pertoire d\u00e9sarchiv\u00e9 puis tapez les commandes suivantes pour installer <em>python-twitter<\/em>:<\/p>\n<pre class=\"codesource\">\r\n$ python setup.py build\r\n$ sudo python setup.py install\r\n<\/pre>\n<p>Vous avez maintenant tous les outils n\u00e9cessaires pour utiliser Twitter depuis une application en python.<\/p>\n<h3>Enregistrer l&rsquo;application sur le site de twitter<\/h3>\n<p>Une des obligations impos\u00e9es par Twitter est d&rsquo;enregistrer son application. Pour cela, vous devez poss\u00e9der un compte Twitter et vous rendre \u00e0 cette adresse: <a href=\"http:\/\/twitter.com\/oauth_clients\">http:\/\/twitter.com\/oauth_clients<\/a>. Remplissez-y le formulaire en faisant attention de bien mettre <em>Client<\/em> dans le champ <em>Application Type<\/em> et mettre le <em>Default Access Type<\/em> en <em>read\/write<\/em> si vous d\u00e9sirez pouvoir envoyer des tweets depuis votre application. En retour, Twitter vous donnera les renseignements suivants qui vous seront n\u00e9cessaires pour la suite:<\/p>\n<pre class=\"codesource\">\r\nAPI key\r\nZst*******************\r\n\r\nConsumer key\r\nZst*******************\r\n\r\nConsumer secret\r\nmiX**************************************\r\n\r\nRequest token URL\r\nhttps:\/\/api.twitter.com\/oauth\/request_token\r\n\r\nAccess token URL\r\nhttps:\/\/api.twitter.com\/oauth\/access_token\r\n\r\nAuthorize URL\r\nhttps:\/\/api.twitter.com\/oauth\/authorize\r\n<\/pre>\n<h3>Obtenir les autorisations n\u00e9cessaires<\/h3>\n<p>La premi\u00e8re fois que l&rsquo;application tente de se connecter \u00e0 un compte Twitter, il faut pr\u00e9alablement  r\u00e9clamer un code PIN \u00e0 l&rsquo;adresse <em>Request Token URL<\/em> re\u00e7ue \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente puis avec ce code PIN visiter la page <em>Authorize URL<\/em>. Ce n&rsquo;est qu&rsquo;\u00e0 ce moment qu&rsquo;on peut r\u00e9clamer la <em>Token Key<\/em> et le <em>Token Secret<\/em> via l&rsquo;<em>Access Token URL<\/em> indispensable pour acc\u00e9der au compte Twitter. <\/p>\n<p>Pour cela, j&rsquo;ai \u00e9crit un petit script en python tr\u00e8s largement inspir\u00e9 de celui trouvable \u00e0 cette adresse:<br \/>\n<a href=\"http:\/\/code.google.com\/p\/python-twitter\/source\/browse\/get_access_token.py\">http:\/\/code.google.com\/p\/python-twitter\/source\/browse\/get_access_token.py<\/a><\/p>\n<p>Ce script se connecte \u00e0 l&rsquo;adresse <em>Request token URL<\/em> re\u00e7ue lors de l&rsquo;enregistrement de l&rsquo;application sur le site de Twitter et, en donnant la <em>Consumer key<\/em> et le <em>Consumer Secret<\/em>, on obtient le <em>Request Token Key<\/em> et le <em>Request Token Secret<\/em>. Ces deux <em>tokens<\/em> serviront \u00e0 cr\u00e9er une URL o\u00f9 vous devrez vous rendre pour obtenir un code PIN.<br \/>\nEnfin, ce code PIN, une fois introduit dans le script, vous donnera l&rsquo;<em>Access Token Key<\/em> et l&rsquo;<em>Access Token Secret<\/em> que votre application doit utiliser pour acc\u00e9der au compte Twitter.<br \/>\nOuf! Qui a dit que le m\u00e9canisme d&rsquo;authentification OAuth \u00e9tait compliqu\u00e9 ?<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">import<\/span> os\r\n<span class=\"reservedname\">import<\/span> sys\r\n<span class=\"reservedname\">import<\/span> urlparse\r\n<span class=\"reservedname\">import<\/span> oauth\r\n\r\n<span class=\"codecomment\"># Clef et Secret obtenus lors de l'enregistrement de l'application\r\n<\/span>consumer_key = <span class=\"quotedstring\">\"Zs*********************\"<\/span>\r\nconsumer_secret = <span class=\"quotedstring\">\"miX*************************************\"<\/span>\r\n\r\noauth_consumer = oauth2.Consumer(key=consumer_key, secret=consumer_secret)\r\noauth_client = oauth2.Client(oauth_consumer)\r\n\r\nresp, content = oauth_client.request(<span class=\"quotedstring\">\"https:\/\/api.twitter.com\/oauth\/request_token\"<\/span>, <span class=\"quotedstring\">'POST'<\/span>)\r\n<span class=\"reservedname\">if<\/span> resp[<span class=\"quotedstring\">'status'<\/span>] != <span class=\"quotedstring\">'200'<\/span>:\r\n  <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'Invalid response from Twitter requesting temp token: %s'<\/span> % resp[<span class=\"quotedstring\">'status'<\/span>]\r\n<span class=\"reservedname\">else<\/span>:\r\n  request_token = dict(urlparse.parse_qsl(content))\r\n\r\n  <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'Please visit'<\/span>\r\n  <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'%s?oauth_token=%s'<\/span> % (<span class=\"quotedstring\">\"https:\/\/api.twitter.com\/oauth\/authorize\"<\/span>, request_token[<span class=\"quotedstring\">'oauth_token'<\/span>])\r\n\r\n  <span class=\"codecomment\"># A ce stade, vous devez visiter le site \u00e0 l'adresse indiqu\u00e9e pour recevoir le code PIN\r\n<\/span>  <span class=\"codecomment\"># n\u00e9cessaire au stade suivant.   \r\n<\/span>  pincode = raw_input(<span class=\"quotedstring\">'Pincode? '<\/span>)\r\n  token = oauth.Token(request_token[<span class=\"quotedstring\">'oauth_token'<\/span>], request_token[<span class=\"quotedstring\">'oauth_token_secret'<\/span>])\r\n  token.set_verifier(pincode)\r\n  \r\n  oauth_client  = oauth.Client(oauth_consumer, token)\r\n  resp, content = oauth_client.request(<span class=\"quotedstring\">'https:\/\/api.twitter.com\/oauth\/access_token'<\/span>, method=<span class=\"quotedstring\">'POST'<\/span>, body=<span class=\"quotedstring\">'oauth_verifier=%s'<\/span> % pincode)\r\n  access_token  = dict(urlparse.parse_qsl(content))\r\n \r\n  <span class=\"codecomment\"># Avec le code pin que vous avez introduit, Twitter vous donne un Access Token Key et\r\n<\/span>  <span class=\"codecomment\"># un Access Token Secret qui devront \u00eatre utiliser dans python-twitter. \r\n<\/span>  <span class=\"reservedname\">if<\/span> resp[<span class=\"quotedstring\">'status'<\/span>] != <span class=\"quotedstring\">'200'<\/span>:\r\n    <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'The request for a Token did not succeed: %s'<\/span> % resp[<span class=\"quotedstring\">'status'<\/span>]\r\n    <span class=\"reservedname\">print<\/span> access_token\r\n  <span class=\"reservedname\">else<\/span>:\r\n    <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'Your Twitter Access Token key: %s'<\/span> % access_token[<span class=\"quotedstring\">'oauth_token'<\/span>]\r\n    <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'          Access Token secret: %s'<\/span> % access_token[<span class=\"quotedstring\">'oauth_token_secret'<\/span>]\r\n<\/pre>\n<p>Voici ce qui doit appara\u00eetre dans le terminal au lancement du script:<\/p>\n<pre class=\"codesource\">\r\nPlease visit\r\nhttps:\/\/api.twitter.com\/oauth\/authorize?oauth_token=fQb*************************************\r\n\r\nPincode? 0595314\r\nYour Twitter Access Token key: 24*******-0gd**************************************\r\n          Access Token secret: 1uX*********************************************\r\n<\/pre>\n<h3>Envoyer un message sur Twitter<\/h3>\n<p>Maintenant qu&rsquo;on poss\u00e8de toutes les autorisations n\u00e9cessaires, on peut tweeter un message en utilisant <em>python-twitter<\/em>. Le code, ci-dessous, utilise la <em>Consumer Key<\/em>, le <em>Consumer Secret<\/em>, l&rsquo;<em>Access Token Key<\/em> et l&rsquo;<em>Access Token Secret<\/em> pour se connecter \u00e0 Twitter via la classe <em>Api<\/em> du module. On v\u00e9rifie, avec <em>VerifyCredentials()<\/em> que l&rsquo;on dispose bien des droits indispensables et ensuite on envoie notre tweet sur le compte avec <em>PostUpdate()<\/em>.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">import<\/span> twitter\r\n\r\nconsumer_key = <span class=\"quotedstring\">\"Zst*******************\"<\/span>\r\nconsumer_secret = <span class=\"quotedstring\">\"miX***************************************\"<\/span>\r\naccess_token_key = <span class=\"quotedstring\">\"241******-0gd*************************************\"<\/span>\r\naccess_token_secret = <span class=\"quotedstring\">\"1uX**************************************\"<\/span>\r\n\r\napi = twitter.Api(consumer_key, consumer_secret, access_token_key, access_token_secret)\r\nresp = api.VerifyCredentials()\r\n<span class=\"reservedname\">if<\/span> resp == None:\r\n  <span class=\"reservedname\">print<\/span> <span class=\"quotedstring\">'Error verifying credentials'<\/span>\r\n<span class=\"reservedname\">else<\/span>:\r\n  resp = api.PostUpdate(<span class=\"quotedstring\">'My first twitter message using python'<\/span>)\r\n<\/pre>\n<p>La classe <em>Api<\/em> du module <em>python-twitter<\/em> permet bien s\u00fbr de faire bien plus que simplement envoyer un simple tweet. Vous pouvez lire la timeline du compte, g\u00e9rer vos abonnements et vos abonn\u00e9s, cr\u00e9er des listes etc&#8230; Pour connaitre toutes les possibilit\u00e9s, tapez:<\/p>\n<pre class=\"codesource\">\r\n$ pydoc twitter.Api\r\n<\/pre>\n<p><em>pydoc<\/em> affichera, \u00e0 l&rsquo;instar des pages de <em>man<\/em>, toutes les fonctions et la doc relative \u00e0 la classe <em>Api<\/em> de <em>python-twitter<\/em>.<\/p>\n<h3>R\u00e9f\u00e9rences<\/h3>\n<p><a href=\"http:\/\/code.google.com\/p\/python-twitter\/\">http:\/\/code.google.com\/p\/python-twitter\/<\/a><br \/>\n<a href=\"http:\/\/dev.twitter.com\/doc\">http:\/\/dev.twitter.com\/doc<\/a><br \/>\n<a href=\"http:\/\/code.google.com\/p\/python-twitter\/source\/browse\/get_access_token.py\">http:\/\/code.google.com\/p\/python-twitter\/source\/browse\/get_access_token.py<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il est assez facile de cr\u00e9er un petit script ou d&rsquo;inclure dans une application la possibilit\u00e9 d&rsquo;envoyer un message sur Twitter m\u00eame si depuis quelques mois Twitter impose un syst\u00e8me d&rsquo;authentification plus compliqu\u00e9 que la simple identification par identificateur\/mot-de-passe utilis\u00e9e pr\u00e9c\u00e9demment. OAuth est un syst\u00e8me d&rsquo;identification qui repose, pour sch\u00e9matiser, sur un syst\u00e8me de clef [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,5],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1038"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=1038"}],"version-history":[{"count":4,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1038\/revisions"}],"predecessor-version":[{"id":1042,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1038\/revisions\/1042"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=1038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=1038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=1038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}