Adobe AIRのTwitterクライアント

「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タイムライン


Adobe AIRのTwitterクライアント」への8件のフィードバック

  1. わさお

    Twitterクライアント制作で認証ではまってしまってまして、できれば、このプロジェクトの全貌が見えるflaファイルを見せてもらえませんか?

  2. あたがわ 投稿作成者

    To:わさおさん
    コメントありがとうございます。
    よく見たら記事には書いてないのですが、これは Flex Builder 3 で作っていまして、どうやら fla 形式での出力はできないようです。
    なので申し訳ありませんが、そのファイルをお見せすることはできません。

  3. わさお

    ありがとうございます。
    ソース部分のテキストファイルという形じゃだめでしょうか?

  4. あたがわ 投稿作成者

    To:わさおさん
    ソースをお渡しするのは良いですが、諸事情により公開するのは避けたいので、メールでご連絡いただけますでしょうか。メールアドレスは「自己紹介」のページにリンクがありますので、そこにお願いします。

  5. わさお

    お手間をおかけし申し訳ありません。
    それではよろしくお願いいたします。

  6. わさお

    すみません、「自己紹介」のページがわからず、コメント記入のところにメールアドレスの記入欄があったので、そこにアドレスを書きました。問題なかったでしょうか・・・

  7. あたがわ 投稿作成者

    To:わさおさん
    すみません。気が付きませんでした。
    準備ができ次第送らせていただきます。

  8. わさお

    メールありがとうございました。
    これを私以外の人に見せることはありません、
    あくまでFlexのMXパッケージが使えないCS3でどうにかできないかを
    研究する資料として使わせていただきます。
    もちろんこのことで迷惑をかけないよう最大限の注意を払います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です