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つ星 (まだ評価されていません)
読み込み中 ... 読み込み中 ...

8 個のコメント

  1. わさお
    投稿日時: 2011/1/6 木曜日、2:31 | パーマリンク

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

  2. 投稿日時: 2011/1/6 木曜日、15:44 | パーマリンク

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

  3. わさお
    投稿日時: 2011/1/6 木曜日、16:18 | パーマリンク

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

  4. 投稿日時: 2011/1/7 金曜日、3:33 | パーマリンク

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

  5. わさお
    投稿日時: 2011/1/7 金曜日、12:16 | パーマリンク

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

  6. わさお
    投稿日時: 2011/1/8 土曜日、8:27 | パーマリンク

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

  7. 投稿日時: 2011/1/9 日曜日、5:26 | パーマリンク

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

  8. わさお
    投稿日時: 2011/1/20 木曜日、22:55 | パーマリンク

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

コメントする

あなたのメールは 絶対に 公開されたり共有されたりしません。

次の HTML タグと属性が使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">

トラックバック

http://blog.atgw.org/archives/1489/trackback