297 votes

Exemple PHP le plus simple pour récupérer user_timeline avec l'API Twitter version 1.1

En raison de l'abandon de l'API Twitter 1.0 à partir du 11 juin 2013 le script ci-dessous ne fonctionne plus.

// Create curl resource 
$ch = curl_init(); 
// Set url 
curl_setopt($ch, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/myscreenname.json?count=10"); 
// Return the transfer as a string 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
// $output contains the output string 
$output = curl_exec($ch); 
// Close curl resource to free up system resources 
curl_close($ch);

if ($output) 
{
    $tweets = json_decode($output,true);

    foreach ($tweets as $tweet)
    {
        print_r($tweet);
    }
}

Comment puis-je obtenir la user_timeline (statuts récents) avec le moins de code possible ?

J'ai trouvé ça : https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline mais je reçois l'erreur suivante :

"{"errors":[{"message":"Could not authenticate you","code":32}]}"

Il existe de nombreux cours, mais après en avoir essayé plusieurs, aucun ne semble fonctionner à cause des mises à jour de Twitter. De plus, certains de ces cours sont assez avancés et comportent de nombreuses fonctionnalités dont je n'ai pas vraiment besoin.

Quel est le moyen le plus simple et le plus court d'obtenir les statuts récents des utilisateurs avec PHP ?

99 votes

Je tuerais pour avoir la réponse à cette question. Leur documentation est horriblement mauvaise.

0 votes

Je suis nouveau dans l'API Twitter et j'ai un peu de mal avec elle. Je me suis retrouvé à utiliser du code déprécié.

0 votes

Jetez un coup d'œil à aamirafridi.com/twitter/

829voto

Jimbo Points 11305

Note importante : Depuis la mi-2018, le processus d'obtention de jetons d'API twitter est devenu beaucoup plus bureaucratique. Cela m'a pris plus de une semaine de travail pour recevoir un ensemble de jetons d'API, et ceci pour un projet open source pour vous, les gars et les filles avec plus d'un million d'euros. 1,2 million d'installations sur Packagist et 1,6k étoiles sur Github, ce qui devrait théoriquement être plus prioritaire.

Si vous êtes chargé de travailler avec l'API twitter pour votre travail, vous devez tenir compte de ce temps d'attente potentiellement extrêmement long. Pensez également à d'autres médias sociaux comme Facebook ou Instagram et proposez ces options, car le processus de récupération de leurs jetons est instantané.


Vous voulez donc utiliser l'API Twitter v1.1 ?

Note : les fichiers pour ces derniers sont sur GitHub .

Version 1.0 sera bientôt déprécié et les demandes non autorisées ne seront pas acceptées. Voici donc un article pour vous aider à le faire, ainsi qu'une classe PHP pour vous faciliter la vie.

1. Créez un compte de développeur : Mettez en place un compte de développeur sur Twitter

Vous devez vous rendre sur le site officiel des développeurs de Twitter et créer un compte de développeur. Il s'agit d'un gratuit et étape nécessaire pour effectuer des demandes pour l'API v1.1.

2. Créez une application : Créez une application sur le site du développeur Twitter

Quoi ? Vous pensiez que vous pouviez faire des demandes non authentifiées ? Pas avec l'API v1.1 de Twitter. Vous devez vous rendre sur http://dev.twitter.com/apps et cliquez sur le bouton "Créer une application".

Enter image description here

Sur cette page, remplissez les détails que vous voulez. Pour moi, cela n'avait pas d'importance, car je voulais juste faire un tas de demandes de blocage pour me débarrasser des followers spam. Le fait est que vous allez vous faire un ensemble de clés uniques à utiliser pour votre application.

Ainsi, l'intérêt de créer une application est de se donner (et de donner à Twitter) un jeu de clés. Ces clés sont :

  • La clé du consommateur
  • Le secret du consommateur
  • Le jeton d'accès
  • Le secret du jeton d'accès

Il y a un peu d'information ici sur ce à quoi servent ces jetons.

3. Créer des jetons d'accès : Vous en aurez besoin pour réussir vos demandes

OAuth demande quelques jetons. Vous devez donc les faire générer pour vous.

Enter image description here

Cliquez sur "créer mon jeton d'accès" en bas. Une fois que vous aurez fait défiler la page jusqu'en bas, vous verrez apparaître des clés nouvellement générées. Vous devez récupérer les quatre clés précédemment étiquetées sur cette page pour vos appels API, alors notez-les quelque part.

4. Modifier le niveau d'accès : Vous ne voulez pas de lecture seule, n'est-ce pas ?

Si vous voulez faire un usage décent de cette API, vous devrez modifier vos paramètres en lecture et écriture si vous faites autre chose que de la récupération de données standard en utilisant l'API. GET demandes.

Enter image description here

Choisissez l'onglet "Paramètres" situé en haut de la page.

Enter image description here

Donnez à votre application un accès en lecture/écriture, et cliquez sur "Update" en bas.

Vous pouvez en savoir plus sur le modèle de permission des applications que Twitter utilise ici.


5. Écrire du code pour accéder à l'API : J'ai fait le plus gros du travail pour vous

J'ai combiné le code ci-dessus, avec quelques modifications et changements, dans une classe PHP afin qu'il soit très simple de faire les requêtes dont vous avez besoin.

Cela utilise OAuth et le API Twitter v1.1 et la classe que j'ai créée et que vous pouvez trouver ci-dessous.

require_once('TwitterAPIExchange.php');

/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
    'oauth_access_token' => "YOUR_OAUTH_ACCESS_TOKEN",
    'oauth_access_token_secret' => "YOUR_OAUTH_ACCESS_TOKEN_SECRET",
    'consumer_key' => "YOUR_CONSUMER_KEY",
    'consumer_secret' => "YOUR_CONSUMER_SECRET"
);

