TwitterAPIでヘッダ画像のアップロードができない

この記事は最終更新日から4年以上経過しています。
内容が古い可能性がありますのでご注意ください。

codebird-php というライブラリを使って、Twitterのヘッダ(バナー?)画像を更新しようと思ったんだけどうまくいかない。

最初に書いたコードはこんな感じ。

require_once('codebird.php');
// CONSUMER_KEYとかの定義は省略
\Codebird\Codebird::setConsumerKey(CONSUMER_KEY, CONSUMER_SECRET);
$cb = \Codebird\Codebird::getInstance();
$cb->setToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
$image  = 'image.jpg';
$data = base64_encode(file_get_contents($image));
$result = $cb->account_updateProfileBanner(array('banner' => $data));
var_dump($result);

返ってきた結果がこれである。

object(stdClass)#2 (3) {
  ["request"]=>
  string(39) "/1.1/account/update_profile_banner.json"
  ["error"]=>
  string(27) "Unrecognized image provided"
  ["httpstatus"]=>
  int(400)
}

……よーわからんが怒られた。それ画像じゃないだろ?みたいに言われてる気がする。
もう一度APIのドキュメントを読んでみると画像データのパラメータについて、こんな風に書かれてる。

The Base64-encoded or raw image data being uploaded as the user's new profile banner.

POST account/update_profile_banner | Twitter Developers

Base64エンコードしたものか、生の画像データをアップロードしろ、とある。そこで以下のように書き換えてみた。

$image  = 'image.jpg';
$data = file_get_contents($image);
$result = $cb->account_updateProfileBanner(array('banner' => $data));
var_dump($result);

その結果。

object(stdClass)#2 (1) {
  ["httpstatus"]=>
  int(201)
}

成功ォォーーーー!!
うーん、「Base64-encoded or raw image data 」なのに、Base64で受け付けてくれないのはなんでだろ……。

ちなみに、アイコンと背景画像をアップロードするときはBase64しか受け付けないようだ。
画像付きツイートの場合は生データのみ。

2013-12-18追記:どうやらアイコンや背景についても、base64エンコードではなく、生データしか受け付けないようになったようだ。