Retour au blog

Blog

Comment intégrer la nouvelle API twitter (1.1) en php

par Clément Mégnin le 11/10/2012 Code
55
accroche-twitter

DémonstrationTélécharger (Github)

Le 11 Octobre 2012, Twitter a passé un cap dans le grand ménage de son API. Comme l'explique le compte twitterapi, ils ont notamment coupé ou limité l'accès à certaines de leur données et ressources. Si depuis vous remarquez que les fonctionnalités Twitter que vous utilisez sur votre site ne marchent plus, un petit tour d’horizon s'impose.

1. Qu'est-ce qui change concrètement?

Le ménage de l'API touche plusieurs points:

1.1 - Suppression des urls non versionnées

Les urls de type non versionnées, cad sans numéro de version d'api dans l'url, (comme https://twitter.com/statuses/user_timeline/twitterapi.json par exemple), ne fonctionneront plus. Du coup, pour faire des appels à l'API, il faut changer ses urls, et les remplacer par les nouvelles urls versionnées de l'API 1.1. Vous pouvez en voir la liste sur la page de documentation de l'API 1.1.

Si vous ne corrigez pas vos urls, vos requêtes vont retourner le message d'erreur suivant: <error code="34">Sorry, that page does not exist</error>

1.2 - Une authentification oAuth est maintenant requise pour la plupart des requêtes

Un peu sur le même principe que l'API Instagram, Twitter va maintenant exiger qu'un utilisateur soit clairement identifié pour lui permettre de faire des requêtes. Ce n'est pas encore le cas pour les requêtes qui ne touchent pas à des données sensibles, et ça ne sera pas déployé tout de suite sur les api de recherche. On parle donc des requêtes qui touchent les utilisateurs assez directement, (les timelines, les followers, les favoris les DM etc). De ce fait, même si vous changez vos urls par des urls versionnées comme expliqué en petit 1, cela ne suffira pas à faire marcher vos requêtes.

Si vous ne vous identifiez pas auprès de twitter, vos requêtes vont retourner le message d'erreur suivant: <error code="215">Bad Authentication data</error>

La méthode d'authentification choisie par Twitter est le protocole oAuth.
C'est une méthode qui marche avec plusieurs valeurs, uniques, et qui doivent rester secrètes. Nous allons vous expliquer plus bas en détail comment obtenir ces valeurs, et comment exécuter des requêtes correctement avec l'API 1.1.

1.3 - L’exécution côté client est fortement déconseillée

Comme nous venons de voir, il va nous falloir utiliser oAuth pour s'identifier auprès de Twitter, en utilisant des valeurs qui doivent rester secrètes. Or si vous exécutiez vos requêtes directement depuis un fichier JavaScript, en ajax par exemple, vos clés secrètes seront visibles dans le code source du fichier. Il est fortement déconseillé de ne pas garder ce mode de fonctionnement afin de ne pas compromettre la sécurité de votre application ! Il existe une discussion très claire sur ce sujet sur le site dev.twitter.com.

1.4 - Un focus sur le json ?

Contrairement à la précédente version de l'API, dans laquelle les formats de réponse étaient json, xml, rss et atom, dans la nouvelle documentation il n'y a plus que json. Je ne sais pas encore si c'est définitif ou en progrès, mais pour être sûr de faire fonctionner ces requêtes, il vaut mieux privilégier les urls de retour en json.

2. Comment s'y prendre?

Pour expliquer rapidement la démarche, il faut créer une application sur le site des développeurs de twitter, générer 4 valeurs-clé appelées Consumer key, Consumer secret, Access token, et Access token secret. On va ensuite utiliser ces quatre valeurs pour authentifier et envoyer nos requêtes en php grâce à une classe.

Nous allons maintenant aborder point par point la démarche à suivre afin de réaliser l'intégration de l'API 1.1.

2.1 Étape 2 - S'enregistrer auprès de Twitter

Vous l'aurez compris, ceci est la conséquence du point 1.2. Nos requêtes doivent être authentifiées via oAuth, et donc, cela implique que l'on crée un client identifiable auprès de Twitter. La démarche que nous allons détailler maintenant est aussi disponible sur le site officiel des développeurs Twitter avec une documentation complète en Anglais.

C'est une action qu'on effectuera une seule fois par site ou application sur lesquels on souhaite faire des requêtes Twitter. Cela se passe sur le site de Twitter dédié aux développeurs, à l'adresse https://dev.twitter.com. Connectez vous avec votre compte Twitter:

Une fois connecté, rendez vous sur la page "My applications", soit en cliquant sur dev.twitter.com/apps, ou en y accédant via le menu déroulant qui s'affiche au survol de votre image de profil.

Cette page liste les applications que vous avez déjà créées. Nous allons en créer une nouvelle, en cliquant sur le bouton "Create a new application":

Un formulaire vous est présenté. Précisez le nom de votre application et sa description. Dans le cadre d'un site personnel par exemple, vous pouvez ici donner simplement votre nom dans le champ 'Application Name'. Pour les champs 'Website' et 'OAuth redirect_url', mettez simplement l'url de votre site web dans les deux cas en incluant http://

Une fois le formulaire envoyé, vous serez sur la page qui détaille les informations de votre application:

Ce qui nous intéresse particulièrement, c'est la section "OAuth settings", car nous avons besoin des valeurs Consumer key et Consumer secret pour la suite. Gardez donc ces informations à portée de main.

De plus en bas de la page, vous verrez une section appelée "your access token". Cliquez sur le bouton "Create my access token afin de créer un token oAuth pour vottre application et votre compte :"

Une fois cette action effectuée, vous devriez avoir accès à un écran qui ressemble à cela:

Nous allons avoir besoin de l'access token et de l'access token secret pour la suite, alors gardez cette page à portée de main.

2.3 Etape 3 - Intégration

Pour autoriser notre application a faire des requêtes à l'API, nous avons besoins de quatre valeurs. Deux pour l'application que nous utilisons: Consumer key et Consumer secret, et deux pour l'utilisateur qui utilise l'application access token et access token secret. Si vous avez suivi le tutoriel, vous avez à présent accès à ces quatre valeurs sur la page de votre application.

Nous allons pouvoir commencer l'intégration php. Tout comme notre solution Instagram, cette intégration se veut simple et rapide. Elle est accessible aux développeurs de tous niveaux : il n'est pas vraiment nécessaire de posséder un très bon niveau de programmation pour pouvoir l'utiliser. Seul 2 étapes sont nécessaires : la mise à jour des réglages et la mise en place de quelques lignes de code.

2.3.1 Réglages

Ouvrez le fichier php de la page dans laquelle vous souhaitez effectuer vos requêtes, collez le code suivant, puis remplacez les différents paramètres pour qu'ils vous correspondent.

//1 - Settings (please update to math your own)
$consumer_key=''; //Provide your application consumer key
$consumer_secret=''; //Provide your application consumer secret
$oauth_token = ''; //Provide your oAuth Token
$oauth_token_secret = ''; //Provide your oAuth Token Secret

2.3.2 Authentification

Pour réaliser l'authentification de votre connexion, copiez puis collez le code suivant:

//2 - Include @abraham's PHP twitteroauth Library
require_once('twitteroauth/twitteroauth.php');
//3 - Authentication
/* Create a TwitterOauth object with consumer/user tokens. */
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);