Assurez-vous de mettre les clés que vous avez obtenues de votre application ci-dessus dans leurs espaces respectifs.

Ensuite, vous devez choisir l'URL à laquelle vous voulez faire une demande. Twitter a son Documentation de l'API pour vous aider à choisir l'URL et aussi le type de requête (POST ou GET).

/** URL for REST request, see: https://dev.twitter.com/docs/api/1.1/ **/
$url = 'https://api.twitter.com/1.1/blocks/create.json';
$requestMethod = 'POST';

Dans la documentation, chaque URL indique ce que vous pouvez lui passer. Si nous utilisons l'URL "blocks" comme celle ci-dessus, je peux passer les paramètres POST suivants :

/** POST fields required by the URL above. See relevant docs as above **/
$postfields = array(
    'screen_name' => 'usernameToBlock', 
    'skip_status' => '1'
);

Maintenant que vous avez défini ce que vous voulez faire avec l'API, il est temps d'effectuer la requête proprement dite.

/** Perform the request and echo the response **/
$twitter = new TwitterAPIExchange($settings);
echo $twitter->buildOauth($url, $requestMethod)
             ->setPostfields($postfields)
             ->performRequest();

Et pour un POST demande, c'est tout !

Pour un GET demande, c'est un peu différent. Voici un exemple :

/** Note: Set the GET field BEFORE calling buildOauth(); **/
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=J7mbo';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();     

Exemple de code final : Pour une simple requête GET pour une liste de mes followers.

$url = 'https://api.twitter.com/1.1/followers/list.json';
$getfield = '?username=J7mbo&skip_status=1';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
             ->buildOauth($url, $requestMethod)
             ->performRequest();  

