まめ畑

ゆるゆると書いていきます

TwitterのStreaming APIを使ってみた

少し前から、TwitterAPIにStreaming APIというものが実験的に追加されました。
これは、今までのAPIではXMLを取得する度に接続して切断してという処理を行っていましたが、このAPIはPUSH型で接続した後は接続がクローズされるまで情報が連続的に送られてきます。
公式Wiki: Sign in with your Twitter account | Twitter Developers
認証はBASIC認証のみに対応しており、HTTPでアクセスします。

詳細はWikiを参照した方が新しい情報を取得できます。
アクセスする際には、レスポンスを順次扱えるライブラリなどが必要なのですが、FlexのHTTPServiceでは逐次情報が取れなかったので、Socketを使って簡単に書いてみました。
Streaming API用の簡単なライブラリを作ったほうが便利と思ったので、今度つくろうと思います(ライブラリで既に出来るかもしれないですが・・・)


ランダムにPublic TLを取得するsampleAPIを使用して作ってみました。

とりあえず流してみました。


socketを使用してStreaming APIにアクセスするコード(XMLの処理がごり押しですが・・・)

private var sock:Socket;

private const regex:RegExp = /<text>(.+)<\/text>/;

        
private function init():void{
    sock = new Socket();
    sock.addEventListener(Event.CONNECT, connectHandler);
    sock.addEventListener(IOErrorEvent.IO_ERROR, function():void{trace("ERROR");});
    sock.addEventListener(ProgressEvent.SOCKET_DATA, handleData);
    sock.connect("stream.twitter.com", 80);

}

private function connectHandler(event:Event):void{
    sock.writeUTFBytes("GET /1/statuses/sample.xml HTTP/1.1\r\n");   //APIのアドレス
    sock.writeUTFBytes("Host: stream.twitter.com\r\n");
    sock.writeUTFBytes("Authorization: Basic BASICのあれ\r\n");
    sock.writeUTFBytes("\r\n");
    sock.flush();
}

private function handleData(event:ProgressEvent):void{
    var text:Array = (sock.readUTFBytes(sock.bytesAvailable)).match(regex);
    if(text == null || text[1] == null) return;
    trace(text[1]);   //ここにPOSTが入ってるはず
}

private function closeConnection():void{
    sock.close();
}

他のAPIはPOSTでパラメータを送る必要があるので俺々ライブラリ作った方が楽ですね。