On utilise la classe php twitteroauth prête à l'emploi qui gère tout le travail pour effectuer la connexion oAuth. Voiçi pourquoi on inclut le fichier twitteroauth.php. Pour plus d'informations sur comment marche cette classe, vous pouvez vous rendre sur sa page github. Ensuite on lui passe nos quatre valeurs. On est maintenant prêts à faire des requêtes à l'API en utilisant l'objet $connection.

2.3.2 Requête

Conséquence directe du point 1.1, il ne faut plus utiliser les urls qui ne vont plus exister, et privilégier les nouveaux points d'entrée de l'API 1.1. Encore une fois, vous pouvez voir la liste complète sur la page de documentation de l'API 1.1

Par exemple, pour récupérer le dernier tweet d'un utilisateur particulier, l'url ne sera plus https://twitter.com/statuses/user_timeline/NOE_interactive.json?count=1, mais https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=NOE_interactive&count=1

On crée donc une variable $query en php dans laquelle on va écrire l'url de la requête, et on va l'envoyer avec notre connexion :

//4 - Start Querying
$query = 'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=NOE_interactive&count=1'; //Your Twitter API query
$content = $connection->get($query);

Et voilà! L'objet $content contient maintenant le résultat de votre requête sous la forme d'un tableau php. Vous pouvez donc manipuler ce tableau à votre guise afin de réaliser de belles choses avec l'API 1.1 de Twitter!

