Exemple PHP le plus simple pour récupérer la ligne de temps de L'utilisateur avec la version 1.1 de L'API Twitter

en raison de L'API Twitter 1.0 retrait à partir de 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 ligne 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 j'obtiens l'erreur suivante:

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

il y a beaucoup de classes là-bas mais après avoir essayé plusieurs aucun d'entre eux semblent fonctionner à cause de ces mises à jour sur Twitter, plus certains d'entre eux sont des classes assez avancées avec beaucoup de fonctionnalités dont je n'ai pas vraiment besoin.

Quel est le moyen le plus simple/le plus court pour obtenir les derniers statuts d'utilisateur avec PHP?

279
demandé sur Jimbo 2012-10-16 18:08:41

14 réponses

Note importante: à partir du milieu de 2018, le processus pour obtenir des clés API twitter est devenu beaucoup plus bureaucratique. Il m'a fallu plus de une semaine de travail d'être fourni un ensemble de jetons API, et ce est pour un projet open source pour vous les gars et les filles avec plus de 1,2 millions d'installations sur Packagist et 1,6 k étoiles sur Github, qui devrait théoriquement être une priorité plus élevée.

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. Envisagez également D'autres avenues de médias sociaux comme Facebook ou Instagram et de fournir ces options, que le processus de récupération de leurs jetons est instantanée.


alors vous voulez utiliser le Twitter v1.1 API?

Note: les fichiers pour ceux-ci sont on GitHub .

Version 1.0 sera bientôt déprécié et les requêtes non autorisées ne seront pas autorisées. Donc, voici un post pour vous aider à le faire, ainsi qu'un cours de PHP pour vous faciliter la vie.

1. Créer un compte de développeur: Créer vous-même un compte de développeur sur Twitter

vous devez visiter le site officiel de développeur Twitter et vous inscrire pour un compte de développeur. Il s'agit d'une gratuit et étape nécessaire pour faire des demandes pour la v1.1 API.

2. Créer une application: créer une application sur le site de développement Twitter

quoi? Tu pensais pouvoir faire des requêtes non authentifiées? Pas avec le V1 de Twitter.1 API. Vous avez besoin pour visiter http://dev.twitter.com/apps et cliquez sur le bouton" Créer une Application".

Enter image description here

Sur cette page, remplissez tous les détails que vous voulez. Pour moi, cela n'avait pas d'importance, parce que je voulais juste faire un tas de demandes de bloc pour se débarrasser des suiveurs de spam. Le point est que vous allez obtenir vous-même un ensemble de clés uniques à utiliser pour votre application.

So, le but de créer une application est de vous donner (et Twitter) un ensemble de clés. Ce sont:

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

il y a un peu d'information ici sur ce pour quoi ces jetons.

3. Créer des tokens d'accès : vous en aurez besoin pour faire des requêtes réussies

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

Enter image description here

cliquez sur" Créer mon token d'accès " en bas. Ensuite, une fois que vous faites défiler vers le bas à nouveau, vous aurez quelques clés nouvellement générées. Vous devez saisir les quatre clés précédemment étiquetées de cette page pour vos appels API, alors notez-les quelque part.

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

si vous souhaitez utiliser cette API de manière correcte, vous devrez modifier vos paramètres pour lire et écrire si vous faites autre chose que la récupération de données standard en utilisant les requêtes GET .

Enter image description here

Choisissez l'onglet "Paramètres" 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 d'applications que Twitter utilise ici.


5. Code d'écriture pour accéder à L'API : j'en ai fait la plupart pour vous

j'ai combiné le code ci-dessus, avec quelques modifications et changements, dans une classe PHP donc c'est vraiment simple de faire les requêtes que vous avez besoin.

this uses OAuth and the Twitter v1.1 API , et la classe que j'ai créée 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 reçues de votre application ci-dessus dans leurs espaces respectifs.

ensuite, vous devez choisir une URL à laquelle vous voulez faire une requête. Twitter a leur documentation API pour vous aider à choisir L'URL et aussi le type de demande (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 transmettre. Si nous utilisons L'URL "blocks" comme celle ci-dessus, je peux passer les paramètres 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 de faire la demande réelle.

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

et pour une demande POST , c'est tout!

pour une demande GET , 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 un simple demande D'obtenir 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 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).

aussi, pour ceux sur Windows qui ont des problèmes avec les certificats SSL, regardez ce post . Cette bibliothèque utilise cURL sous le capot donc vous devez vous assurer que vous avez vos boucles certs mis en place probablement. Google est aussi votre ami.

