2010年11月26日

[Android] なんとなく使えるOAuth-Echo

記事タイトルに[Android]とつけましたが、たぶんAndroidに限った話ではないと思います。
が、Androidでしかやったことないので、とりあえず[Android]とつけています。

職場でTwitPicへの投稿機能を実装することになりました。
ざっとインターネットで調べてみた限りでは、そこまで難しくなさそうでした。
ただ、実際にやってみたら思っていた以上に時間がかかってしまいました。
そこで学習したことを忘れないようにメモっておきたいと思います。

TwitPicのリファレンスはこちら。
 http://dev.twitpic.com/docs/2/upload/

◆OAuth-Echoのざっくりとした使い方!(TwitPic編)

(1) http://api.twitter.com/version/account/verify_credentials.json のリクエスト(GET)を用意する。
  ※レスポンスのフォーマットはjsonじゃないとだめ(たぶん)。

(2) (1)にOAuth認証する。
  つまり、OAuthConsumer.sign()する。

(3) (2)からヘッダ(Authorization)を取り出す。
  たぶん↓こんなのが取れる。
   OAuth oauth_consumer_key="〜",
   oauth_signature_method="HMAC-SHA1",
   oauth_token="〜",
   oauth_timestamp="〜",
   oauth_nonce="〜",
   oauth_version="1.0",
   oauth_signature="〜"

(4) (3)に以下の文字列を連結する。
  , realm="http://api.twitter.com/"

  ※こんな↓感じになる。
   OAuth oauth_consumer_key="〜",
   oauth_signature_method="HMAC-SHA1",
   oauth_token="〜",
   oauth_timestamp="〜",
   oauth_nonce="〜",
   oauth_version="1.0",
   oauth_signature="〜",
   realm="http://api.twitter.com/"


(5) http://api.twitpic.com/2/upload.(xml or json) のリクエスト(POST)を用意する。
  こちらはxmlでもjsonでもだいじょーぶ。

(6) (5)に以下のヘッダを追加する。
  X-Auth-Service-Provider: https://api.twitter.com/1/account/verify_credentials.json
  ※このURLは(1)と一致していること!

(7) (6)にさらに以下のヘッダを追加する。
  X-Verify-Credentials-Authorization: (4)の内容

(8) (7)に以下のパラメータを指定する。MultipartFormDataで。
  key=(TwitPicでアプリ登録して取得しておく)
  message=(登録するメッセージ。空文字でもOKみたい)
  media=(投稿する写真データ)

  ※mediaはhttpmime4.0.3のFileBodyを使った。他はStringBody。
   InputStreamBodyでもいけると思ったけどRepeatableなんとかがどうのこうのでよくわからんかった…。

(9) (8)のリクエストを投げてレスポンスを受ける。
  成功すればURLを含むxml or jsonが返ってくるので適当にうまいことやる。
  以上!


僕は(6)の部分でひっかかっていました。
(1)の部分は結構前に作ってあって、それをそのまま使ったのですが、リクエストしたフォーマットがxmlだったのです。
よくよく考えればすぐ気づいても良かったと思うんですけど、OAuth-Echoが初めてだったというのもあって手探りでした。

TwitPicの動きを予想すると、(9)で受け取った(4)のヘッダーを使ってTwitterからユーザ情報を取ってきて、ちゃんとTwitterのユーザだったら、投稿を受け付けるということをしているんだと思います。
そのとき使うのが(5)のURLで認証されたものでないとだめなので、(1)と(5)は一致している必要があるわけです。きっと。たぶん。

今回はサンプルありません。
あと上の手順は記憶を頼りに書いたので、実際には別の手順も必要だったかもしれません。何か手順が抜けていたらご指摘ください。
これを読んでくれた人の参考になれば幸いです。
posted by t2low at 07:53| Android