さわっても熱くない花火

ちょっとした驚きを食べながら生きています

FlashでTwitterのUserStreamsを受信してみる

ひょんな事から、TwitterのUserstreamをFlashで受信するというタスクが降ってきたので、それのメモ。

やりたいこと

TwitterのDMをリアルタイムに受信したい!

方法

何かイケてるライブラリがあるのかなぁ
とか思って気軽に引き受けたのですが…無いんだなぁーこれが。
ってことで、色々と書かないと実装できないみたいです。

OAuth認証の実装

とりあえずOAuth認証がめんどっちぃですね。
まぁ、良い具合なBlog記事を見つけたので、それを参考に実装してみます。
FlashからOAuth認証でTwitterから発言できるのか? | RIAブログ

以下のライブラリが必要らしいです

ライブラリいっぱいですね。


あと、ライブラリの本家サンプルも参考にしました
High level AS3/Flex library for OAuth with Twitter from AIR « Sönke Rohde


とりあえず、OAuthはめんどそうなので、テスト用のスクリプトを書き書きしてみました。
メインのFlashには、Button2つ(mybutton,tweet)と入力可能なTextField(mytext)をおいています。
別ファイルとしてasファイルを用意し、そこにテスト用のクラスTestOAuthを書きました。


以下ソースコードの垂れ流し

TestOAuth.as

package
{
	import org.iotashan.oauth.*;
	import org.iotashan.utils.*;
	import org.httpclient.*;
	import com.hurlant.crypto.Crypto;
	import org.flaircode.oauth.*;
	import org.httpclient.http.*;
	import org.httpclient.events.*;
	
	import flash.net.*;
	import flash.events.*;
	import com.adobe.net.URI;

	
	
	public class TestOAuth
	{
		private var consumerKey = "hogehoge";
		private var consumerSecret = "hogehogehogehogehoge";
		private var oauth;
		private var requestToken:OAuthToken;
		
		public var accessToken;
		
		
		public function TestOAuth(myAccessToken)
		{
			accessToken=OAuthUtil.getTokenFromResponse(myAccessToken);
			oauth = new OAuth(consumerKey, consumerSecret);
		}
		
		public function getPIN():void
		{
			var loader = oauth.getRequestToken("http://twitter.com/oauth/request_token");
			loader.addEventListener(Event.COMPLETE, requestTokenHandler);
		}
		
		private function requestTokenHandler(e:Event):void
		{
			requestToken = OAuthUtil.getTokenFromResponse(e.currentTarget.data as String);
			var request:URLRequest = oauth.getAuthorizeRequest("http://twitter.com/oauth/authorize", requestToken.key);
			navigateToURL(request, "_blank");
		}
		
		
		public function getAccessToken(pin:Number):void
		{
			var loader:URLLoader = oauth.getAccessToken("http://twitter.com/oauth/access_token", requestToken, {oauth_verifier:pin});
			loader.addEventListener(Event.COMPLETE, accessTokenHandler);
		}
		
		
		private function accessTokenHandler(e:Event):void
		{
			accessToken = OAuthUtil.getTokenFromResponse(e.currentTarget.data as String);
			trace(e.currentTarget.data as String);
			// TODO store accessToken.key and accessToken.secret in EncryptedLocalStorage for all further requests
		}
		
		public function doTweet()
		{
			var consumerToken:OAuthConsumer = new OAuthConsumer(consumerKey, consumerSecret);
			var oauthReq:OAuthRequest = new OAuthRequest("POST", "http://api.twitter.com/1/statuses/update.xml", {oauth_version: "1.0", status: "ついーとのてすとだよ!"}, consumerToken, accessToken);
			var auth:String = oauthReq.buildRequest(new OAuthSignatureMethod_HMAC_SHA1, OAuthRequest.RESULT_TYPE_POST);
			auth = auth.split("&").join("\",");
			auth = auth.split("=").join("=\"");
			auth = auth.replace(/,status=.*/, "");
			var authHeader:URLRequestHeader = new URLRequestHeader("Authorization", "OAuth " + auth);
			var req:HttpRequest = new Post();
			req.addHeader("Authorization",authHeader.value);
			req.setFormData([{
				name:"status",
				value:"ついーとのてすとだよ!"
			}]);
			var client:HttpClient = new HttpClient();
			client.addEventListener(HttpRequestEvent.COMPLETE, twtcomp);
			client.request(new URI("http://api.twitter.com/1/statuses/update.xml"), req);

		}
		
		
		private function twtcomp(e)
		{
			//ツイートが完了したら呼ばれるイベント
		}
		
	}
}


test.flaのフレームにおけるアクションスクリプト

import fl.accessibility.ButtonAccImpl; 
ButtonAccImpl.enableAccessibility();


mybutton.addEventListener(MouseEvent.CLICK , submitDown);

tweet.addEventListener(MouseEvent.CLICK , tweetClick);

var test:TestOAuth = new TestOAuth("OAuthのアクセストークン。得る前はとりあえず空文字を入れとく");
test.getPIN(); //アクセストークンを得てたら不必要


stop();


function submitDown(e)
{
	test.getAccessToken(Number(mytext.text));
	//実行すると、traceを使ってアクセストークンを出力します
}

function tweetClick(e)
{
	test.doTweet();
}

あれ…

OAuthを書いてたら、1日がつぶれた…
やっぱりFlashはよく分からないねー(IDE周りで結構苦労した;;;)
DMの受信はまた今度って事にしよう。