790
répondu Jimbo 2018-08-15 08:12:31

Aller à dev.twitter.com et créer une application . Cela vous fournira les justificatifs d'identité 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);

?>

cette commande peut être exécutée depuis la ligne de commande:

$ php <name of PHP script>.php
132
répondu Rivers 2015-03-21 22:53:43

le code collé par les rivières est grand. Merci beaucoup! Je suis nouveau ici et ne peux pas commenter, je voudrais juste répondre à la question de javiervd (Comment définiriez-vous le screen_name et compter 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 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
           );
59
répondu lackovic10 2014-03-23 16:25:06

Comme indiqué dans d'autres réponses, créer une application Twitter pour obtenir le jeton de clé et le secret. En utilisant le code ci-dessous, vous pouvez modifier les paramètres de la requête à partir d'un point et éviter les fautes de frappe et les erreurs similaires (changer $request tableau 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 puis il suffit d'appeler returnTweet()

18
répondu budidino 2013-04-25 14:29:32

Merci Kris!

cela 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 ne pouvait pas vous authentifier.

le problème pour moi, était dans l'encodage de l'ampli. Donc dans votre code, où est la ligne suivante

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

j'ai ajouté la ligne suivante:

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

et il a fonctionné en utilisant deux ou plusieurs paramètres comme screen_name et à compter.

le code entier 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 ça aidera quelqu'un avec le même problème que moi.

15
répondu Frewuill 2013-04-05 17:50:47

cette question m'a beaucoup aidé mais ne m'a pas permis de comprendre ce qui doit se passer. ce billet de blog a fait un travail incroyable de me guider à travers elle.

Voici les bits importants tous en un seul endroit:

  • comme indiqué ci-dessus, vous devez signer vos requêtes API 1.1. Si vous faites quelque chose comme obtenir des statuts publics, vous voudrez une clé d'application plutôt qu'une clé d'utilisateur. Le lien complet la page que vous voulez est: https://dev.twitter.com/apps
  • vous devez hachez tous les paramètres, à la fois les autres et les paramètres get (ou POST) ensemble.
  • vous devez trier les paramètres avant de les réduire à la forme encodée url qui est hachée.
  • vous devez encoder certaines choses plusieurs fois - par exemple, vous créez une chaîne de requête à partir des valeurs encodées url des paramètres, et ensuite vous encoder et concaténer avec le type de méthode et l'url.

je compatis à tous les maux de tête, alors voici un peu de code pour tout envelopper:

$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);

$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);
9
répondu Kris Reeves 2013-03-14 01:23:58

si vous avez la bibliothèque PHP de OAuth installée, vous n'avez pas à vous soucier de former la requête vous-même.

$oauth = new OAuth($consumer_key, $consumer_secret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token, $access_secret);

$oauth->fetch("https://api.twitter.com/1.1/statuses/user_timeline.json");
$twitter_data = json_decode($oauth->getLastResponse());

print_r($twitter_data);

pour plus d'information, consultez le docs ou leur exemple . Vous pouvez utiliser pecl install oauth pour obtenir la bibliothèque.

6
répondu jeffaudio 2013-03-18 18:32:54

tout d'abord je voulais remercier jimbo et ( son post / twitter-api-PHP simple library).

si vous allez utiliser la bibliothèque GET search/tweets API avec" twitter-api-php " PHP library (TwitterAPIExchange.php):

tout d'abord, vous devez juste commenter "effectuer une requête POST et faire écho à la réponse" zone de code.

il suffit d'utiliser "Effectuer une requête GET et l'écho de la réponse" code et l'écho de la réponse et la modification de ces deux lignes:

$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?screen_name=J7mbo';

à

$url = 'https://api.twitter.com/1.1/search/tweets.json';
$getfield = '?q=J7mbo';

