OAuth EchoでTwitpic投稿への道のり

Ken published on
7 min, 1305 words

Categories: Programming

OAuthを利用して画像を投稿したかったので、まずは画像投稿でよさげなサービスを探すことにした。 そうは言っても、ひとつひとつ調査してたら大変なので、Twitterでつぶやいてみたら、ありがたいことにアドバイスいただきました。

色々とアドバイスいただいたんだけど、重要なのは以下の2つ。

  • TweetPhotoがいいよ
  • 認証はOAuth Echoを使うのがよさそう

早速、OAuth Echoを利用し、TweetPhotoへ画像を投稿しようと思ったら・・・出来ない! 結果から言うと、TweetPhotoへの投稿は未だに出来て無くて、Twitpicへの投稿は出来たという状態。

まずは、OAuth Echoの手順を大雑把説明するとこんな感じ。

  1. OAuthの署名を作成
  2. 署名をヘッダに付けて画像を投稿

TweetPhotoへ投稿する前にTwitterへ投げて、AccessToken(OAuth Token)がもらえたら署名は間違いないだろうということで、ここから確認。ここは問題なく出来た。では、続いて画像を投稿・・・出来ない。

エラーの内容も親切ではなく、よくわからない。 http://groups.google.com/group/tweetphoto/web/upload-v2-0-api を見る限りでは、認証情報とその他ヘッダーと画像を送ればいいのかな?と思っていたのだがエラー。 しかも、このエラーが不親切で、原因を追うにも役立たず。その後、色々と調べてみるも、TweetPhotoの情報が少なく、Twitpicの情報が多いことに気付く。 そこで、Twitpicを試してみて、画像の投稿が出来れば認証も出来ていることだし、少しは切り分けに役立ちそうだったので、急遽Twitpicに変更。

実際、Twitpicの方がAPIの情報が整理されててわかりやすい! TwitpicのAPI情報: http://dev.twitpic.com/docs/2/upload/ TweetPhotoのAPI情報: http://groups.google.com/group/tweetphoto/web/upload-v2-0-api そもそも、このgoogle groupのAPI情報はオフィシャルなのか?って話はあるものの、一番有力そうに見えた。 APIが整理されてるって大事よね・・・と改めて実感(そして、軽くTweetPhotoへ疑念)。

では、Twitpicへ投稿・・・出来ない!! ディスプレイに穴が開くんじゃないかってくらい、サンプルコード(Java, PHPなど)を見比べても署名の違いはなさそう。署名でないとするとパラメータを疑うんだけど、パラメータはシンプルで間違いなさそう。 悩み疲れたので風呂にでも入るか・・・と席を立った瞬間にふと思い当たることがひとつ思い浮かんだ。 それが verify_credentials の拡張子(種類)。 XMLの方が扱いやすかったので https://api.twitter.com/1/account/verify_credentials.xml を利用していたのだが、そう言えば、サンプルコードではjsonしか見なかったな・・・と。 その場で拡張子だけをxmlからjsonに変えたらエラー内容が変わった! 今まではTwitterの認証で弾かれてる風だったのが、keyが無いと言われるようになった!

key情報がなかったのはx-www-form-urlencodedで送っていたためで、multipart-formdataに変えたら無事に投稿できました♪ 実際は、GAE/JのURLFetchでmultipartで送る方法がなさそうだったので仕方なく書いたので、一手間かかってる。

再度、拡張子をjsonからxmlに戻してもやっぱりエラーでした。 http://twitterapi.pbworks.com/Twitter-REST-API-Method%3A-account%C2%A0verify_credentials ↑こちらはxml, json両対応と書いてある。 http://dev.twitter.com/pages/oauth_echo ↑こちらはjsonしか書いてない。 ということは、OAuthの時はxml, json両対応で、OAuth Echoの場合はjsonしか対応してないってこと?

無事にTwitpic投稿が出来たので、続いてTwitter4jを使ってTwitterへtweetを・・・と思ったら、今度はこちらがエラー発生。 java.lang.NoSuchMethodError: org.apache.log4j.Logger.infoが出たり、java.lang.NoClassDefFoundError: Could not initialize class twitter4j.http.OAuthAuthorizationが出たり。 Twitpicをいじる前はtweet出来るを確認していたんだけど、その後、GAEのバージョンを1.3.4から1.3.5に変えたし、明確な原因不明。 使っていたのはstatuses/updateだけだったので、これだけ書きました。OAuth Echoの実装があったので、汎用的に修正して完了。 なんとお手軽OAuth。

まだTwitpicへの投稿で文字化けしてるし、TweetPhotoへの投稿は出来てないけど、アドバイスをいただいたおかげで方向性が定まってよかった。

最後に簡単にまとめ。

  • APIはわかりやすく明確に。
  • OAuth Echoはjsonしか対応してなさそうだよ。