OAuth EchoでTweetPhotoへアップロード

Ken published on
7 min, 1282 words

Categories: Programming

TweetPhotoへOAuth Echoを利用して写真を投稿する方法について。

TweetPhotoのAPIについてはTwitpicに比べて情報が少ない気がする。 しかも、TweetPhotoの説明がわかりづらい。 英語が苦手という理由もあるが、ひとつの情報を把握するのに、複数ページを読んだ方が安心する書き方をされている印象。

■ Basic Upload API v2.0 (Upload and UploadAndPost) - TweetPhoto Developers | Google グループ http://groups.google.com/group/tweetphoto/web/upload-v2-0-api 今回はこのBasic Upload API v2.0の場合を対象とします。

API情報

URL

  • http://tweetphotoapi.com/api/tpapi.svc/upload2

メソッド

  • POST

ヘッダ

必要なヘッダ
  • X-Auth-Service-Provider: 認証サービスプロバイダ(この場合はTwitterの認証URL)。OAuth Echo関連。
  • X-Verify-Credentials-Authorization: 署名したパラメータなど。OAuth Echo関連。
  • TPAPIKEY: TweetPhotoのAPIKey。http://admin.tweetphoto.com/ から取得。
  • TPMIMETYPE: 画像のMIMEタイプ。image/jpgとか。
  • Content-Length: 画像サイズ。
  • Content-Type: "application/x-www-form-urlencoded" にすること。

必要な場合に追加するヘッダ。

  • TPUTF8: Unicode使ってますよという印。TPMSG, TPTAGSでUTF-8を使うときに "true" を設定。
  • TPMSG: 写真につけるコメント。UTF-8の場合はBase64エンコードし、TPUTF8を忘れずに。
  • TPTAGS: 写真につけるタグ情報。 "," で区切って複数タグ可能。UTF-8の場合はBase64エンコードし、TPUTF8を忘れずに。
  • TPPOST: Twitterにポストするかしないかの判断。 "True" or "False" を指定。何も指定しないとFalse。
  • TPLAT: 緯度(latitude)。経度と共に指定。
  • TPLONG: 経度(longitude)。緯度と共に指定。

ボディ

  • 写真のバイナリデータ。Content-Typeには "application/x-www-form-urlencoded" を指定しているが、name=valueの形式ではなく、写真のバイナリデータのみ。

まとめ

  • 認証にはOAuth Echoを使った。
  • "X-" から始まる2つのヘッダはOAuth Echoで指定すべき項目。
  • 上記URLのAPI説明の "Auth" は認証が必要ということを言いたいだけであって、Authヘッダではない。
  • メッセージやタグに日本語を含む場合はBase64エンコードし、TPUTF8を有効(true)にする。
  • TPPOSTを "true" にしても "True" にしてもTwitterへは投稿されなかった。なぜ?
  • POST Bodyは写真データのみ(name=valueでいうvalueのみの感覚?)。
  • メッセージは "limited to 200 characters" と説明があるけど、日本語400文字は可能だった。
  • TweetPhotoのAPIページ(http://admin.tweetphoto.com/Api.aspx)にTwitterのOAuth Token/Secretは設定しなくても動作している。

基本的に、OAuth EchoのHTTPヘッダさえ作れればこの手のサービスはそれほど難しくなさそう。困るとしたら、レスポンスのエラーメッセージの意味がわかりづらいときがあることくらい?初めは面食らうかもしれないけど、落ち着いて読めば大丈夫な範囲。 Base64を使うとき、勝手に改行されないように気をつけた方がいいかも?

Twitpicへの投稿はmultipart/form-dataで、TweetPhotoへの投稿はapplication/x-www-form-urlencoded。同じ写真投稿と言えども、仕組みは別物。HTTPの範囲内という意味では同じだけど :|

TweetPhotoへの投稿は画像をアップロードすればいいっていう感じなんだけど、Twitpicはmultipartでアップロードする際の特性か "filename" が必要。form-data; name="name"; filename="filename" ←これ。 このfilenameが空文字列だとエラーが発生する。Twitpicが使っているライブラリが求めているだけで、Twitpicが必要としているようには見えないのだが・・・。

TweetPhotoとTwitpicの仕組が異なるせいで、抽象化しづらい。具体的には画像だけでよいと言うTweetPhotoと、filenameを必要とするTwitpic。 TwitpicとTweetPhotoを抽象化したようなクラスを作ろうと思っていたんだけど、これは抽象化せずに別物だと思った方が無理がなくていいかも?それとも、Twitpicのfilenameが "形式だけ" と推測し、ダミー文字列でもいれとくか?

Twitpic, TweetPhotoを使ってみた感想

Twitpic

  • Twitpicの方がなんか安定していそう。
  • API説明はわかりやすい。
  • API設計は古い感じ?filenameの扱いでそう思った。
  • サイトがシンプルでわかりやすい。

TweetPhoto

  • ちょっと不安定感があるかも?たまにタイムアウトしてる気がする。
  • API説明がわかりづらい。
  • APIの設計はシンプルでいい(が、API説明がわかりづらくて、シンプルと感じるまでは時間がかかった)。
  • サイトが柔らかに作ってあるせいか、色がちらついてちょっと見づらい(Twitpic見てるからって理由が大きそう)。
  • 現時点では付随情報(tag, geo)が多め。

ここ数日はTwitpic使ってたから、今度はTweetPhotoに変更して使ってみようかな。