PHPでtwitterAPIから動画を投稿する方法

PHPでTwitter APIから動画投稿を行う方法を紹介します。

簡単な流れ

Twitterのサーバーに、media/upload(INIT、APPEND、FINALIZE、STATUS)の
4段階のリクエストを経て、statuses/updateで動画をアップロードします。

30秒以上の動画を投稿する場合はAPPEND時に
分割してデータを送信しSTATUSも実施する必要があります。

※30秒以下の動画を投稿する場合は上記はしなくてもよい

設定

①Twitterアカウントは古いアカウントではだめ 最新のアカウントを利用。
古いアカウントでは動画投稿ができないっぽい。

アカウントを作成したら以下からアプリの登録を行い、
>> Twitter Application Management

Consumer key,Consumer secret,Access Token,sAccessTokenを取得する。

②最新のTwitterOAuthを利用する。
動画投稿に対応しているOAuthを利用すること
>> TwitterOAuth

③PHP5.4以上を利用。
確認方法はソースの適当なところに
phpinfo();を記述する。

php5.4未満だと以下のエラーが発生する。
TwitterOAuth.php on line 129

ソースコード

//twitteroauth.phpをインクルードします。ファイルへのパスはご自分で決めて下さい。
require “twitteroauth/autoload.php”;
use Abraham\TwitterOAuth\TwitterOAuth;

//Consumer keyの値を格納
$sConsumerKey = “XXXXXXXXXXXXXXXXXXXXXXXXXX”;
//Consumer secretの値を格納
$sConsumerSecret = “XXXXXXXXXXXXXXXXXXXXXXXXXX”;
//Access Tokenの値を格納
$sAccessToken = “XXXXXXXXXXXXXXXXXXXXXXXXXX”;
//Access Token Secretの値を格納
$sAccessTokenSecret = “XXXXXXXXXXXXXXXXXXXXXXXXXX”;

$to = new TwitterOAuth($sConsumerKey,$sConsumerSecret,$sAccessToken,$sAccessTokenSecret);

$filename = “img/test.mp4”;
$fileText = “これはツイートです。”;

$url = “https://upload.twitter.com/1.1/statuses/update.json”;
$uri = “https://upload.twitter.com/1.1/media/upload.json”;
$method = “POST”;

$segment_index = 0;
$chank = 5 * 1024 * 1024;

//動画のデータファイルをバイナリに変換する。
$file_date = file_get_contents($filename);
$file_date = base64_encode($file_date);
$file_size = mb_strlen($file_date);

//これからアップロードするファイルの情報を作る。
$info = $to->OAuthRequest($uri,$method,array(‘command’ => ‘INIT’,’media_type’ => ‘video/mp4′,’total_bytes’ => filesize($filename), ‘media_category’ => ‘tweet_video’));
$Obj = json_decode($info);

//メディアのIDを取得
$sba = $Obj->media_id_string;

//何回アップロードが必要か
$maxRound = ceil($file_size / $chank);

//APPENDをファイルサイズ分割分だけアップロード
for($i=0;$i<$maxRound;$i++){ $file_size_x[$i] = substr($file_date,$chank*$i,$chank); $to->OAuthRequest($uri,$method,array(‘command’ => ‘APPEND’,’media_id’ => $sba,’segment_index’ => $i,’media’ => $file_size_x[$i],));
}
$info = $to->OAuthRequest($uri,$method,array(‘command’ => ‘FINALIZE’,’media_id’ => $sba));
$Obj = json_decode($info);

//アップロードしたデータ情報をファイルサイズ分割分だけ最新化
for($i=0 ;$i<$maxRound ;$i++){ sleep($Obj->processing_info->check_after_secs);
$res = $to->get(‘media/upload’, array(“command” => “STATUS”,”media_id” => $sba));
}

//動画とテキストを投稿
$res = $to->post(“statuses/update”, array(“status” => $fileText,’media_ids’ => $sba));

以上で投稿が行える。
サーバーの処理状況によって以下のエラーが発生することも…

Fatal error: Uncaught exception ‘Abraham\TwitterOAuth\TwitterOAuthException’ with message ‘Operation timed out after 5000 milliseconds with 0 bytes received’

その場合は以下を設定し、タイムアウトの時間を変更するといいよ。
$to->setTimeouts(10, 15);

その他にはまったエラーたち

①TwitterOAuth.php on line 366 エラー

以下のコードをコメントアウトにする。

//↓TwitterOAuth.phpエラー該当箇所
/* Remove CACert file when in a PHAR file. */
if (!empty(\Phar::running(false))) {
unset($options[CURLOPT_CAINFO]);
}

②Call to private method Abraham\TwitterOAuth\TwitterOAuth::OAuthRequest() from context エラー

private method を呼べないエラーみたいです.
TwitterOAuth.php の private function oAuthRequest(url,url,method, $parameters) の private を消します.

③”The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.”,”code”:64}

TwitterAPIの呼び出し方が古いのでちゃんとv1.1の呼び出し方をする事。
最新のTwitterOAuthを利用すること。

④Duration too long, maximum:30000, actual:60000
You have to pass the new media_category param in order to use longer videos (> 30 seconds).

30秒以上の動画は分割して投稿する必要があるが、その処理が上手くできていない時に発生。

⑤Segments do not add up to provided total file size.
分割して送った動画のトータルサイズが最初に送ると言ったサイズと一致していないので分割送信が上手くいっていない時に発生。