【php】twitterのREST APIで画像付きツイートをする
問題
twitterの REST APIの statuses/update_with_media で、画像つきツイートをしたい。

答え
OAuthするので、既存のライブラリを使うのが手軽でしょう。
statuses/update_with_mediaで画像付きツイートをするには、いくつか注意が必要。
- statuses/update_with_mediaは唯一、他のAPIと違って、upload.twitter.comを使う。画像なしの通常のツイートはapi.twitter.comの方を使うこと。
- multipartなPOSTをするので、OAuth認証周りも他のAPIとちょっと違う。
- POSTパラメータやクエリ文字列でのパラメータは、OAuthの署名文字列の算出に使用しない。OAuthのためのoauth_*のパラメータのみを使って算出する。
- 投稿できるファイル最大サイズは、help/configurationの"photo_size_limit"で取得できる。
- 投稿できるファイルの最大数は(現在1つだけだが)、help/configurationの"max_media_per_upload"で取得できる。
- 1日に投稿できるファイルの数がユーザー個別にあって、詳細はstatuses/update_with_mediaのレスポンスヘッダで通知される。
twitteroauthもよいのですが、画像付きツイートができなさそう。multipart/form-dataなPOSTができないようだ。
tmhOAuthは大丈夫。multipart/form-dataのPOSTに対応していて、画像付きツイートができる。
//ファイルひとつ読み込むだけで済むのはよいですね
require '../tmhOAuth.php';
$tmhOAuth = new tmhOAuth(array(
'consumer_key' => 'YOUR_CONSUMER_KEY',
'consumer_secret' => 'YOUR_CONSUMER_SECRET',
'user_token' => 'AN_ACCESS_TOKEN',
'user_secret' => 'AN_ACCESS_TOKEN_SECRET',
));
// ↓画像ファイル名をべた書きしているが、適宜書き換えたり、動的に変更したりできる
// 例)アップロードファイル受け付けの場合 "@{$_FILES['image']['tmp_name']};type={$_FILES['image']['type']};filename={$_FILES['image']['name']}",
$image = './sample.jpg';
$code = $tmhOAuth->request('POST', 'https://upload.twitter.com/1/statuses/update_with_media.json',
array(
'media[]' => "@{$image}", //cURLに渡す形式でファイル名。もしくはファイルの中身を渡してもよい。
'status' => "画像付きテストツイート"
),
true, // 認証する
true // multipart/form-data で
);
if ($code == 200) {
print_r(json_decode($tmhOAuth->response['response']));
} else {
print_r($tmhOAuth->response['response']);
}