ひょんな事から、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の受信はまた今度って事にしよう。