Twitter API1.1で画像付きツイートしてみる
2016-05-26だいぶ前にTwitterAPI1.1で画像付きのツイートをする方法について個人のブログに書きましたが、ほとんど反応がなかったのでこちらに書いてみます。
実装環境
まず、以下の条件下での方法ですので、ご確認ください。
- フレームワークは CakePHP 2.3.10
- APIとのやりとりにはOAuth consumers for CakePHPを使用
OAuth consumers for CakePHPでは基本的に以下のような形でAPIとやりとりします。
<?php
$client = new OAuthClient(
$ck, // アプリケーションのConsumer key
$cs // アプリケーションのConsumer secret
);
$client->post(
$at, // アプリケーションのaccess token
$ats, // アプリケーションのaccess token secret
$api_url, // 各種APIのリソースURL
$params // 各種APIに必要なパラメータ
);
例えば、普通にツイートするときは次のようになります。
<?php
$client->post(
$at, // アプリケーションのaccess token
$ats, // アプリケーションのaccess token secret
'https://api.twitter.com/1.1/statuses/update.json',
array(
'status' => 'Tweet内容'
)
);
画像を1枚添付してツイートする
では、画像を1枚添付する場合は、リソースURLが
https://api.twitter.com/1.1/statuses/update_with_media.json
ですので、以下のようにします。
<?php
$client->postMultipartFormData(
$at, // アプリケーションのaccess token
$ats, // アプリケーションのaccess token secret
'https://api.twitter.com/1.1/statuses/update_with_media.json',
array(
'media[]' => '添付する画像へのパス'
),
array(
'status' => 'Tweet内容'
),
);
注意したいのが、普通にツイートする場合と違って、 OAuthClient の post ではなく postMultipartFormData を使うという点です。 ここに気付かなくて大分苦労しました。
※追記 コメント欄にてご指摘いただきました通り、 TwitterAPIの公式リファレンス POST statuses/update_with_media (deprecated) | Twitter Developers では、update_with_mediaのAPIがdeprecated(非推奨)となっていますので、画像1枚の場合も後述する方法を用いたほうが良さそうです。 @riocamposさん、ありがとうございました。
画像を複数枚(最大4枚)添付してツイートする
1枚の画像がこれでいけるなら、複数画像の場合はarray()の中に追加すればいいんじゃないかと思うところですが、残念ながらそれはできません。。 なので、画像を複数添付する場合は、別の方法を使います。
簡単に手順を書くと、
- Twitterに画像をアップロードして、その画像固有のIDを取得する
- 取得したIDをカンマ(,)で結合する
- 通常のツイートのパラメータに、結合した文字列を渡す
1.Twitterに画像をアップロードして、その画像固有のIDを取得する
では、まず手順1。
画像アップロードのリソースURLは
https://upload.twitter.com/1.1/media/upload.json
です。
<?php
$res = $client->postMultipartFormData(
$at, // アプリケーションのaccess token
$ats, // アプリケーションのaccess token secret
'https://upload.twitter.com/1.1/media/upload.json',
array(
'media' => '添付する画像へのパス'
),
);
ここで注意したいのは、先程と同様に post ではなく postMultipartFormData を使うという点と、 パラメータの名前が media[] ではなく media であるという点です。
2.取得したIDをカンマ(,)で結合する
正常にアップロードが完了すると、json形式でレスポンスが取れるので、その中からmedia_idを取得します。
<?php
$res_obj = json_decode( $res );
$media_id = $res_obj->media_id;
これを画像の枚数分繰り返して、取得したmedia_idをカンマ(,)で結合するのが手順2となります。(現状、4枚まで添付可能です。)
3.通常のツイートのパラメータに、結合した文字列を渡す
あとは、一番最初に紹介した普通にツイートする際のパラメータに、結合した文字列を追加するだけです。
<?php
$client->post(
$at, // アプリケーションのaccess token
$ats, // アプリケーションのaccess token secret
'https://api.twitter.com/1.1/statuses/update.json',
array(
'status' => 'Tweet内容',
'media_ids' => 'mediaID01,mediaID02,mediaID03'
)
);
以上が、Twitter API1.1画像付きツイートする方法でした。
comments powered by Disqus