exp777.hatenablog.com

頭の中はゲームでいっぱい

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

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>