(le Changement screen_name à q , c'est tout :)

5
répondu Chanuka Asanka 2014-03-23 16:29:33

vous aurez besoin de a à créer une" application "sur Twitter (et vous avez besoin d'un compte Twitter pour ce faire).

ensuite, vous devez utiliser OAuth pour faire une demande autorisée à Twitter .

vous pouvez utiliser la ressource obtenir des statuts/user_timeline pour obtenir une liste de tweets récents.

2
répondu Matthew Rapati 2012-10-16 18:48:52

en voici un bref pour obtenir un nombre spécifié de tweets de votre ligne de temps. Il fait essentiellement la même chose que les autres exemples, seulement avec moins de code.

remplissez simplement les touches et ajustez $count à votre goût:

$url = 'https://api.twitter.com/1.1/statuses/user_timeline.json';
$count = '10';

$oauth = array('count' => $count,
               'oauth_consumer_key' => '[CONSUMER KEY]',
               'oauth_nonce' => md5(mt_rand()),
               'oauth_signature_method' => 'HMAC-SHA1',
               'oauth_timestamp' => time(),
               'oauth_token' => '[ACCESS TOKEN]',
               'oauth_version' => '1.0');

$oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', 'GET&' . rawurlencode($url) . '&' . rawurlencode(implode('&', array_map(function ($v, $k) { return $k . '=' . $v; }, $oauth, array_keys($oauth)))), '[CONSUMER SECRET]&[ACCESS TOKEN SECRET]', true));

$twitterData = json_decode(file_get_contents($url . '?count=' . $count, false, stream_context_create(array('http' => array('method' => 'GET',
                                                                                                                           'header' => 'Authorization: OAuth ' 
                                                                                                                                       . implode(', ', array_map(function ($v, $k) { return $k . '="' . rawurlencode($v) . '"'; }, $oauth, array_keys($oauth))))))));

celui-ci utilise des fonctions anonymes et file_get_contents au lieu de la bibliothèque cURL. Notez l'utilisation de MD5 haché nonce. Tout le monde semble aller avec le time() nonce, cependant, la plupart exemples sur le web concernant OAuth utiliser une sorte de chaîne cryptée (comme celle - ci: http://www.sitepoint.com/understanding-oauth-1 / ). Cela fait plus de sens pour moi aussi.

Note complémentaire: vous avez besoin de PHP 5.3+ pour les fonctions anonymes (au cas où votre serveur/ordinateur se trouve dans une caverne de la guerre froide et vous ne pouvez pas le mettre à jour).

0
répondu kasimir 2015-01-13 13:51:16

à partir de leur générateur de signature , vous pouvez générer curl commandes du formulaire:

curl --get 'https://api.twitter.com/1.1/statuses/user_timeline.json' --data 'count=2&screen_name=twitterapi' --header 'Authorization: OAuth oauth_consumer_key="YOUR_KEY", oauth_nonce="YOUR_NONCE", oauth_signature="YOUR-SIG", oauth_signature_method="HMAC-SHA1", oauth_timestamp="TIMESTAMP", oauth_token="YOUR-TOKEN", oauth_version="1.0"' --verbose
-1
répondu Geremia 2015-03-21 21:36:49
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);

$timelines = $connection->get('statuses/user_timeline', array('screen_name' => 'NSE_NIFTY', 'count' => 100, 'include_rts' => 1));
-2
répondu Abdul Baquee 2014-06-23 07:26:50

merci à ce fil, et surtout budidino parce que son code est ce qui a conduit à la maison pour moi. Je voulais juste contribuer à la récupération des données JSON d'une requête. Apporter des modifications à la partie "//create request" du tableau de requêtes du code pour effectuer différentes requêtes. En fin de compte, cela affichera le JSON sur l'écran du navigateur

<?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;
}

