Skip to main content

2 posts tagged with "TwitPic"

View All Tags

· 7 min read

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

メソッド

  • 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に変更して使ってみようかな。

· 7 min read

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しか対応してなさそうだよ。