Twitter REST APIを使って画像付きツイートをする方法

僕が運営しているサイトの1つでは、特定の時間やアクションがされたときに自動で画像付きツイートするようにプログラムを書いています。

これまでそういったことをするには、Twitter REST APIの「update_with_media (deprecated) 」を使っていました。

「update_with_media」を使うのは非推奨になっている

ところで、この記事を書いた2015/07/04現在は「update_with_media」はdeprecated(非推奨)となっていて使うことをおすすめされていません。(いずれ使えなくなると思います)

ですので、別の方法として「media/upload」を使うように案内されています。

というわけで、今回は「media/upload」を使って画像付きツイートをする方法を書きました。

似たようなことをされたい方は、ご参考ください。

画像付きツイートの流れを簡単にまとめると、こうなる

画像付きツイートをするには、以下の2つの作業を1セットとして行うのが主な流れです。

画像付きツイートまでの流れ

  1. media/upload」を使って画像をアップロード
  2. アップロードした画像と「statuses/update」を使ってツイート

ポイントは「画像付きツイート1回につき、Twitter REST APIを最低でも2回使わないといけない」ってことですね。これが前提です。

Twitterで用意されているライブラリを使って簡単にやろう

画像付きツイートの前提を確認できたところで、さっそくTwitter REST API使いましょう。・・・と、いきなり言っても難しいと思う方も多いと思います。

そこで、Twitter REST APIを扱いやすくしてくれるように、プログラムをまとめてくれた「ライブラリ」と呼ばれるものがあります。ライブラリを使ったほうがラクです。

ライブラリはTwitter公式サイトの「Twitter Libraries」からダウンロードできます。今回は、PHPのライブラリ「tmhOAuth」を使います。

さっそくやってみましょう。

どんな作りにするかを考える

例として、「tweet.php」という名前でphpファイルを作ってimage.jpgの画像を用意します。「tweet.phpファイルを実行するとimage.jpgの画像付きツイートがされる」という単純な作りにしますね。

今ほどダウンロードしたライブラリ「tmhOAuth」も含めて、以下のファイル・フォルダを同じ階層に用意します。

・tweet.php //プログラムファイル。ここにコードを書いていく
・image.jpg //画像付きツイートに使う
■library //ライブラリ「tmhOAuth」が入っているフォルダ

これで準備OK。

ライブラリを読み込む

まずはじめに、以下のようにライブラリフォルダ内にある「tmhOAuth.php」を読み込みます。

require_once("./library/tmhOAuth.php"); //thmOAuth.phpを読み込む

この「tmhOAuth.php」の読み込みは、「これからライブラリを使うよ」という意味で理解するといいかもですね。

アプリの情報を入力する

どのTwitterアカウントで画像ツイートをするのか、決めないといけないですね。

続いて、ツイートさせたいTwitterアカウントに対してアプリを作成しないといけないです。

まだアプリを作成していない方は、以下のページに手順を書きましたのでご参考ください。

ところで、なぜアプリを作成する必要があるのかですが・・・それは、「tmhOAuth.php」ライブラリを使うには、Twitterアプリを作成する時に提供される値を元に、以下の4つの情報を設定する必要があるからです。

アプリを作成済の方は、さっそく設定しましょう。

  1. コンシューマーキー
  2. コンシューマーシークレット
  3. ユーザートークン
  4. ユーザーシークレット
//初期設定
$tmhOAuth = new tmhOAuth(array(
 'consumer_key' => 'xxxxxxxx', //コンシューマーキー
 'consumer_secret' => 'xxxxxx', //コンシューマーシークレット
 'user_token' => 'xxxxxx', //ユーザートークン
 'user_secret' => 'xxxxxx', //ユーザーシークレット
));

また、アプリのアクセス権限は「Read and write(読み/書き)」に設定しておきます。

ツイートしたい画像を選んでエンコードする

次に、ツイートする画像の設定をします。下のコードにもあるように、画像の場所をパスで指定して、base64でエンコードしておきます。

$path = './image.jpg'; //画像のパス指定
$data = file_get_contents($path); //画像データ取得
$image = base64_encode($data); //base64でエンコード

※file_get_contetnsが使えないサーバーもあるんですが、その場合は他の方法で頑張ってください。ここでは詳しく書かないです。

画像をアップロードする

Twitter REST APIを使う時が来ました。

$image_upload = $tmhOAuth->request(
 'POST', //リクエストの種類(POST/GETがある)
 'https://upload.twitter.com/1.1/media/upload.json', //画像アップロード用のTwitter REST APIを指定
 array(
 'media_data' => $image //画像データを指定
 )
);

