Esempio PHP più semplice per recuperare user_timeline con l'API di Twitter versione 1.1


292

A causa del ritiro dell'API 1.0 di Twitter dall'11 giugno 2013 , lo script seguente non funziona più.

// 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);
    }
}

Come posso ottenere user_timeline (stati recenti) con il minor codice possibile?

Ho trovato questo: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline ma ottengo il seguente errore:

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

Ci sono molte classi là fuori, ma dopo averne provate molte nessuna sembra funzionare a causa di questi aggiornamenti su Twitter, inoltre alcune di esse sono classi piuttosto avanzate con molte funzionalità di cui non ho davvero bisogno.

Qual è il modo più semplice / più breve per ottenere gli stati utente recenti con PHP?


98
Vorrei uccidere per la risposta a questo. La loro documentazione è orribilmente cattiva.
RCNeil,

Sono nuovo dell'API di Twitter e sto lottando un po 'con esso. Mi sono trovato ad usare un codice deprecato.
Anthony,


@Mark Grazie Marco !! È stato facile!! Inizialmente non ha funzionato per me. Sto correndo WAMP. Ho dovuto fare una modifica al mio php.ini nella mia directory di Apache in base a questo thread: stackoverflow.com/questions/5444249/...
Adlin Ling

1
Ho appena scritto giù soluzione senza CURL o altre librerie extra: stackoverflow.com/questions/17049821/...
Rauli Rajande

Risposte:


820

Nota importante: a partire dalla metà del 2018, il processo per ottenere i token API di Twitter è diventato molto più burocratico. Mi ci è voluta più di una settimana lavorativa per ricevere un set di token API, e questo è per un progetto open source per voi ragazzi con oltre 1,2 milioni di installazioni su Packagist e 1,6k stelle su Github, che teoricamente dovrebbe essere una priorità più alta .

Se hai il compito di lavorare con l'API di twitter per il tuo lavoro, devi prendere in considerazione questo tempo di attesa potenzialmente estremamente lungo. Considera anche altre strade dei social media come Facebook o Instagram e fornisci queste opzioni, poiché il processo per recuperare i loro token è istantaneo.


Quindi vuoi usare l'API Twitter v1.1?

Nota: i file per questi sono su GitHub .

La versione 1.0 sarà presto deprecata e le richieste non autorizzate non saranno consentite. Quindi, ecco un post per aiutarti a fare proprio questo, insieme a una classe PHP per semplificarti la vita.

1. Crea un account sviluppatore: crea un account sviluppatore su Twitter

Devi visitare il sito ufficiale degli sviluppatori Twitter e registrarti per un account sviluppatore. Questo è un passaggio gratuito e necessario per effettuare richieste per l'API v1.1.

2. Crea un'applicazione: crea un'applicazione sul sito dello sviluppatore di Twitter

Che cosa? Pensavi di poter fare richieste non autenticate? Non con l'API v1.1 di Twitter. Devi visitare http://dev.twitter.com/apps e fare clic sul pulsante "Crea applicazione".

Inserisci qui la descrizione dell'immagine

In questa pagina, inserisci i dettagli che desideri. Per me, non importava, perché volevo solo fare un sacco di richieste di blocco per sbarazzarmi dei follower di spam. Il punto è che ti procurerai un set di chiavi uniche da utilizzare per la tua applicazione.

Quindi, il punto di creare un'applicazione è quello di dare a te (e Twitter) un set di chiavi. Questi sono:

  • La chiave del consumatore
  • Il segreto del consumatore
  • Il token di accesso
  • Il token di accesso segreto

Ci sono un po 'di informazioni qui su cosa servono questi token.

3. Crea token di accesso : ti serviranno per effettuare richieste di successo

OAuth richiede alcuni token. Quindi devi averli generati per te.

Inserisci qui la descrizione dell'immagine

Fai clic su "crea il mio token di accesso" in basso. Quindi una volta che scorri di nuovo verso il basso, avrai alcune chiavi appena generate. Devi prendere le quattro chiavi precedentemente etichettate da questa pagina per le tue chiamate API, quindi prendine nota da qualche parte.

4. Modifica livello di accesso : non vuoi sola lettura, vero?

Se vuoi fare un uso decente di questa API, dovrai modificare le tue impostazioni in Lettura e Scrittura se stai facendo qualcosa di diverso dal recupero dei dati standard usando le richieste GET .

Inserisci qui la descrizione dell'immagine

Scegli la scheda "Impostazioni" nella parte superiore della pagina.

Inserisci qui la descrizione dell'immagine

Concedi alla tua applicazione l'accesso in lettura / scrittura e premi "Aggiorna" in basso.

Puoi leggere ulteriori informazioni sul modello di autorizzazione delle applicazioni che Twitter utilizza qui.


5. Scrivi il codice per accedere all'API : l'ho fatto per la maggior parte

