UPDATE:これはcURLのを行うのは、実際にはかなり簡単だったが、私は間違ってそれについて初めて行きました、メッセージの最後に新しいコードを参照してください。
CURLOPT_READFUNCTION
と一緒にcURLを使用してTwitterストリームAPIを使用することができませんでしたが、fsockopen()とfread()
を使用して成功しました。なぜ私は成功の前にそれを使用しているのでreadfunctionが動作していないのか分かりませんが、レスポンスデータが "ストリーミング"であり、HTTPチャンクエンコーディングを使用して送信されていないという事実と関係があります。基本的には、私の読み取り機能が呼び出されたことがないので、データを処理できませんでした。
私は今働いている使用方法:
- 接続fsockopenのを使用して
ssl://stream.twitter.com
- から
fputs
- を使用してストリームデータのための基本的なHTTPリクエストを発行し、HTTPレスポンスヘッダを消費し、確認があったしますエラーなし
- 無限ループで
fread
を使用して金額データを読み取る
- データのチャンクが読み取られるたびに、私は(我々が1つの以上の完全なメッセージを持っている場合)には、それぞれを処理として、その後
- バッファ内のすべてのメッセージを処理しようとすると、バッファ機能がバッファ
- バッファ機能に新しいデータを追加
- 内部バッファ機能を呼び出しますメッセージは、バッファが空になるまで減らされ、関数が戻り、データが再び読み込まれます。
私は2時間前に実行していましたが、接続が切断されていませんでした。まだエラーなしで30,000件以上のメッセージを処理しました。
基本的には、完全なメッセージがバッファから読み込まれるたびに、アプリケーションがjsonメッセージでユーザ定義のコールバックを呼び出すようにコールバックシステムを実装しました。データベースへ)。
私はここにまだ短い記事を掲載していませんが、希望すれば私のプロフィールに記載されたウェブサイトに行き、連絡フォームに記入してメッセージしてください。もし誰かが興味があれば、私たちは一緒に働くことができます。私は楽しいためにこれをしただけです、私はTwitterに興味がなく、財政上の理由でそれを使用していません。私は最終的におそらくGitHubに入れます。
EDIT:
ここでは、ストリーミングAPIに接続し、それらが利用できるようコールバック関数にJSONメッセージを渡しますいくつかのcURLのコードです。この例では、帯域幅を節約するために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);
oauthを使用してphpのsdkを使用する方が簡単でしょうか? – chepe263
$ resultを出力して、デコードしようとする前にどのように見えるかを確認します。 – MrCode
今、私はこの "echo $ result;"を直接行っています。 しかし、このスクリプトの実行では何も表示されません。 – Gooner