上記の設定は一例です。詳しくは「media/upload」でご確認ください。

画像のエンコードについて

今回は「media_ids」を例にしましたが「media_ids」を使う場合はbase64でエンコードが必要で、「media」を使う場合は生のバイナリファイルを指定します。

無事に画像がアップロードされると、以下のように値が返ってきます。

画像アップロードが成功すると返ってくる値

{
"media_id":617xxxxxxxxx, //画像id
"media_id_string":"617xxxxxxxxx", //画像id(文字列)
"size":7671, //画像ファイルのバイト数
"expires_after_secs":3600, //有効時間3600秒(=60分)
"image":{
 "image_type":"image\/jpeg", //画像のファイルタイプ
 "w":320, //画像の横幅(ピクセル)
 "h":180 //画像の縦幅(ピクセル)
 }
}

この返ってくる値の中にある「media_id_string」を後で使いますので、変数に格納しておきます。

$decode = json_decode($tmhOAuth->response["response"], true); //JSONデコードして
$media_id = $decode['media_id_string']; //「media_id_string」の値を格納

画像idは「media_id」「media_id_string」どっちを使えばいいの?

「media_id」でもいいように見えますが、json_decodeを使って大きな整数値を扱うと「6.17xxxxxxxxxE+17」という値に変換されてしまうので、結果的に明確なidを指定してないので下のようにエラーになります。

画像idの指定がおかしいとこんなメッセージが出る

{"errors":[{"code":44,"message":"media_ids parameter is invalid."}]}

この状況を回避するには、json_decodeで「JSON_BIGINT_AS_STRING」を付与するか「media_id_string」を使えばいいんだけど、今回は説明が簡単なほうで「media_id_string」を使っています、ということでした。

画像idをちゃんと格納できれば、どんな方法でもいいと思います。

ちなみにアップロードする画像はこちらです。いつもお世話になっている東十条の居酒屋たぬきでありがたく出してもらいました。

Jpeg

というわけで、次はいよいよ画像付きツイートです。

画像付きツイートする

ここで、ツイートさせたい文章を指定しましょう。

$text = 'サバの塩焼き。メニューには載ってないスペシャルな奴だぞ!';

今ほど格納した画像idは、下のコードのようにツイート用の「statuses/update」の「media_ids」に指定します。「status」は今ほど設定したツイートしたい文章ですね。

$tweet_update = $tmhOAuth->request(
 'POST', //リクエストの種類(POST/GETがある)
 'https://api.twitter.com/1.1/statuses/update.json', //ツイート用のTwitter REST APIを指定
 array(
   'media_ids' => $media_id, //格納した画像idを指定
   'status' => $text //ツイートしたい文章を指定
 )
);

という流れです。以上で「tweet.php」に書くコードは終わりです。

まとめると、下のようなコードが書かれています。

tweet.php

//thmOAuth.phpを読み込む
require_once("./library/tmhOAuth.php");

//初期設定
$tmhOAuth = new tmhOAuth(array(
 'consumer_key' => 'xxxxxxxx', //コンシューマーキー
 'consumer_secret' => 'xxxxxx', //コンシューマーシークレット
 'user_token' => 'xxxxxx', //ユーザートークン
 'user_secret' => 'xxxxxx', //ユーザーシークレット
));

//画像設定
$path = './image.jpg'; //画像のパス指定
$data = file_get_contents($path); //画像データ取得
$image = base64_encode($data); //base64でエンコード

//画像アップロード
$image_upload = $tmhOAuth->request( 'POST', //リクエストの種類(POST/GETがある) 'https://upload.twitter.com/1.1/media/upload.json', //画像アップロード用のTwitter REST APIを指定 array( 'media_data' => $image //画像データを指定 ) );

//画像id格納
$decode = json_decode($tmhOAuth->response["response"], true); //JSONデコードして
$media_id = $decode['media_id_string']; //「media_id_string」の値を格納

//ツイートしたい文章
$text = 'サバの塩焼き。メニューには載ってないスペシャルな奴だぞ!';

//画像付きでツイートする
$tweet_update = $tmhOAuth->request(
 'POST', //リクエストの種類(POST/GETがある)
 'https://api.twitter.com/1.1/statuses/update.json', //ツイート用のTwitter REST APIを指定
  array(
   'media_ids' => $media_id, //格納した画像idを指定
   'status' => $text //ツイートしたい文章を指定
  )
);

tweet.phpを実行すると、画像付きツイートされます。

こんな感じで画像付きツイート

まとめ

画像付きツイートは、テキストのみのツイートよりも目に入ってくるインパクトが違いますね。ご参考頂けますと幸いです。

著者:bouya Imamura