55 réponses à Comment intégrer la nouvelle API twitter (1.1) en php

  1. author

    Twitter qui change son API le jour de l'anniversaire de Jean-Jacques Goldman.. Coïncidence? je crois pas..!

  2. Bonjour,

    J'ai essayé votre solution en téléchargeant la page twitteroauth.php et en mettant les lignes dans ma page php mais il n'y a rien qui s'affiche. Peut-être que j'ai manqué quelque chose ?

  3. author

    @Touny. Vous avez aussi enregistré votre application auprès de Twitter et remplacé les valeurs dans le fichier php? Nous avons déjà déployé cette solution une dizaine de fois chez nos client et tout marche sans problème. Cette erreur peut avoir plusieurs causes. Il va falloir faire du debug un peu plus poussé, mais malheureusement ce n'est pas quelque chose que nous pouvons faire via le blog.

  4. Quand je regarde votre démonstration, dans le résultat, il y a plusieurs lignes "Array ( [0] => stdClass Object ( [created_at] .... ect" et moi j'ai la même chose que vous. Normalment ça devrait afficher que le dernier tweet et non toutes ces lignes ?

  5. author

    @Touny. Haaa ça marche donc! Bonne nouvelle :) . Ce que vous voyez est le tableau de résultat. Peu importe la requête que vous ferez à Twitter via l'objet $connection, il retournera toujours un tableau de résultat en php. En effet dans notre démonstration, ce tableau représente le dernier Tweet de NOE interactive. Libre à vous ensuite d'utiliser ce tableau pour créer le code html de votre Tweet sur votre site. Je vais faire une page de démonstration plus explicite avec plusieurs exemples afin que cela soit plus clair.

  6. Oui :). D'accord oui je voudrais bien un exemple avec l'affichage d'un "vrai" tweet car je ne vois pas trop comment utiliser ce tableau pour voir ses tweet.

    Merci beaucoup :)

  7. author

    @Touny. Voilà , la page de démonstration a été mise à jour avec un exemple complet. Bonne intégration.

  8. Oui j'ai vu merci c'est gentil ! Ca marche très bien :) j'ai plus qu'a modifier le CSS ! Comme ça j'aurais l'intégration de Twitter et Instagram grâce à vous :) http://www.tounygraphisme.fr

  9. Par contre j'ai un petit problème quand je change le "count" et que je met 3 ça m'affiche toujours que 1 tweet :s

  10. author

    @Touny. J'ai modifié un peu le code de la démonstration pour mettre une boucle au lieu de ne prendre en compte que le dernier. Vous devriez avoir tous les éléments maintenant.

  11. Oui ça marche très bien :) Merci beaucoup !

  12. Bonjour,
    J'ai une petite question.
    J'utilise wamp pour travailler en local, et vu que le oAuth est rattaché à l'url du site (site en ligne) quand je test en local j'ai cette erreur :
    Fatal error: Call to undefined function curl_init() in D:\SourcesWamp\nuapp.fr\v2\fonctions\twittertools\twitteroauth.php on line 199
    Call Stack
    # Time Memory Function Location
    1 0.0005 682032 {main}( ) ..\index.php:0
    2 0.0009 688328 require_once( 'D:\SourcesWamp\nuapp.fr\v2\fonctions\twitter.php' ) ..\index.php:74
    3 0.0076 1126088 TwitterOAuth->get( ) ..\twitter.php:16
    4 0.0076 1126376 TwitterOAuth->oAuthRequest( ) ..\twitteroauth.php:146
    5 0.0103 1130352 TwitterOAuth->http( ) ..\twitteroauth.php:186

    Existe-t-il un moyen de tester l'oAuth en local?

    Merci

  13. author

    @Jérôme. Bonjour, je ne pense pas que le problème vienne de là. Je développe moi aussi en local sans soucis. Par contre, curl n'est pas activé par défaut, du coup je pense que sur votre wamp, l'extension n'est pas activée, d'où l'erreur "Call to undefined function curl_init()". Pour résoudre ce problème, je vous suggère d'activer l'extension php_curl dans wamp et de le redémarrer.

  14. Bizarrement, ça ne résous pas le problème :/

  15. Mais ça fonctionne en ligne

  16. author

    @Jérôme. C'est toujours la même erreur? Je suis catégorique, l'erreur php "Call to undefined function curl_init()", vient du fait que le module curl est sois non installé, sois non activé. Oui en ligne généralement c'est activé par les hébergeurs la plupart du temps. Dans tous les cas, c'est un soucis avec votre serveur local malheureusement.

  17. Je vais me renseigner là dessus. Au pis je réinstallerai Wamp .
    Merci pour le tuto en tout cas. J'étais bien embêté avec ce changement d'API.

  18. merci pour ce post clair et détaillé

  19. Bonjour Jérémy, merci pour ce post très instructif. Est-il possible de passer dynamiquement le screen_name dans la variable $query en même temps que l'authentification ?

    Dans votre exemple, le screen_name est saisi en dur NOE_interactive (https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=NOE_interactive&count=1)

    Lorsqu'un utilisateur lambda se connecte ( en Oauth par exemple en cliquant sur le bouton twitter) est-il possible de récupérer automatiquement le screen_name associé et de le passer dans la variable $query pour après afficher ces tweets ?

    Ou devons nous récupérer ces informations depuis un formulaire ?

    Merci pour votre aide.

  20. author

    @Frédéric, oui c'est possible, mais il va falloir mettre en place une procédure d'authentification oAuth complète, et récupérer le screen name de l'utilisateur à la fin. Le but étant de sauvegarder les informations du user (cad l'association entre le token, le token secret et le screen name) en base quand il revient après s'être identifié.

    Ensuite il vous faudrait récupérer ces 3 informations depuis votre base de données et les passer à l'objet $connection.

    Cela mériterait un tuto complet, mais pour vous aider je vous suggère ce lien http://www.lafermeduweb.net/tutorial/twitter-oauth-developpement-du-module-d-authentification-php-p65.html#169 qui explique très bien comment faire.

    Bonne chance.

  21. @Jérémy. Merci pour le lien. Je regarde cela. Vos posts sont très compréhensibles, n'hésitez pas à en publier un sur ce sujet ;))

    Frédéric

  22. J'ai une question. Je n'arrive plus à publier de tweet. Voici mon bout de code :

    // create new instance
    $tweet = new TwitterOAuth($consumerKey, $consumerSecret, $OAuthToken, $OAuthSecret);

    // Your Message
    $message = "Tweet";

    // Send tweet
    $tweet->post('statuses/update', array('status' => $message));

    Il faut changer quoi pour que cela remarche ?
    Merci par avance

  23. Comment avoir les accents?

    J'ai essayé et

    et dans les 2 cas "déjà" sort "déjà "

  24. oops les balises n'ont pas passé...

    meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" et meta http-equiv="Content-Type" content="text/html; charset=UTF-8"

    et dans les 2 cas "déjà" sort "déjà "

  25. author

    @Jean. On ne fait rien de spécial pourtant. On a bien < meta charset="UTF-8" />. Mais c'est tout. Nos sites sont tous en utf-8 quoi.

  26. author

    @jean essais de remplacer
    <p class="status tw_status">'.parseTweet($tweet->text).'</p>
    par
    <p class="status tw_status">'.parseTweet(utf8_encode($tweet->text)).'</p>
    ou
    <p class="status tw_status">'.parseTweet(utf8_decode($tweet->text)).'</p>

  27. Salut, j'ai fait un plugin WordPress avec cette mise en forme. J'aimerais vous faire part de ce changement :
    $connection->host = "https://api.twitter.com/1.1/";

    À rajouter dans le code parce que l'API 1.0 va être coupée bientôt or la classe twitteroAuth est toujours sur l'ancienne URL.

    Voici le lien vers mon article.
    http://tweetpress.fr/plugin/jm-last-twit-shortcode/#maj-1-1-5-25012013

    A++ et merci pour ce petit bout de code.

  28. Merci, Ça fonctionne très bien.

  29. Un grand merci pour cet article !

  30. Bonjour à tous!
    Moi j'essaye de récupérer des followers pour un user donné mais je n'y parviens donc j'ai voulu exécuter votre demo.php mais on m'affiche des erreurs après avoir remplacé toutes clés et les jetons!

  31. merci encore pour ce tuto !!!
    j'utilisais du js avant...mais ca ne fonctionnait pas terrible....
    j'aimerai savoir s'il est possible d'intéger à votre code, plusiers timeline twitter.....??

    Merci encore....

  32. Bonjour, en tentant d'intégrer votre tutoriel à mon propre template wordpress, je reçois cette erreur php : Fatal error: Call to undefined function curl_init() in C:\..\twitteroauth\twitteroauth.php on line 195
    J'ai déjà modifié les deux php ini... Quelqu'un aurait une solution à ce problème ?
    Merci !

  33. Bonjour,
    Juste une petite question.
    Je gère une plateforme qui propose de créer en quelques clics des pages mobiles personnalisées. Une des fonctionnalités est d'intégrer l'ancien widget timeline simplement en saisissant son nom de compte twitter. Or ce widget va être deprecated et le nouveau widget ne me permet pas de changer le user de la timeline (un widgetID = 1 user).

    L'API twitter me permettra t-elle de résoudre mon problème ?
    Merci merci !

  34. Bonjour Jérémy,

    Je viens d'intégrer la librairie CodeBird pour utiliser la nouvelle API Twitter mais un problème se pose lorsque je cherche à utiliser la fonction direct_messages, quelque chose à changé à ce niveau ?

    Merci,
    Pirmax de pirmax.fr.

  35. Merci beaucoup pour les explications claires et détaillées ! ça marche parfaitement chez moi.

    C'est assez sympa au final, très flexible et ça loop comme il faut pour une belle intégration. Merci !

  36. Hello,

    Article super, il devrait être référencé par twitter sur sa doc tellement c'est simple.

    Perso j'ai eu un gros problème, impossible de lancer des requêtes, des que je lançait une requête j'avais page blanche..
    Les logs d'apache m'indique que cUrl n'est pas une fonction valide.
    Donc ne pas oublier d'installer le package php5-curl

    Voila espérant que ca pourra aider, bonne continuation l'ami 😉
    Remi, Atomic-Soom

  37. Bonjour,

    très bon tutorial et bien expliqué . Mais je voulais savoir si tu avais une solution pour récupérer les résultats en xml.

    Merci

  38. Hello,

    Je ne suis pas un développeur, mais un designer. J'éprouve donc quelques difficultés à comprendre la logique d'intégration de cette méthode pour la nouvelle API.

    Concrètement, j'ai suivi toutes les étapes mais je bloque à l'intégration.

    Comment utiliser les fichiers présents dans le dossier "twitterapi1.1-master" sur github pour / dans ce tutoriel pour créer une page simple, html, qui permet d'afficher le dernier tweet d'un utilisateur ?

    Merci pour cette clarification !

  39. Bonjour,

    Merci pour votre article bien expliqué !

  40. salut bien détaillé mais mon souci c'est comment afficher des tweets à partir d'un mot clef

  41. author

    @lya. Bonjour. Ce tutoriel est plus axé sur comment interagir avec l'API Twitter que sur les différentes requêtes que l'on peut faire en elles même. Cela dit, pour vous aider un peu, cela se passe à l'étape 4 avec la variable $query. Au lieu de faire une requête sur un utilisateur en particulier, faites une requête de recherche, par exemple: https://api.twitter.com/1.1/search/tweets.json?q=%23noe. La page de l'API qui explique cela se trouve ici https://dev.twitter.com/docs/api/1.1/get/search/tweets.

  42. Merci de votre réactivité je l'ai testé voici le message d'erreur Notice: Trying to get property of non-object

  43. Merci pour cette librairie et le tuto qui va bien avec.
    J'ai pu intégrer facilement notre flux de tweet sur notre site web.

    Que de temps gagné!

  44. Bonjour Jérémy,

    Tout d'abord super tutoriel !
    je me casse un peu les dents sur ce problème de twitter..
    Avec l'ancienne version de l'api, j'affichai sur une application les derniers twitts d'un compte twitter sans que l'utilisateur n'ai besoin de s'authentifier. Si je comprends bien, cela n'est plus possible ?
    Pourtant si je vais sur https://twitter.com/Solidays , pas besoin d'authentification. Comment puis-je alors récupérer ce mur ?

    Merci d'avance !

  45. Hello :) J'avais, avec succès, intégré mes 3 derniers Twees il y a quelques mois, mais depuis quelques jours, les tweets ne s'affichent plus du tout... Je précise que je n'ai en aucun cas touché au code depuis, pire encore, il m'est impossible de me logger sur dev.twitter.com :(

    Quelqu'un a déjà rencontré ce problème ? Merci.

  46. j'ai tout installer le probleme c'est que je ne souhaite pas recuperer les tweets en tableau mais en simple texte pouvez vous m'aider?

  47. Travail magnifiquement mâché, quel gain de temps, merci.
    Très clair et didactique, bravo.

  48. Bonjour,

    Après avoir scrupuleusement suivis les étape une à une et après avoir
    autorisé mon application a faire des requêtes à l'API, avec les quatre variable Consumer key, Consumer secret, access token et access token secret.

    J'ai créer un fichier stat.php dans le quel j'ai copié/coller les partie de code:
    réglage, authentification et requête .
    dans le même fichier stat.php j'ai copié/collé Le code html et php du tweet de la page Exemple d'intégration du dernier tweet de @NOE_interactive.

    j’ouvre mon navigateur à l'url ou j'ai copié le ficher stat.php mais il ne s’affiche rien .

    dans vos divers fichier , il manque les balise HTML, HEADER , BODY ....

    pourriez-vous, s'il vous plait m'indiquer combien de fichier il faut au total ?
    est ce que toutes les instruction sont à mettre dans le même fichier ?

    comment séparer les différente partie dans le même fichier ?

    enfin bref , si vous avez le temps .

    merci beaucoup et félicitation pour ce post .

  49. Bonjour et merci pour le tuto !

    J'ai un problème avec le nombre de caractère des messages récupérés en GET. Ils s'arrêtent à environs 145 caractères, ce qui est normale. Cependant, il est inclut le nom du propriétaire du tweet, par ex: "RP @.....". Du coup le message est incomplet et ce qui apparait à la fin du message est le caractère suivant "…", les liens sont du coup tronqués ;(

    Une idée ?

    Merci d'avance.

  50. Bonjour,

    Lorsque j'essaie de créer l'app' j'ai le message d'erreur suivant : "You must add your mobile phone to your Twitter profile before creating an application."
    Je vais donc ajouter mon numéro sur Twitter et la j'ai le message suivant : "Désolé, nous n'avons pas encore de connexion avec votre opérateur !".
    Donc pas moyen d'ajouter le numéro et d'obtenir les Consumer key et Consumer secret, access token et access token secret dont j'ai besoin pour mon site web.

    Quelqu'un aurait la solution à cela ? Merci

  51. Même problème que @Tom : Impossible de créer l'application du fait qu'il est impossible d'ajouter son numéro de téléphone mobile (depuis la France). Comment faire ? …

  52. Ah je me sens moins seul avec mon téléphone mobile, je ne peux pas mettre le truc twitter sur mon site (http://une-pomme.com) ... Fait ch*** :(

  53. Bonjour,
    je suis un jeune développeur, je me permets de faire un peu de pub pour mon API Twitter.
    Utilisable sur une plate-forme PHP, vous aurez à disposition deux méthodes pour récupérer un flux ou simplement tweeter 😉

    C'est ici : https://github.com/tfairane/TwitterAPI et c'est libre !

  54. Bonjour, je suis dans le même cas que Tom & Erico & Mric...
    Avez-vous trouvé un moyen d'obtenir l'access token ?