「tC」と命名。OAuthのアプリケーション登録で空いてたから。ただそれだけ。twitterClientってことです。でも「twitter」が含まれる名前には出来ませんでした。
そして、今のところはこんな感じ。
設定画面(OAuthの暗証番号入力する画面)。
OAuthはシグネチャの生成が非常に面倒でした。
as3corelib と as3crypto を使って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 追加
Twitterクライアント制作で認証ではまってしまってまして、できれば、このプロジェクトの全貌が見えるflaファイルを見せてもらえませんか?
To:わさおさん
コメントありがとうございます。
よく見たら記事には書いてないのですが、これは Flex Builder 3 で作っていまして、どうやら fla 形式での出力はできないようです。
なので申し訳ありませんが、そのファイルをお見せすることはできません。
ありがとうございます。
ソース部分のテキストファイルという形じゃだめでしょうか?
To:わさおさん
ソースをお渡しするのは良いですが、諸事情により公開するのは避けたいので、メールでご連絡いただけますでしょうか。メールアドレスは「自己紹介」のページにリンクがありますので、そこにお願いします。
お手間をおかけし申し訳ありません。
それではよろしくお願いいたします。
すみません、「自己紹介」のページがわからず、コメント記入のところにメールアドレスの記入欄があったので、そこにアドレスを書きました。問題なかったでしょうか・・・
To:わさおさん
すみません。気が付きませんでした。
準備ができ次第送らせていただきます。
メールありがとうございました。
これを私以外の人に見せることはありません、
あくまでFlexのMXパッケージが使えないCS3でどうにかできないかを
研究する資料として使わせていただきます。
もちろんこのことで迷惑をかけないよう最大限の注意を払います。