Adobe AIRのTwitterクライアント

カテゴリー: パソコンの話
このエントリをはてなブックマークに追加 このエントリをdel.icio.usに追加 このエントリをLivedoor Clipに追加 このエントリをYahoo!ブックマークに追加 このエントリをFC2ブックマークに追加 このエントリをNifty Clipに追加 このエントリをPOOKMARK. Airlinesに追加 このエントリをBuzzurl(バザール)に追加 このエントリをChoixに追加 このエントリをnewsingに追加

「tC」と命名。OAuthのアプリケーション登録で空いてたから。ただそれだけ。twitterClientってことです。でも「twitter」が含まれる名前には出来ませんでした。
そして、今のところはこんな感じ。

2010年1月13日tCタイムライン
タイムライン。

2010年1月13日tC設定
設定画面(OAuthの暗証番号入力する画面)。

OAuthはシグネチャの生成が非常に面倒でした。
as3corelibas3crypto を使ってHMAC-SHA1とかやりました。たぶん、as3cryptoだけでも出来るんじゃないかな?とか思ったり。
なぜ両方使ったかと言うと、初めにas3corelibを発見し、HMAC-SHA1のダイジェスト値の生成には成功したのですが、戻り値がバイナリのHEXがStringで返ってくるので、それをバイナリにしてbase64encodeしないといけないので、そこでas3cryptoを使ったわけです。ついでにbase64encodeも、こっちのほうが扱いやすかったので、こちらのものを使いました。
で、シグネチャ生成部分のコードはこんな感じ。

// (OAuth)シグネチャ生成
private function oAuthCreateSignature(requestMethod:String, requestUrl:String, param:Array, secret:String="", token:String=""):String
{
	param = param.sort();
	paramString = "";
	param.forEach(createParamString);
	paramString = paramString.replace(/&$/g, "");
	var signatureHmac:String = Base64.encodeByteArray(Hex.toArray(
		HMAC.hash(secret + "&" + token, encodeURIComponent(requestMethod) + "&" + encodeURIComponent(requestUrl) + "&" + encodeURIComponent(paramString), SHA1)
	));
	return signatureHmac;
}
private function createParamString(element:*, index:int, arr:Array):void {
	paramString += element+"&";
}

この関数にMethodとURL、パラメータ、secretを渡してやればいいわけです。
なんか、引数の定義のところでtoken:Stringとか書いてますが、これは私の勘違いですね(汗)。両方ともsecretです。TwitterならConsumer secretと、oauth_token_secretって感じでしょうか。Request token取得時にはoauth_token_secretはいらないですね。Consumer secretは絶対に入るはずなので secret:String=”" とやる必要もないかもしれません。
Arrayで渡されたパラメータをソートして、&でつないでます

// シグネチャ生成
var consumerKey:String = "123aBc456DeF"; // Consumer key
var consumerSecret:String = "ABC987def654"; // Consumer secret
var oAuthToken:String = "ABC987def654"; // OAuth token
var oAuthTokenSecret:String = "ABC987def654"; // OAuth token secret
var unixTime:String = (Math.floor(new Date().getTime()/1000)).toString();
var nonce:String = MD5.hash(MD5.hash(unixTime) + MD5.hash((Math.floor(Math.random()*4096)+1).toString()));
var param:Array = new Array();
param.push("oauth_consumer_key="+consumerKey);
param.push("oauth_nonce="+nonce);
param.push("oauth_signature_method=HMAC-SHA1");
param.push("oauth_timestamp="+unixTime);
param.push("oauth_token="+oAuthToken);
param.push("oauth_version=1.0");
var signatureHmac:String = oAuthCreateSignature(METHOD, URL, param, consumerSecret, oAuthTokenSecret);

どっかから関数をこんな感じで呼び出してやればOKです。Nonce(一意の文字列)は乱数と時間でMD5でHash化して適当に生成してます。
HTTP Request時のパラメータが増える場合は param.push() してやればOKです。関数側でソートしているので、pushする順番はあまり気にしなくてもOKです。

シグネチャを生成した後もいろいろ苦労しました。が、いろいろやっているうちにできたので、よしとします(笑)。
意見やわからないことなどがありましたら、コメント or メールで。

追記(’10/1/14)
最新の状態の Screen Shot 追加
2010年1月14日tCタイムライン

1つ星2つ星3つ星4つ星5つ星 (まだ評価されていません)
読み込み中 ... 読み込み中 ...

コメントを投稿

メールアドレスは絶対に公開されません。