ひょんな事から、TwitterのUserstreamをFlashで受信するというタスクが降ってきたので、それのメモ。
やりたいこと
TwitterのDMをリアルタイムに受信したい!
方法
何かイケてるライブラリがあるのかなぁ
とか思って気軽に引き受けたのですが…無いんだなぁーこれが。
ってことで、色々と書かないと実装できないみたいです。
OAuth認証の実装
とりあえずOAuth認証がめんどっちぃですね。
まぁ、良い具合なBlog記事を見つけたので、それを参考に実装してみます。
FlashからOAuth認証でTwitterから発言できるのか? | RIAブログ
以下のライブラリが必要らしいです
- Flex 3 SDK
- OAuth Actionscript library
- なぜかDownloadsに何も無いので、仕方が無くcygwinからsvnを叩くことに…
- svn checkout http://oauth-as3.googlecode.com/svn/trunk/ oauth-as3-read-only
- as3httpclientlib
- swcファイルって何だろう…と思ってググってみたら、こういうファイルらしいです。
- FlashDevelopの使い方 (13)SWC形式のライブラリを使用する3種類の方法 - 独学ActionScript
- srohde/OAuth · GitHub
- as3corelib
- as3crypto
ライブラリいっぱいですね。
あと、ライブラリの本家サンプルも参考にしました
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の受信はまた今度って事にしよう。