UPDATE: Vedere nuovo codice alla fine del messaggio, questo era in realtà abbastanza facile da fare con l'arricciatura ma sono andato su di esso in modo non corretto la prima volta.
Non sono riuscito a far funzionare l'API di flusso Twitter utilizzando cURL in combinazione con uno CURLOPT_READFUNCTION
, ma ho avuto successo utilizzando fsockopen() e fread()
. Non sono sicuro del motivo per cui la readfunction non funzionava come ho usato prima con successo, ma deve avere qualcosa a che fare con il fatto che i dati di risposta sono "in streaming" e non vengono inviati usando la codifica chunked HTTP. In sostanza, la mia funzione di lettura non è mai stata chiamata così non ho potuto elaborare i dati.
Il metodo che ho usato che è ora di lavoro:
- Connessione tramite fsockopen a
ssl://stream.twitter.com
- Problema richiesta HTTP di base per i dati di flusso utilizzando
fputs
- Consumare le intestazioni di risposta HTTP e assicurarsi che ci sono stati nessun errore
- Leggere una quantità di dati utilizzando
fread
in un ciclo infinito
- Ogni volta che viene letto un blocco di dati, Chiamo una funzione di buffer interno
- La funzione tampone aggiunge i nuovi dati in un buffer funzione Buffer
- quindi tenta di elaborare tutti i messaggi nel buffer (se abbiamo 1 o più messaggi completi)
- Come si elabora ciascun messaggio, il buffer viene ridotto finché non è vuoto e quindi la funzione ritorna e i dati vengono letti nuovamente
L'ho eseguito da un paio d'ore e non ho avuto una connessione interrotta e ho elaborato oltre 30.000 messaggi senza errori ancora.
Fondamentalmente ho implementato un sistema di callback in modo che ogni volta che un messaggio intero viene letto dal buffer, richiama il callback definito dall'utente con il messaggio json in modo che l'applicazione possa fare tutto ciò che deve fare con il messaggio (ad es. al database).
Non ho ancora nessun breve frammento di post qui, ma se vuoi, mandami un messaggio andando sul sito web elencato sul mio profilo e compilando il modulo di contatto e sarei felice di condividerlo. Forse possiamo lavorare insieme se qualcuno è interessato. L'ho fatto solo per divertimento, non ho alcun interesse per Twitter e non lo uso per motivi finanziari. Alla fine lo metterò su GitHub forse.
EDIT:
Ecco po 'di codice cURL che collegherà alle API streaming e passare i messaggi JSON a una funzione di callback come sono disponibili. Questo esempio utilizza la codifica gzip per risparmiare larghezza di banda.
<?php
$USERNAME = 'youruser';
$PASSWORD = 'yourpass';
$QUERY = 'nike';
/**
* Called every time a chunk of data is read, this will be a json encoded message
*
* @param resource $handle The curl handle
* @param string $data The data chunk (json message)
*/
function writeCallback($handle, $data)
{
/*
echo "-----------------------------------------------------------\n";
echo $data;
echo "-----------------------------------------------------------\n";
*/
$json = json_decode($data);
if (isset($json->user) && isset($json->text)) {
echo "@{$json->user->screen_name}: {$json->text}\n\n";
}
return strlen($data);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?track=' . urlencode($QUERY));
curl_setopt($ch, CURLOPT_USERPWD, "$USERNAME:$PASSWORD");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'writeCallback');
curl_setopt($ch, CURLOPT_TIMEOUT, 20); // disconnect after 20 seconds for testing
curl_setopt($ch, CURLOPT_VERBOSE, 1); // debugging
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); // req'd to get gzip
curl_setopt($ch, CURLOPT_USERAGENT, 'tstreamer/1.0'); // req'd to get gzip
curl_exec($ch); // commence streaming
$info = curl_getinfo($ch);
var_dump($info);
non sarebbe più facile da usare e sdk per php con oauth? – chepe263
Stampa $ result per vedere come appare prima di provare a decodificarlo. – MrCode
Ora, sto facendo direttamente questo "echo $ result;". Ma nulla si presenta all'esecuzione di questo script. – Gooner