2012/01/01 (日)
ActionScriptでTwitPic API v2を利用する
as3でOAuth Echoを使ってTwitPicに画像をアップロードする方法。Twitter APIのverify_credentialsでOAuthヘッダを作ってMultiPartを投稿するという流れ。
必要なもの
- TwitPic APIのキー
- TwitPic Developers ここからregisterして発行してもらう。
- as3httpclientライブラリ
- as3httpclientlib - HTTP/HTTPS client library for Actionscript 3 - Google Project Hosting
- oauth-as3ライブラリ
- oauth-as3 - Actionscript 3 library for oAuth - Google Project Hosting
前処理
Twitter APIに対してOAuth認証する。参照: AIR/ActionScript3でTwitterのOAuthをするための必要最低限 - キノコの自省録
TwitPicへ投稿
まずTwitter APIのverify_credentialsを呼び出してOAuthヘッダに必要な情報を受け取る。基本的にはverify_credentialsのレスポンスをそのままヘッダにすればいいが、realmを付け足す必要があるのでbuildRequestの第3引数に"http://api.twitter.com/"を渡している。
ヘッダを作ったらTwitPic APIキー、画像、本文をMultipartにしてTwitPic APIへ送信する。ただしTwitPicにアップロードするだけではTwitterには投稿されないので、レスポンスに含まれる画像URLを使って別途投稿する必要がある。詳しくは後述。
コード:
static const TWITTER_API_URL:String = "http://api.twitter.com/"; static const TWITTER_VERIFY_URL:String = "https://api.twitter.com/1/account/verify_credentials.json"; static const TWITPIC_UPLOAD_URL:String = "http://api.twitpic.com/2/upload.json"; var oauthReq:OAuthRequest = new OAuthRequest("GET", TWITTER_VERIFY_URL, {}, /*consumer token*/, /*access token*/); var authHeader:URLRequestHeader = oauthReq.buildRequest(new OAuthSignatureMethod_HMAC_SHA1, OAuthRequest.RESULT_TYPE_HEADER, TWITTER_API_URL); var req:HttpRequest = new Post(); req.addHeader("X-Auth-Service-Provider", TWITTER_VERIFY_URL); req.addHeader("X-Verify-Credentials-Authorization", authHeader.value); var multipart:Multipart = new Multipart([ new Part("key", /*twitpic api key*/), new Part("media", /*image ByteArray*/, /*content-type*/, [{name: "filename", value:/*filename*/}], "binary"), new Part("message", /*message*/) ]); req.setMultipart(multipart); var client:HttpClient = new HttpClient(); client.addEventListener(HttpDataEvent.DATA, onTwitPicData); client.request(new URI(TWITPIC_UPLOAD_URL), req);
画像URLの取得
TwitPicへの投稿が成功すると画像URLを含むレスポンスが返ってくるので、HttpDataEvent.DATAイベントで受け取る。上記投稿コードではonTwitPicData関数をリスナーにしているが、この関数で例えば以下のように画像URLを得られる。
function onTwitPicData(e:HttpDataEvent):void
{
e.bytes.position = 0;
var result:String = e.readUTFBytes();
var twitpicUrl:String = result.match(/"http:\\\/\\\/twitpic.com\\\/.*?"/)[0];
twitpicUrl = twitpicUrl.replace(/"/g, "").replace(/\\\//g, "/");
/*URLを使ってTwitterに投稿するとか*/
}
resultにレスポンスのJSON文字列を入れてURLの部分を正規表現で切り出している。本当はJSONオブジェクトとして扱うべきだけど超手抜き。
Twitterへの投稿処理は次のページを参照。TwitterにOAuthで認証してつぶやくAS3コード - キノコの自省録
ちなみにhttp://api.twitpic.com/2/upload.xmlに投稿するとXMLでレスポンスが返ってくる。レスポンスのJSONやXMLは以下の形式になっている。
{ "id" : "1lad07", "text" : "test", "url" : "http:\/\/twitpic.com\/1lacuz", "width" : 220, "height" : 84, "size" : 8722, "type" : "png", "timestamp" : "Wed, 05 May 2010 16:11:48 +0000", "user" : { "id" : 12345, "screen_name" : "twitpicuser" } }
<?xml version="1.0" encoding="UTF-8"?> <image> <id>1lacuz</id> <text>test</text> <url>http://twitpic.com/1lacuz</url> <width>220</width> <height>84</height> <size>8722</size> <type>png</type> <timestamp>Wed, 05 May 2010 16:11:15 +0000</timestamp> <user> <id>12345</id> <screen_name>twitpicuser</screen_name> </user> </image>
公式ドキュメント
- 30 http://t.co/R9PJ2180
- 10 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&sqi=2&ved=0CCkQFjAA&url=http://d.hatena.ne.jp/exp777/20120101/1325362428&ei=A6h9T57dIuWriAfWl_WaCQ&usg=AFQjCNG43DsSkkLBsv65cn1CXwO3WjCPWw&sig2=HZ_OTKWzEAaM6rZqdwMVDQ
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=twitpic api&source=web&cd=1&ved=0CDAQFjAA&url=http://d.hatena.ne.jp/exp777/20120101&ctbs=qdr:m&ei=7SMNT8XtLo7UmAWiwI2HBg&usg=AFQjCNHVdut92i6u0sYjf3cpoiLiwv0dYA&sig2=dv7JLlTXv_11B6jZScWt0g&cad=rja
- 6 http://d.hatena.ne.jp/kinokorori/20100613/1276437305
- 6 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1331496347806&ved=0CDoQFjAC&url=http://d.hatena.ne.jp/exp777/20120101/1325362428&ei=mAVdT82fJeqYiAeh-IXADQ&usg=AFQjCNG43DsSkkLBsv65cn1CXwO3WjCPWw
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CD8QFjAB&url=http://d.hatena.ne.jp/exp777/20120101/1325362428&ei=XyhkT9uqMc6ZmQWSpfDRDA&usg=AFQjCNG43DsSkkLBsv65cn1CXwO3WjCPWw&sig2=fLnyl_qzXgcGBMhivfPU4w
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=twitpic url response&source=web&cd=1&ved=0CG0QFjAA&url=http://d.hatena.ne.jp/exp777/20120101/1325362428&ei=HQmyT8rBJonbiALQg72RBg&usg=AFQjCNG43DsSkkLBsv65cn1CXwO3WjCPWw
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CHIQFjAF&url=http://d.hatena.ne.jp/exp777/20120101/1325362428&ei=3CGxT7G0Ouj6mAX1uvScCQ&usg=AFQjCNG43DsSkkLBsv65cn1CXwO3WjCPWw&sig2=E7m2rmzOvpM3ZLcs7kcFsA
- 3 http://d.hatena.ne.jp/kinokorori/20100609/1276093689
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&ved=0CFkQFjAH&url=http://d.hatena.ne.jp/exp777/20120101&ei=Hj91T5ClB_HomAXmrczpDw&usg=AFQjCNHVdut92i6u0sYjf3cpoiLiwv0dYA



