User Streams APIをJavaScriptから利用する方法についての情報が非常に少なかったのでメモ。利用にはXMLHttpRequestでクロスドメイン通信可能な環境が必要です。今回はGoogle Chromeの拡張機能にあるBackground Pageを前提として説明します。
OAuth認証
OAuth認証は以前の記事でTwitter APIの呼び出しとして説明している方法と同じです。
接続
接続は普通にXMLHttpRequestを利用すれば問題ありません。
問題になるのはデータを受信する方法です。他の言語でUser Streams APIを利用する場合、データを受け取るたびにコールバック関数が呼ばれ、そこで新たに受信したデータを処理するという方法が利用されますが、JavaScriptではこの方法を利用することができません。
そのため、XMLHttpRequestオブジェクトのresponseTextを定期的に確認し、新着データが無いか確認することで接続を維持したまま処理していきます。また、これだけだとresponseTextがどんどん伸びてメモリを大量に消費してしまうため、ある程度の量を受信したら接続を切断してresponseTextを解放してやる必要があります。
切断・再接続
User Streamsの接続が切断された場合、再接続して再びデータを受信できるように復帰する必要がありますが、何も考えずに再接続するような実装だとTwitter側でエラーが発生した場合にTwitterに攻撃を仕掛けているような状態になってしまいます。
そのため、エラーによって切断された場合には少し待ってから再接続するようにします。再接続までの待ち時間は公式のドキュメントで示されており、初回は20から40秒で、連続して失敗するたびに待ち時間を倍にしていき、最大で240から300秒待つとされています。
ソースコード
これらの点を踏まえて実装してみたのが以下のコードです。やり方が分かってしまえば大したことはないですね。
おわりに
拙作のTwitterRealtimeNotificationというChrome拡張でこの手法を実際に利用しているので、合わせて見ると分かりやすいかもしれません。
GitHub