J'ai mis ces fichiers sur GitHub avec le crédit à @lackovic10 et @rivers ! J'espère que quelqu'un le trouvera utile ; je sais que je l'ai fait (je l'ai utilisé pour le blocage en masse dans une boucle).

Par ailleurs, pour les utilisateurs de Windows qui rencontrent des problèmes avec les certificats SSL, consultez la page ce poste . Cette bibliothèque utilise cURL sous le capot et vous devez donc vous assurer que vos certificats cURL sont probablement configurés. Google est aussi votre ami.

0 votes

Comment faire pour mettre cela en cache localement ? La mise en cache serait un bon complément car Twitter limite le nombre de requêtes. Je suis novice en PHP, donc toute aide sera la bienvenue ! J'ai trouvé ceci lien mais n'arrive pas à trouver comment le mettre en œuvre.

4 votes

@kaffolder Le lien sur cette page : profilepicture.co.uk/caching-api-responses-php propose un moyen simple de le faire. Vous écrivez vos données twitter dans un fichier, ou une base de données (MySQL ou MongoDB) à la première demande, puis à chaque demande suivante vous vérifiez l'heure actuelle par rapport à la limite de temps que vous voulez pour le fichier (vous pourriez nom le fichier comme limite de temps), et si le fichier existe et que le nom du fichier est compris dans la limite de temps souhaitée, extrayez les données au lieu d'exécuter la requête API. Si le fichier existe mais que la limite de temps est dépassée, supprimez le fichier puis effectuez la requête API.

1 votes

@kaffolder Dans tous les cas, écrivez ce que vous voulez faire dans les commentaires. étape par étape puis le code à vos commentaires. Donc... (1) Vérifier si le fichier texte existe. (2) S'il existe, récupérer le nom du fichier (l'horodatage) (3) Si l'heure actuelle est supérieure à l'horodatage, exécuter la requête car le temps de cache est dépassé, et mettre les nouvelles données dans le fichier, en le renommant à la nouvelle limite de temps. (3) Si le fichier texte n'est pas existe, le créer avec l'horodatage actuel, puis effectuer la requête API. Quelque chose de ce genre, assez simple en fait.

138voto

Rivers Points 1325

Allez sur dev.twitter.com et créez une application. . Vous obtiendrez ainsi les informations d'identification dont vous avez besoin. Voici une implémentation que j'ai récemment écrite avec PHP et cURL .

<?php
    function buildBaseString($baseURI, $method, $params) {
        $r = array();
        ksort($params);
        foreach($params as $key=>$value){
            $r[] = "$key=" . rawurlencode($value);
        }
        return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
    }

    function buildAuthorizationHeader($oauth) {
        $r = 'Authorization: OAuth ';
        $values = array();
        foreach($oauth as $key=>$value)
            $values[] = "$key=\"" . rawurlencode($value) . "\"";
        $r .= implode(', ', $values);
        return $r;
    }

    $url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

    $oauth_access_token = "YOURVALUE";
    $oauth_access_token_secret = "YOURVALUE";
    $consumer_key = "YOURVALUE";
    $consumer_secret = "YOURVALUE";

    $oauth = array( 'oauth_consumer_key' => $consumer_key,
                    'oauth_nonce' => time(),
                    'oauth_signature_method' => 'HMAC-SHA1',
                    'oauth_token' => $oauth_access_token,
                    'oauth_timestamp' => time(),
                    'oauth_version' => '1.0');

    $base_info = buildBaseString($url, 'GET', $oauth);
    $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
    $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
    $oauth['oauth_signature'] = $oauth_signature;

    // Make requests
    $header = array(buildAuthorizationHeader($oauth), 'Expect:');
    $options = array( CURLOPT_HTTPHEADER => $header,
                      //CURLOPT_POSTFIELDS => $postfields,
                      CURLOPT_HEADER => false,
                      CURLOPT_URL => $url,
                      CURLOPT_RETURNTRANSFER => true,
                      CURLOPT_SSL_VERIFYPEER => false);

    $feed = curl_init();
    curl_setopt_array($feed, $options);
    $json = curl_exec($feed);
    curl_close($feed);

    $twitter_data = json_decode($json);

//print it out
print_r ($twitter_data);

?>

Il peut être exécuté à partir de la ligne de commande :

$ php <name of PHP script>.php

2 votes

Merci pour l'extrait de code, qui fonctionne parfaitement. Le seul problème est que je n'arrive pas à trouver comment régler le retour du nombre de messages. Il ne renvoie que 20 et je veux le montant total qui est de 200 selon la limite de Twitter.

