PHPでTwitterに画像を投稿する処理を書く際のハマリどころまとめ


TwitterAPIと連携して、画像付きのツイートを行う処理をする際に結構はまったので、基本的な知識などをまとめました。

TwitterOAuthなどのライブラリを使う前提ですが、ライブラリのAPI連携部分がcURL経由なのであれば他のライブラリでも同じことが言えると思います。

参考にしたサイト

PHPでcURLのクソ仕様 "@" を回避する

前提

  • 「画像データをPOST」と「画像を添付するツイートPOST」で2回のAPI送信が必要
  • 画像データはバイナリ化された実データを送る必要がある
    • @ファイル名 記法を使用する (PHP5.5以前)
    • CURLFileクラスを使用する (PHP5.6以降)

画像データの指定方法

普段あまり使わない、画像の実データの送信が必要になるため、個人的に難しく感じたところです。
基本的にはCURLFileを使用する方法が良いと思います。


$connection = new TwitterOAuth($apiKey, $apiSecret, $token, $tokenSecret);

$param = [
    'media' => new CURLFile('/tmp/my/image.jpeg','image/jpeg', 'tweet.jpg')
]

$connection->postImg('media/upload', $param);

mediaパラメータとして、CURLfileオブジェクトを送るのがミソです。
クラスインスタンスを引数として指定しなければいけないのはちょっとライブラリの使い方として不親切な感じもしますが、もともとは '@/tmp/my/image.jpeg' みたいな記法で、cURL送信のファイルが指定できたために、ライブラリ側も「@マーク付き文字列で指定してね☆」という感じでやっていた経緯があるみたいです。

動かない時に試してみること

URLの指定方法がそもそもわからない

ライブラリにさらにラッパークラスを噛ませたり、MVC系のフレームワークを使用していると、そもそも画像ファイルをどう指定していいかわからなくなったりします。そんな場合は、 組み込み関数getcwd()を使用してみましょう。

そもそも指定したファイルが存在しているかどうかをチェックする

一見エラーとかが帰ってこないのに、画像が投稿されない場合は、そもそもファイル指定が間違っている可能性があります。
そんな場合は、組み込み関数file_exists()で、curlで指定したファイルが本当に存在しているかチェックするといいでしょう。

media/uploadの戻り値をチェックする

前述の通り、「画像アップロード」と「画像添付してツイート」の2段階になるため、うまく送信できない場合にどちらのAPIでこけたのかわからないこともあると思います。そういった場合はAPIの戻り値をチェックしましょう。

最近はもっと簡単にできるっぽい

今回の実装にあたって、すこし古いバージョンのTwitterOAuthを使用する必要があったのですが、
最新のTwitterOAuthでは、Curl系のオブジェクトをこちらで使用しなくても、単に画像URLで投稿できるようになるみたいですね。

$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);
$media1 = $connection->upload('media/upload', ['media' => '/path/to/file/kitten1.jpg']);
$media2 = $connection->upload('media/upload', ['media' => '/path/to/file/kitten2.jpg']);
$parameters = [
    'status' => 'Meow Meow Meow',
    'media_ids' => implode(',', [$media1->media_id_string, $media2->media_id_string])
];
$result = $connection->post('statuses/update', $parameters);