Twitter API v2 では画像付きツイート、というか画像(メディア)のアップロードが出来ないらしい件
v1 でもやったことないけど。
他の SNS などの API を見ていると、
- まず画像をアップロードする API に画像 post してレスポンスの media_id みたいなものを取得する
- 投稿する API に、text と media_id を渡して呼び出す
って感じなんだろうな、とは思っていた。
で Twitter API では、v1 時代にが画像付き投稿を行う API があったようだが、現在それは廃止されており、また、v2 では画像をアップロードする API がないとのことで詰み?と思われた。
が、v1 API で画像をアップロードして media_id を得て、v2 API で投稿時に media_id を添える、という workaround があることを知った。
ただ、気になるのは認証の部分で、v1 では OAuth1.0 を、v2 では OAuth2.0 を使う必要があり、「え、画像投稿のためにユーザーにもう一度認証させる必要があるの?」という点がよく分からない点だ。
上記の tweepy の例では consumer_key, consumer_secret を指定しているので、開発者のアカウントで画像投稿するのでは?と思っている。
ユーザーのアカウントで 画像投稿するには??
一方で、下記の例では、v2 で取得した? OAuth の access token で画像のアップロードと投稿ができているようなので、試してみる。
一方で、下記の例では、v2 で取得した? OAuth の access token で画像のアップロードと投稿ができているようなので、試してみる。
403 エラーになるなあ。
$ACCESS_TOKEN = fkel54mADSl4wl5mzmk.... ## OAuth2 で取得した access token
curl -X POST https://api.twitter.com/2/tweets -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-type: application/json" -d '{"text": "Tweeting with media!"}'
-> OK, ツイート成功。
curl -X POST https://upload.twitter.com/1.1/media/upload.json -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-type: application/json" -d '{"media_data": "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="}'
-> NG(403)
Twitter API での画像付き投稿、
画像upはv1のみ可、OAuth1のtokenのみ可
投稿はv2のみ可、OAuth1,2どちらのtokenでも可
という結果。つまりOAuth1.0を使うしかない。なんじゃこれ。
OAuth2.0の refresh token が access token と同じ時間で expire しちゃうのだけど誰も困ってないの? と思ってたけど、みんな OAuth2.0 に事実上移行できてないのでは説あるコアトル。
ともあれ、
- 認証は OAuth1.0 でやる
- 得られた accessToken, secretToken を使い、
- v1 API で画像をアップロードして id を取得
- v2 API で画像とテキストをパラメータにして投稿
ができた。
前述の
を使用した。