function returnTweet(){
    $oauth_access_token         = "2602299919-lP6mgkqAMVwvHM1L0Cplw8idxJzvuZoQRzyMkOx";
    $oauth_access_token_secret  = "wGWny2kz67hGdnLe3Uuy63YZs4nIGs8wQtCU7KnOT5brS";
    $consumer_key               = "zAzJRrPOj5BvOsK5QhscKogVQ";
    $consumer_secret            = "Uag0ujVJomqPbfdoR2UAWbRYhjzgoU9jeo7qfZHCxR6a6ozcu1";

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

    //  create request
        $request = array(
            'screen_name'       => 'burownrice',
            '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;
}

$tweet = returnTweet();
echo $tweet;

?>
-2
répondu Terry Bu 2014-07-03 23:29:35

S'il est utile pour n'importe qui... Dans mon blog, j'ai implémenté le code PHP suivant afin de récupérer les derniers tweets, extraire leurs données les plus pertinentes et ensuite les sauvegarder dans une base de données MySQL. Ça marche parce que je l'ai trouvé sur mon blog.

Les "tweets" de la table où les stocker:

CREATE TABLE IF NOT EXISTS `tweets` (
  `tweet_id` int(11) NOT NULL auto_increment,
  `id_tweet` bigint(20) NOT NULL,
  `text_tweet` char(144) NOT NULL,
  `datetime_tweet` datetime NOT NULL,
  `dayofweek_tweet` char(3) NOT NULL,
  `GMT_tweet` char(5) NOT NULL,
  `shorturl_tweet` char(23) NOT NULL,
  PRIMARY KEY  (`tweet_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;

get_tweets.php:

<?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;
}

function returnTweets($last_id) {
    $oauth_access_token         = "2687912757-vbyfJA483SEyj2HJ2K346aVMxtOIgVbsY4Edrsw";
    $oauth_access_token_secret  = "nIruzmR0bXqC3has4fTf8KAq4pgOceiuKqjklhroENU4W";
    $api_key                    = "ieDSTFH8QHHPafg7H0whQB9GaY";
    $api_secret                 = "mgm8wVS9YP93IJmTQtsmR8ZJADDNdlTca5kCizMkC7O7gFDS1j";
    $twitter_timeline           = "user_timeline";  //[mentions_timeline/user_timeline/home_timeline/retweets_of_me]
    //create request
    $request= array(
        'screen_name'       => 'runs_ES',
        'count'             => '3',
        'exclude_replies'   => 'true'
        );
    if (!is_null($last_id)) { //Add to the request if it exits a last_id
        $request['since_id']= $max_id;
    }
    $oauth = array(
        'oauth_consumer_key'        => $api_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($api_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;
}

function parse_tweettext($tweet_text) {
    $text= substr($tweet_text, 0, -23);
    $short_url= substr($tweet_text, -23, 23);
    return array ('text'=>$text, 'short_url'=> $short_url);
}

function parse_tweetdatetime($tweetdatetime) {
    //Thu Aug 21 21:57:26 +0000 2014 Sun Mon Tue Wed Thu Fri Sat
    $months= array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06', 
                    'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12');
    $GMT= substr($tweetdatetime, -10, 5);
    $year= substr($tweetdatetime, -4, 4);
    $month_str= substr($tweetdatetime, 4, 3);
    $month= $months[$month_str];
    $day= substr($tweetdatetime, 8, 2); 
    $dayofweek= substr($tweetdatetime, 0, 3);
    $time= substr($tweetdatetime, 11, 8);
    $date= $year.'-'.$month.'-'.$day;
    $datetime= $date.' '.$time;
    return array('datetime'=>$datetime, 'dayofweek'=>$dayofweek, 'GMT'=>$GMT);
    //datetime: "YYYY-MM-DD HH:MM:SS", dayofweek: Mon, Tue..., GMT: +####
}

//First check in the database the last id tweet:
$query= "SELECT MAX(tweets.id_tweet) AS id_last FROM tweets;";
$result= exec_query($query);
$row= mysql_fetch_object($result);
if ($result!= 0 && mysql_num_rows($result)) { //if error in query or not results
    $last_id= $row->id_last;
}
else {
    $last_id= null;
}

$json= returnTweets($last_id);
$tweets= json_decode($json, TRUE);

foreach ($tweets as $tweet) {
    $tweet_id= $tweet['id'];
    if (!empty($tweet_id)) { //if array is not empty
        $tweet_parsetext= parse_tweettext($tweet['text']);
        $tweet_text= utf8_encode($tweet_parsetext['text']);
        $tweet_shorturl= $tweet_parsetext['short_url'];
        $tweet_parsedt= parse_tweetdatetime($tweet['created_at']);
        $tweet_datetime= $tweet_parsedt['datetime'];
        $tweet_dayofweek= $tweet_parsedt['dayofweek'];
        $tweet_GMT= $tweet_parsedt['GMT'];
        //Insert the tweet into the database:
        $fields = array(
            'id_tweet' => $tweet_id,
            'text_tweet' => $tweet_text,
            'datetime_tweet' => $tweet_datetime,
            'dayofweek_tweet' => $tweet_dayofweek,
            'GMT_tweet' => $tweet_GMT,
            'shorturl_tweet' => $tweet_shorturl
            );
        $new_id= mysql_insert('tweets', $fields);
    }
} //end of foreach
?>

la fonction pour enregistrer les tweets:

function mysql_insert($table, $inserts) {
    $keys = array_keys($inserts);
    exec_query("START TRANSACTION;");
    $query= 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $inserts).'\')';
    exec_query($query);
    $id= mysql_insert_id();
    if (mysql_error()) {
        exec_query("ROLLBACK;");
        die("Error: $query");
    }
    else {
        exec_query("COMMIT;");
    }
    return $id;
}
-2
répondu runs 2015-12-31 15:00:10