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);
не будет проще в использовании и sdk для php с oauth? – chepe263
Распечатайте $ result, чтобы увидеть, как он выглядит, прежде чем пытаться его декодировать. – MrCode
Теперь я прямо делаю это «echo $ result;». Но ничего не происходит при выполнении этого скрипта. – Gooner