2012-04-26 10 views
6

Sto pianificando di registrare i tweet live su un particolare argomento. Per lo stesso, sto usando l'API di flusso twitter con cURL in PHP.Utilizzo dell'uscita cURL

Ecco il codice:

<?php 

$username = "xxxxx"; 
$password = "xxxxx"; 


$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, 'https://stream.twitter.com/1/statuses/filter.json?   track=SEARCH_PARAMETER'); 
curl_setopt($ch, CURLOPT_USERPWD, $username.":".$password); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($ch); 
$jsonOBJ = json_decode ($result); 

curl_close($ch); 

print_r($jsonOBJ); 
?> 

Il mio problema è, se ho impostato CURLOPT_RETURNTRANSFER a 0, posso vedere i tweet sul terminale. Ma non sono in grado di memorizzare nella variabile $ jsonOBJ e stamparlo.

Please Help!

+0

non sarebbe più facile da usare e sdk per php con oauth? – chepe263

+0

Stampa $ result per vedere come appare prima di provare a decodificarlo. – MrCode

+0

Ora, sto facendo direttamente questo "echo $ result;". Ma nulla si presenta all'esecuzione di questo script. – Gooner

risposta

1

Sto lavorando allo stesso genere di cose :) Il problema è che quando lo si fa in un terminale, si tratta di un flusso, quindi la connessione rimane attiva finché non la si uccide. (ovvero il curl_exec() non termina)

Prova a cercare CURLOPT_PROGRESSFUNCTION e CURLOPT_READFUNCTION. Potrebbero darti qualche suggerimento.

+0

Ho aggiunto "curl_setopt ($ ch, CURLOPT_TIMEOUT, 30);" uccidere curl_exec(). Ma ancora non ci sono dati memorizzati nella variabile. – Gooner

+0

Ci sono tweet in tweet in 30 secondi? –

+0

Sì. Posso vederli stampandolo sul terminale. – Gooner

0

Ti sto solo dando una risposta mentre parti per la giornata. Sembra che dovrebbe funzionare.

Di seguito è una funzione che utilizzo dove ho passato un URL e alcuni dati XML e restituisce un array associativo che dice vero o falso per il successo e il valore di retuen come una stringa.

function do_curl($url, $data) 
    { 
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    $result = curl_exec ($ch); 

    $curl_return=array(); 

    if (!is_string($result)) 
     { 
     $curl_return['STATUS'] = FALSE; 
     $curl_return['ERRMSG'] = curl_error($ch); 
     } 
    else 
     { 
     $curl_return['STATUS'] = TRUE; 
     $curl_return['RESPONSE'] = $result; 
     } 
    curl_close($ch); 
    return $curl_return; 
    } 
4

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); 
+0

Grazie mille per il tuo suggerimento. Per ora, ho trovato un problema usando l'API di ricerca di Twitter. Ti contatterò sicuramente quando riprenderò l'API di streaming. – Gooner

+0

@Rubie_Newbie Ho aggiunto un esempio funzionante dell'API di streaming utilizzando cURL. Ho anche una versione funzionante in C#. Questa classe php [phirehose] (https://github.com/fennb/phirehose/) potrebbe interessarti anche se non supporta gzip. – drew010

1

@Reza Sanaie e altri utenti che lo trovano utile.

Ho usato l'API SEARCH TWITTER e ho anche ricevuto i tweet live. Quindi questo potrebbe essere utile. ecco il codice:

<?php 
$query = "SEARCH_PARAMETER"; 
$request = "http://search.twitter.com/search.json?q=".urlencode($query); 
$response = file_get_contents($request); 
$jsonobj = json_decode($response); 
print_r($jsonobj); 
?> 

Ho anche l'impostazione della connessione di MySQL per spingerlo nel database e questo script viene aggiunto nella crontab per automatizzare l'intero processo.