0 votes

Merci pour cela. C'est frustrant de ne plus pouvoir obtenir les flux Twitter des gens sans configurer une application (sans tenir compte du widget, car il est inflexible avec les CSS).

24 votes

Comment régler le screen_name et count avec cette approche ? J'ai essayé de l'ajouter à la $url mais j'ai obtenu une erreur "Impossible de vous authentifier".

61voto

lackovic10 Points 624

Le code collé par Rivers est excellent. Merci beaucoup ! Je suis nouveau ici et ne peux pas faire de commentaires, je voudrais juste répondre à la question de javiervd (Comment définir le screen_name et le nombre avec cette approche ?), car j'ai perdu beaucoup de temps à le comprendre.

Vous devez ajouter les paramètres à la fois au URL et au processus de création de la signature. Création d'une signature est l'article qui m'a aidé. Voici mon code :

$oauth = array(
           'screen_name' => 'DwightHoward',
           'count' => 2,
           'oauth_consumer_key' => $consumer_key,
           'oauth_nonce' => time(),
           'oauth_signature_method' => 'HMAC-SHA1',
           'oauth_token' => $oauth_access_token,
           'oauth_timestamp' => time(),
           'oauth_version' => '1.0'
         );

$options = array(
             CURLOPT_HTTPHEADER => $header,
             //CURLOPT_POSTFIELDS => $postfields,
             CURLOPT_HEADER => false,
             CURLOPT_URL => $url . '?screen_name=DwightHoward&count=2',
             CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false
           );

2 votes

Je ne peux pas assez voter pour ça. Dans la documentation de l'API de Twitter, cela vous saute aux yeux, mais ce n'est jamais super "évident". Est-ce que cette approche perturbe le buildAuthorizationHeader fonction ? Je l'ai implémentée séparément.

0 votes

Je n'ai pas travaillé avec ce système depuis longtemps, donc je ne m'en souviens pas. Si vous n'avez pas encore résolu votre problème, je peux y réfléchir dans les prochains jours.

0 votes

J'ai essayé d'adapter votre solution pour effectuer le POST sur statuses/update.json sans succès, avez-vous une idée de comment cela pourrait être réalisé ?

20voto

budidino Points 552

Comme indiqué dans d'autres réponses, créez une application Twitter pour obtenir le jeton, la clé et le secret. En utilisant le code ci-dessous, vous pouvez modifier les paramètres de la requête à partir d'un seul endroit et éviter les fautes de frappe et autres erreurs similaires (modifier $request dans returnTweet() fonction).

function buildBaseString($baseURI, $method, $params) {
    $r = array();
    ksort($params);
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value);
    }
    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

function buildAuthorizationHeader($oauth) {
    $r = 'Authorization: OAuth ';
    $values = array();
    foreach($oauth as $key=>$value)
        $values[] = "$key=\"" . rawurlencode($value) . "\"";
    $r .= implode(', ', $values);
    return $r;
}

function returnTweet(){
    $oauth_access_token         = "x";
    $oauth_access_token_secret  = "x";
    $consumer_key               = "x";
    $consumer_secret            = "x";

    $twitter_timeline           = "user_timeline";  //  mentions_timeline / user_timeline / home_timeline / retweets_of_me

    //  create request
        $request = array(
            'screen_name'       => 'budidino',
            'count'             => '3'
        );

    $oauth = array(
        'oauth_consumer_key'        => $consumer_key,
        'oauth_nonce'               => time(),
        'oauth_signature_method'    => 'HMAC-SHA1',
        'oauth_token'               => $oauth_access_token,
        'oauth_timestamp'           => time(),
        'oauth_version'             => '1.0'
    );

    //  merge request and oauth to one array
        $oauth = array_merge($oauth, $request);

    //  do some magic
        $base_info              = buildBaseString("https://api.twitter.com/1.1/statuses/$twitter_timeline.json", 'GET', $oauth);
        $composite_key          = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
        $oauth_signature            = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
        $oauth['oauth_signature']   = $oauth_signature;

    //  make request
        $header = array(buildAuthorizationHeader($oauth), 'Expect:');
        $options = array( CURLOPT_HTTPHEADER => $header,
                          CURLOPT_HEADER => false,
                          CURLOPT_URL => "https://api.twitter.com/1.1/statuses/$twitter_timeline.json?". http_build_query($request),
                          CURLOPT_RETURNTRANSFER => true,
                          CURLOPT_SSL_VERIFYPEER => false);

        $feed = curl_init();
        curl_setopt_array($feed, $options);
        $json = curl_exec($feed);
        curl_close($feed);

    return json_decode($json, true);
}

