TwitterのStreaming APIを使ってみた
少し前から、TwitterのAPIに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でパラメータを送る必要があるので俺々ライブラリ作った方が楽ですね。