2012-04-26 2 views
6

Я планирую записывать живые твиты по определенной теме. Тем не менее, я использую API потока twitter с cURL в PHP.Использование вывода cURL

Вот код:

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

Моя проблема, если я изложу CURLOPT_RETURNTRANSFER 0, я могу видеть твиты на терминале. Но я не могу хранить в переменной $ jsonOBJ и печатать ее.

Пожалуйста, помогите!

+0

не будет проще в использовании и sdk для php с oauth? – chepe263

+0

Распечатайте $ result, чтобы увидеть, как он выглядит, прежде чем пытаться его декодировать. – MrCode

+0

Теперь я прямо делаю это «echo $ result;». Но ничего не происходит при выполнении этого скрипта. – Gooner

ответ

1

Я тоже работаю над тем же ... Проблема заключается в том, что когда вы делаете это в терминале, это поток, поэтому соединение остается живым до тех пор, пока вы его не убьете. (т. е. curl_exec() не завершается)

Попробуйте выполнить CURLOPT_PROGRESSFUNCTION и CURLOPT_READFUNCTION. Они могут дать вам несколько намеков.

+0

Я добавил «curl_setopt ($ ch, CURLOPT_TIMEOUT, 30);» чтобы убить curl_exec(). Но все же нет данных, хранящихся в переменной. – Gooner

+0

Есть ли твиты в твиттере за эти 30 секунд? –

+0

Да. Я могу их увидеть, распечатав его на терминале. – Gooner

0

Я просто бросаю вам ответ, оставляя на день. Похоже, это должно сработать.

Ниже приведена функция, которую я использую, когда передаю ей URL-адрес и некоторые XML-данные, и возвращает ассоциативный массив, говорящий true или false для успеха, и значение retuen в виде строки.

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: Смотрите новый код в конце сообщения, это было на самом деле очень легко сделать с помощью Curl, но я пошел об этом неправильно в первый раз.

Мне не удалось заставить API потока Twitter работать с использованием cURL в сочетании с CURLOPT_READFUNCTION, но с успехом использовали fsockopen() и fread(). Я не уверен, почему функция чтения не работала, поскольку я использовал ее раньше, но она должна иметь какое-то отношение к тому факту, что данные ответа «потоковые» и не отправляются с использованием кодированной HTTP-кодировки. По сути, моя функция чтения никогда не вызывалась, поэтому я не мог обработать данные.

Метод, который я использовал, который работает в настоящее время:

  • Connect с использованием fsockopen для ssl://stream.twitter.com
  • Выпуска основного запроса HTTP для потоковых данных с использованием fputs
  • Потребляйте заголовки ответа HTTP и убедитесь, что было нет ошибок
  • Прочитать данные о количестве, используя fread в бесконечном цикле
  • Каждый раз, когда считывается фрагмент данных, Я называю внутреннюю функцию буферной
  • Функция буфера, добавляет новые данные в буфер
  • функция буфера затем пытается обработать все сообщения в буфере (если у нас есть 1 или более полные сообщения)
  • Как он обрабатывает каждый сообщение буфера уменьшается до тех пор, пока он не будет пуст, а затем функция вернется и данные будут считаны снова.

У меня было это на пару часов и у меня не было сброшенного соединения, и я обработано более 30 000 сообщений без ошибок.

В основном я реализовал систему обратного вызова, так что каждый раз, когда полное сообщение считывается из буфера, он вызывает пользовательский обратный вызов с сообщением json, чтобы приложение могло делать все, что ему нужно, с сообщением (например, вставить к базе данных).

У меня нет никаких коротких фрагментов, чтобы опубликовать их здесь, но если вы хотите, напишите мне, перейдя на сайт, указанный в моем профиле, и заполните контактную форму, и я был бы рад поделиться. Может быть, мы сможем работать вместе, если кому-то это интересно. Я только сделал это для удовольствия, у меня нет интереса к Твиттеру и я не использую его по финансовым соображениям. Возможно, я положу это на GitHub.

EDIT:

Вот некоторые Curl код, который будет подключаться к потоковым API и передать JSON сообщений на функцию обратного вызова, поскольку они доступны. В этом примере используется gzip-кодирование для экономии полосы пропускания.

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

Большое спасибо за ваше предложение. На данный момент я нашел работу, используя API поиска twitter. Я обязательно свяжусь с вами, когда снова займу потоковый API. – Gooner

+0

@Rubie_Newbie Я добавил рабочий пример потокового API, используя cURL. У меня также есть рабочая версия на C#. Этот php-класс [phirehose] (https://github.com/fennb/phirehose/) может вас заинтересовать, хотя он не поддерживает gzip. – drew010

1

@Reza Sanaie и другие, которые могут найти это полезным.

Я использовал API ПОИСКОВ TWITTER и получаю живые твиты. Так что это может быть полезно. Вот код:

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

У меня также есть настройка подключения MySQL, чтобы подтолкнуть его в базу данных, и этот скрипт добавлен в кронтабе автоматизировать весь процесс.