更新: メッセージの最後にある新しいコードを参照してください。これは実際には cURL を使用すると非常に簡単に実行できましたが、最初は間違って実行しました。
cURL と a を併用して Twitter ストリーム API を動作させることはできませんでしたが、CURLOPT_READFUNCTION
fsockopen ()とfread()
. 以前に使用して成功したため、 readfunction が機能しなかった理由はわかりませんが、応答データが「ストリーミング」されており、HTTP チャンクエンコーディングを使用して送信されていないという事実に関係しているに違いありません。基本的に、読み取り関数が呼び出されなかったため、データを処理できませんでした。
私が使用した方法は現在機能しています:
- fsockopen を使用して接続する
ssl://stream.twitter.com
- を使用して、ストリーム データの基本的な HTTP 要求を発行します。
fputs
- HTTP 応答ヘッダーを使用して、エラーがないことを確認します
fread
無限ループで使用する金額データを読み取る
- データのチャンクが読み取られるたびに、内部バッファー関数を呼び出します
- バッファ関数は新しいデータをバッファに追加します
- バッファ関数は、バッファ内のすべてのメッセージを処理しようとします (1 つ以上の完全なメッセージがある場合)。
- 各メッセージを処理するときに、バッファが空になるまでバッファが縮小され、その後関数が戻り、データが再度読み取られます
数時間実行しましたが、接続が切断されることはなく、30,000 件を超えるメッセージを処理しましたが、まだエラーは発生していません。
基本的にはコールバック システムを実装して、バッファから完全なメッセージが読み取られるたびに、json メッセージを使用してユーザー定義のコールバックを呼び出し、アプリケーションがメッセージに対して必要なこと (データベースへの挿入など) を実行できるようにしました。
ここに投稿する短いスニペットはまだありませんが、必要に応じて、プロフィールに記載されている Web サイトにアクセスし、連絡先フォームに記入してメッセージを送信してください。共有させていただきます. 興味のある方がいらっしゃればご一緒できるかもしれません。私は楽しみのためにこれをやっただけです.私はTwitterに興味がなく、経済的な理由で使用していません. おそらく最終的には GitHub に配置します。
編集:
ストリーミング 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);