OAuth EchoでTweetPhotoへアップロード
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に変更して使ってみようかな。