et ensuite, il suffit d'appeler returnTweet()

1 votes

Superbe travail @budidino ! Création de l'application sur dev.twitter.com/apps et rempli vos x avec le oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * Notez que vous devez appuyer sur "create my access token" et que cela prend quelques secondes pour être généré, alors attendez.

0 votes

@budidino Nous n'avons pas besoin d'inclure une bibliothèque ?

0 votes

J'ai rempli les clés, j'ai ajouté ça à mon functions.php dans WordPress, mettez <?php echo returnTweet(); ?> dans un fichier HTML, et il affiche le mot "Array" et rien d'autre.

17voto

Frewuill Points 121

Merci Kris !

Il a fonctionné pour moi sans utiliser de paramètres à la requête, chaque fois que j'ai utilisé plus d'un paramètre, il m'a montré l'erreur : 32 Impossible de vous authentifier.

Le problème pour moi, était dans l'encodage de l'esperluette. Donc, dans votre code où il y a la ligne suivante

$url .= "?".http_build_query($query);

J'ai ajouté la ligne suivante en dessous :

$url=str_replace("&amp;","&",$url);

Et cela fonctionnait en utilisant deux paramètres ou plus comme screen_name et count.

L'ensemble du code ressemble à ceci :

$token = 'YOUR TOKEN';
$token_secret = 'TOKEN SECRET';
$consumer_key = 'YOUR KEY';
$consumer_secret = 'KEY SECRET';

$host = 'api.twitter.com';
$method = 'GET';
$path = '/1.1/statuses/user_timeline.json'; // api call path

$query = array( // query parameters
    'screen_name' => 'twitterapi',
    'count' => '2'
);

$oauth = array(
    'oauth_consumer_key' => $consumer_key,
    'oauth_token' => $token,
    'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
    'oauth_timestamp' => time(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_version' => '1.0'
);

$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);

$arr = array_merge($oauth, $query); // combine the values THEN sort

asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)

// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));

$url = "https://$host$path";

// mash everything together for the text to hash
$base_string = $method."&".rawurlencode($url)."&".rawurlencode($querystring);

// same with the key
$key = rawurlencode($consumer_secret)."&".rawurlencode($token_secret);

// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));

// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$url .= "?".http_build_query($query);
$url=str_replace("&amp;","&",$url); //Patch by @Frewuill

$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it

// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);

// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));

// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
                  //CURLOPT_POSTFIELDS => $postfields,
                  CURLOPT_HEADER => false,
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true,
                  CURLOPT_SSL_VERIFYPEER => false);

// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);

$twitter_data = json_decode($json);

J'espère que cela aidera quelqu'un qui a le même problème que moi.

1 votes

Merci beaucoup, l'amélioration de votre code fonctionne bien ! Une question concernant : "// un nonce plus fort est recommandé". Qu'est-ce que cela pourrait être ? time() ?

1 votes

Merci de l'avoir souligné. Sebastian : un nonce est un jeton à usage unique qui doit être sécurisé cryptographiquement. mt_rand() est à la fois trop court (32 bits) et n'est pas un PRNG cryptographique. En théorie, cela rend le jeton oauth faible, mais pour des raisons de simplicité dans mon code d'exemple original, je voulais utiliser quelque chose qui était à portée de main en PHP et facilement compréhensible.

0 votes

Je reçois l'erreur 32. Could not authenticate you Any help please ??? J'ai utilisé le code ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X