[メモ]twitter REST API による動画付きツイートの仕方[動画]

おはこんばんちは
ご無沙汰しております。

twitterで動画のツイートを見かけてはや数か月・・・
APIで投稿はできないのかなぁ~と久しぶりにAPIのドキュメントを眺めてみました。

とりあえず、項目としてvideoの投稿ができるようになったというのを見つけて実際に動画投稿を行ってみました。
以下のアドレスで投稿の仕方とか、動画の形式とかサイズとか書かれているので見てみてください。

https://dev.twitter.com/rest/reference/post/media/upload-chunked
https://dev.twitter.com/rest/public/uploading-media

見るの面倒な人用に以下

動画形式 mp4
動画の容量 最大15MB
アスペクト比 1:3~3:1
※twitterの公式アプリではたぶん640×640
動画の時間 0.5~30秒
Video Bitrate 2048K 1280×780の場合
Audio Bitrate 128K 1280×780の場合
//エンドポイント
$url = 'https://upload.twitter.com/1.1/media/upload.json';

1.INIT postするデータのファイルサイズを送りそのidを取得

//動画ファイル
$video_file = "/tmp/test.mp4";
//投稿データ command、media_type、total_bytes
$post_data = array(
  'command'=>'INIT',
  'media_type' => 'video/mp4',//動画の場合video/mp4固定(mp4のみ対応の為)
  'total_bytes' => filesize($video_file),//動画のファイルサイズ
);
//データをPOST
$res = [twiterへデータをPOST];
/* 返り値は以下のようなjson形式で返されます。
{
  "media_id": 601413451156586496,
  "media_id_string": "601413451156586496",
  "expires_after_secs": 3599
}
*/

2.APPEND postする実際のデータを送る
5MB以上15MB以下の場合、データを5MBずつ送信する

// 1で取得したmedia_id_stringを使用
$res = json_decode($res, true);
$media_id_string = $res['media_id_string'];
// 動画ファイルのデータを読み込む
$file_data = file_get_contents($video_file);
// 5MB以上の場合この値がPOSTする度増加
$segment_index = 0;
// 読み込んだデータの長さ
$len = strlen($file_data);
// ファイルサイズを分割するサイズ
$chank = 5 * 1024 * 1024;

// $file_dataがなくなるまで回す
while(strlen($file_data) > 0){
  if($len/$chank>0){
    $buf = substr($file_data, 0,$chank);
    $file_data = substr($file_data, $chank);
    $len = $len - $chank;
  } else {
    $buf = $file_data;
    $file_data = "";
    $len = 0;
  }
  //POSTデータ作成
  $post_data = array(
      'command'=>'APPEND',
      'media_data' => base64_encode($buf),
      'media_id' => $media_id_string,
      'segment_index' => $segment_index,
  );
  $res =  [twiterへデータをPOST];
  $res = json_decode($res, true);
  // エラーの場合処理終了(成功している場合はなにも返り値がない)
  if (isset($res['errors'])) {
    exit;
  }
  $segment_index++;
}

3.FINALIZE postした実際のデータが終わったことを伝える

$post_data = array(
  'command'=>'FINALIZE',
  'media_id' => $media_id_string,
);
$res = [twiterへデータをPOST];
$res = json_decode($res, true);
/* 成功した場合、以下の様な内容のjsonが返ってきます。
{
  "media_id":628618021481787392,
  "media_id_string":"628618021481787392",
  "size":4583156,
  "expires_after_secs":3600,
  "video":{
    "video_type":"video\/mp4"
  }
}
*/

4.media_ids付でツイート

$url = "https://api.twitter.com/1.1/statuses/update.json";
$dat = array(
  'status'  => [ツイート内容],
  'media_ids' => $media_id_string,
);
$res = [twiterへデータをPOST];
$res = json_decode($res, true);

※成功すればツイート内容が返って来ます。

以上で動画の投稿が一応出来ました。

※本当はバイナリでデータをそのまま送りたいのだが、バイナリをそのままおくるとクジラ的なエラーが返ってきてしまう始末・・・

ふぅ~なかなか今回は疲れました、、

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です