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>