Ho combinato il codice sopra, con alcune modifiche e modifiche, in una classe PHP, quindi è davvero semplice effettuare le richieste richieste.

Questo utilizza OAuth e l' API v1.1 di Twitter e la classe che ho creato che puoi trovare di seguito.

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

Assicurati di mettere le chiavi che hai ottenuto dalla tua applicazione sopra nei rispettivi spazi.

Successivamente è necessario scegliere un URL a cui si desidera effettuare una richiesta. Twitter ha la sua documentazione API per aiutarti a scegliere quale URL e anche il tipo di richiesta (POST o 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';

Nella documentazione, ciascun URL indica ciò che è possibile passargli. Se stiamo usando l'URL "blocchi" come quello sopra, posso passare i seguenti parametri POST:

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

Ora che hai impostato ciò che vuoi fare con l'API, è il momento di fare la richiesta effettiva.

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

E per un POST richiesta , questo è tutto!

Per una richiesta GET , è un po 'diverso. Ecco un esempio:

/** 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();     

Esempio di codice finale : per una semplice richiesta GET per un elenco dei miei follower.

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

Ho messo questi file su GitHub con il merito di @ lackovic10 e @rivers! Spero che qualcuno lo trovi utile; So di averlo fatto (l'ho usato per il blocco di massa in un ciclo).

Inoltre, per quelli su Windows che hanno problemi con i certificati SSL, guarda questo post . Questa libreria utilizza cURL sotto il cofano, quindi è necessario assicurarsi di aver configurato i certificati cURL probabilmente. Google è anche tuo amico.


4
@kaffolder Il link in quella pagina: profilepicture.co.uk/caching-api-responses-php suggerisce un modo semplice per farlo. Scrivi i tuoi dati twitter in un file o database (MySQL o MongoDB) alla prima richiesta, quindi ogni successiva richiesta verifichi l'ora corrente rispetto al limite di tempo desiderato per il file (puoi nominare il file come limite di tempo) e se il file esiste e il nome del file rientra nel limite di tempo desiderato, quindi estrarre i dati invece di eseguire la richiesta API. Se il file esiste ma viene superato il limite di tempo, eliminare il file quindi eseguire la richiesta API.
Jimbo

7
Non riesco a capire come gestire i dati JSON una volta restituiti. Non voglio solo echeggiarlo sullo schermo come in echo $ twitter -> setGetfield ($ getfield) -> buildOauth ($ url, $ requestMethod) -> performRequest (); APOLOGIE, non riesco a capire come fare newline! Voglio fare qualcosa come $ jsonData = json_decode ($ twitter); ma non funziona - mi sembra che mi manchi qualcosa di fondamentale ma il centesimo non sta cadendo ...
Ashley,

67
Grazie, la documentazione di Twitter è un disordine disorganizzato, questo ha aiutato molto.
joren,

7
Ci sono alcuni prerequisiti per far funzionare questa classe su Windows. Devi avere una versione funzionante di cURL caricata nel tuo php.inifile e devi anche caricare i certificati CA nel tuo php.inifile usando curl.cainfo = path\to\cacert.pem. Puoi ottenere i certificati CA qui .
Jake Z,

4
@Jimbo Stavo solo notando che alcune delle estensioni cURL predefinite sono buggy in Windows e richiedono la sostituzione (quindi il collegamento alle versioni "fisse") e che senza caricare i certificati CA, la tua classe restituisce un falso, come curl_error () segnala che "Problema certificato SSL, verificare che il certificato CA sia OK". Questo può essere evitato disattivando CURLOPT_SSL_VERIFYPEER, ma ho pensato di includere le istruzioni di base per utilizzare effettivamente i certificati CA. L'ho appena incluso per salvare potenzialmente alcune persone alcuni minuti di ricerca.
Jake Z,

137

Vai su dev.twitter.com e crea un'applicazione . Questo ti fornirà le credenziali di cui hai bisogno. Ecco un'implementazione che ho scritto di recente con PHP e 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);

?>

Questo può essere eseguito dalla riga di comando:

$ php <name of PHP script>.php

2
Grazie per lo snippet di codice, lavora in modo impeccabile. L'unico problema è che non riesco a capire come impostare il conteggio dei post. Restituisce solo 20 e voglio l'intero importo che è 200 secondo il limite di Twitter.
Flatlyn,

23
Come imposteresti il screen_namee countcon questo approccio? Ho provato ad aggiungerlo alla $urlvariabile ma ho ricevuto un errore "Impossibile autenticarti".
Javier Villanueva,

1
Questo codice funziona alla grande! Sto provando a modificarlo per usare la ricerca / tweets.json api, ma ottengo sempre la risposta "non potrei autenticare te" - qualche idea?
Chris,

1
Questo post è stato molto utile curl_init()Tuttavia, il mio codice non sembra tornare . Ho visto alcuni esempi e sembrano molto semplici e diretti ed esattamente come questo codice qui ... Devo installare qualcosa di speciale?
jessicaraygun,

1
Ha funzionato per me il 26 ottobre 2016. L'output è stato un po 'più complesso di quanto mi aspettassi.
Giovanni C

61

Il codice incollato da Rivers è fantastico. Molte grazie! Sono nuovo qui e non posso commentare, vorrei solo rispondere alla domanda di javiervd (Come imposteresti lo screen_name e conti con questo approccio?), Poiché ho perso molto tempo per capirlo su.

Devi aggiungere i parametri sia all'URL che al processo di creazione della firma. Creare una firma è l'articolo che mi ha aiutato. Ecco il mio codice:

$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
Non posso votare questo abbastanza. Nella documentazione API di Twitter, questo ti fissa in faccia, ma non è mai super 'ovvio'. Questo approccio confonde con la buildAuthorizationHeaderfunzione? L'ho implementato separatamente.
Moe,

Non ci lavoro da molto tempo, quindi non ricordo, se non hai ancora risolto il problema, posso esaminarlo nei giorni seguenti.
lackovic10

Ho cercato di adattare la tua soluzione per eseguire il POST su status / update.json senza fortuna, hai idea di come raggiungere questo obiettivo?
perrohunter,

1
@perrohunter non ho idea di dover approfondire questo aspetto. Se non trovi un modo per un paio di giorni mandami un messaggio, cercherò di aiutarti.
lackovic10

18

Come indicato in altre risposte, crea un'app Twitter per ottenere il token, la chiave e il segreto. Usando il codice seguente, è possibile modificare i parametri di richiesta da un punto ed evitare errori di battitura ed errori simili (modifica della $requestmatrice nella returnTweet()funzione).

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

e poi chiama returnTweet()


1
Ottimo lavoro @budidino! Ho creato l'applicazione su dev.twitter.com/apps e riempito le tue x con oauth_access_token, oauth_access_token_secret, consumer_key, consumer_secret. * nota * che devi premere "crea il mio token di accesso" e ci vogliono alcuni secondi per essere generato, quindi attendi.
Theo

@budidino dnt dobbiamo includere qualche libreria ??
anam

Ho compilato i tasti, l'ho aggiunto al mio functions.phpfile in WordPress, ho inserito <?php echo returnTweet(); ?>un file HTML e viene generata la parola "Array" e nient'altro.
J82,

@Desi, il risultato è una serie di tweet, è necessario gestire la modalità di visualizzazione di ciascuno di essi. prova print_r (returnTweet ()) solo per vedere cosa c'è dentro. Dai
budidino

1
Se vuoi recuperare solo l'ultimo tweet, dovresti modificare l'array $ request e impostare count su 1. Supponiamo che tu usi $ tweet = returnTweet (); quindi se si desidera visualizzare l'ultimo tweet (in questo caso l'unico), è possibile scrivere qualcosa del genere: echo "latest tweet:". $ tweet [0] ["text"]; Assicurati di controllare la struttura di Twitter restituita se vuoi estrarre più del semplice testo del tweet (esempio $ userProfileImageURL = $ tweet [0] ["user"] ["profile_image_url"]). dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
budidino

16

Grazie Kris!

Ha funzionato per me senza utilizzare parametri per la query, ogni volta che ho usato più di un parametro mi ha mostrato l'errore: 32 Impossibile autenticarti.

Il problema per me era nella codifica e commerciale. Quindi nel tuo codice in cui è la seguente riga

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

Ho aggiunto la seguente riga di seguito:

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

E ha funzionato usando due o più parametri come screen_name e count.

L'intero codice è simile al seguente:

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

Spero che aiuti qualcuno con lo stesso problema che ho avuto.


grazie mille, il tuo miglioramento del codice funziona bene! Una domanda relativa a: "// si raccomanda un nonce più forte". Cosa potrebbe essere? tempo()?
Sebastian,

Grazie per la segnalazione. Sebastian: un nonce è un token monouso che dovrebbe essere crittograficamente sicuro. mt_rand () è sia troppo corto (32 bit) che non un PRNG crittografico. In teoria, questo rende il token oauth debole, ma per semplicità nel mio codice di esempio originale, volevo usare qualcosa che fosse a portata di mano in PHP e facilmente comprensibile.
Kris Reeves,

ricevendo errore 32. Impossibile autenticarti .. qualche aiuto per favore ??? ho usato il tuo codice sopra
saadk il

@frewuill, sei un grande fratello, mi sta facendo funzionare come un incantesimo, grazie.
venerdì

9

Questa domanda mi ha aiutato molto, ma non mi ha aiutato a capire cosa deve succedere. Questo post sul blog fatto un ottimo lavoro nel guidarmi.

Ecco i bit importanti tutti in un unico posto:

  • Come indicato sopra, DEVI firmare le tue richieste API 1.1. Se stai facendo qualcosa come ottenere stati pubblici, ti consigliamo una chiave dell'applicazione anziché una chiave utente. Il link completo alla pagina che desideri è: https://dev.twitter.com/apps
  • È necessario eseguire il hash di TUTTI i parametri, sia quelli iniziali che quelli get (o parametri POST) insieme.
  • È necessario ORDINARE i parametri prima di ridurli nella forma codificata URL che viene hash.
  • È necessario codificare alcune cose più volte: ad esempio, si crea una stringa di query dai valori codificati dall'URL dei parametri, quindi si urta codificando QUESTO e si concatenano con il tipo di metodo e l'URL.

Sono d'accordo con tutti i mal di testa, quindi ecco un po 'di codice per concludere tutto:

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

6

Se hai installato la libreria PHP OAuth, non devi preoccuparti di formulare la richiesta tu stesso.

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

Per ulteriori informazioni, consulta I documenti o il loro esempio . È possibile utilizzare pecl install oauthper ottenere la libreria.


5

Prima di tutto volevo ringraziare jimbo e (la sua semplice libreria post / twitter-api-php).

Se hai intenzione di utilizzare l' API di ricerca / tweet GET con la libreria PHP "twitter-api-php" (TwitterAPIExchange.php):

Innanzitutto, devi solo commentare l'area di codice "Esegui una richiesta POST e fai eco alla risposta".

Usa semplicemente il codice "Esegui una richiesta GET ed esegui l'eco della risposta", esegui l'eco della risposta e modifica queste due righe:

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

per

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

(Cambia screen_namein q, tutto qui :)


Non ho ancora fortuna: /
Ricardo,

2

Avrai bisogno di un per creare una "app" su Twitter (e hai bisogno di un account Twitter per farlo).

Quindi, è necessario utilizzare OAuth per effettuare una richiesta autorizzata a Twitter .

Puoi utilizzare la risorsa GET status / user_timeline per ottenere un elenco dei tweet recenti.


4
Per favore, per noi stupidi, spiegate. Stai fornendo più informazioni, se non meno, della documentazione. Usi la HttpRequest()funzione di PHP per il passaggio 2? Esiste anche la libreria TwitterOAuth PHP di Abraham - github.com/abraham/twitteroauth - libreria che dovrebbe fare anche questo, ma un esempio di come implementarlo non è realmente fornito.
RCNeil,


2
@MatthewRapati Pagina mancante.
RN Kushwaha,

0

Eccone una breve per ottenere un numero specificato di tweet dalla sequenza temporale. Fondamentalmente fa la stessa cosa degli altri esempi, solo con meno codice.

Basta inserire i tasti e adattarsi $counta proprio piacimento:

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

Questo utilizza funzioni anonime e file_get_contentsinvece della libreria cURL. Nota l'uso di un nonce con hash MD5. Tutti sembrano andare d'accordo con il time()nonce, tuttavia, la maggior parte degli esempi sul web riguardanti OAuth usano una sorta di stringa crittografata (come questa: http://www.sitepoint.com/understanding-oauth-1/ ). Questo ha più senso anche per me.

Nota ulteriore: hai bisogno di PHP 5.3+ per le funzioni anonime (nel caso in cui il tuo server / computer si trovi in ​​qualche grotta della guerra fredda e non puoi aggiornarlo).


-1

Dal loro generatore di firma , è possibile generare curlcomandi del modulo:

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

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

3
Si prega di includere una spiegazione di ciò che fa questo codice, in modo che l'OP possa imparare da esso.
Cerbrus,

-2

Grazie a questa discussione, e in particolare a budidino perché il suo codice è ciò che l'ha guidato a casa per me. Volevo solo contribuire come recuperare i dati JSON da una richiesta. Apporta le modifiche all'array di richieste "// create request" del codice per eseguire diverse richieste. Alla fine, questo genererà JSON sullo schermo del browser

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

Se è utile per chiunque ... Nel mio blog ho implementato il seguente codice PHP al fine di recuperare gli ultimi tweet, estrarre i loro dati più rilevanti e quindi salvarli in un database MySQL. Funziona perché l'ho preso nel mio blog.

La tabella "tweet" dove memorizzarli:

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 funzione per salvare i tweet:

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

"Funziona perché l'ho trovato nel mio blog" è uno dei miei preferiti. Il tuo post non risponde alla domanda reale. Anche il codice php che stai usando ha una cattiva qualità. Leggi un po 'qui phptherightway.com . Soprattutto su DB
Maciej Paprocki,

Inoltre hai reso pubbliche tutte le tue chiavi e token, quindi non essere sorpreso se qualcuno lo prende e compromette il tuo account Twitter!
Garrettlynch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.