【问题标题】:Uploading Videos to Twitter using API使用 API 将视频上传到 Twitter
【发布时间】:2017-11-22 01:47:21
【问题描述】:

我正在使用库 tmhOAuth 在应用程序中发布到 Twitter,我已经实现了上传图片,但在实现视频上传时遇到了问题。

这是我用来上传图片的调用,可以完美地处理图片。

$temp = '@upload/'.$name.';type='.$_FILES['img']['type'].';filename='.$name;
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json', array('media' => $temp), true, true);

所以我认为视频可能是一样的,但我得到了错误

stdClass Object ( [request] => /1.1/media/upload.json [error] => media type unrecognized. )

我相信我必须根据 Twitter API 进行 3 个单独的调用,所以我尝试了这个

$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=INIT&media_type=video/mp4&total_bytes='.$_FILES['img']['size'], array('media' => $temp), true, true);
$media_id = json_decode($tmhOAuth->response['response'])->media_id_string;
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id='.$media_id.'&segment_index=0', array('media' => $temp), true, true);
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=FINALIZE&media_id='.$media_id, array('media' => $temp), true, true);

但我在所有 3 次调用中都收到相同的错误

stdClass Object ( [request] => /1.1/media/upload.json [error] => media type unrecognized. )

谁能提供如何将视频上传到 Twitter 的示例?我在网上找不到任何例子,这可能是不可能的。

【问题讨论】:

    标签: php twitter


    【解决方案1】:

    我遇到了同样的问题。这是我设法解决它的方法。 首先,您设置一个 var,其中包含您要上传的媒体的文件系统完整路径。

    $media_path = '/PATH/TO/THE/file.mp4';
    

    然后实例化 $tmhOAuth 并执行 3 个步骤:

    $tmhOAuthUpload = new tmhOAuth();
    

    初始化

    $code = $tmhOAuthUpload->request(
          'POST',
          $tmhOAuthUpload->url('/1.1/media/upload.json'),
          array(
              "command" => "INIT",
              "total_bytes" => (int)filesize($media_path),
              'media_type' => 'video/mp4',
          )
    );
    

    检索 Twitter 返回的媒体 ID

    $results = json_decode($tmhOAuthUpload->response['response']);
    $media_id = $results->media_id_string;
    

    APPEND:使用附加循环处理视频/媒体上传

    $fp = fopen($media_path, 'r');
    $segment_id = 0;
    while (! feof($fp)) {
        $chunk = fread($fp, 1048576); // 1MB per chunk for this sample
    
        $tmhOAuthUpload->request(
            'POST',
            $tmhOAuthUpload->url('/1.1/media/upload.json'),
            array(
                "command" => "APPEND",
                "media_id" => $media_id,
                'media_data' => base64_encode($chunk),
                "segment_index" => $segment_id
            )
        );
        $segment_id++;
    }
    

    定稿

    $tmhOAuthUpload->request(
         'POST',
         $tmhOAuthUpload->url('/1.1/media/upload.json'),
         array(
              "command" => "FINALIZE",
              "media_id" => $media_id,
         )
    );
    

    到那时我已经能够发送我的推文了:

    $code = $tmhOAuth->request(
          'POST',
          $tmhOAuthUpload->url('1.1/statuses/update'),
          array(
                'media_ids'  => $media_id,
                'status'   => $text,
          ),
          true // use auth
    );
    

    希望有帮助

    【讨论】:

    • 通过一些调整这工作(谢谢)。上传的主机不同于更新的主机(api.twitter.com 与 upload.twitter.com)。
    【解决方案2】:

    我只能使用 CodeBird 上传视频 - 一个不同的 PHP 库。

    正如您所发现的,视频的 Twitter API 调用与上传图片完全不同。

    将视频上传到 Twitter(≤ 15MB,MP4)需要您分块发送。您需要执行至少 3 次调用才能获取视频的 media_id:

    • 发送 INIT 事件以获取 media_id 草稿。

    • 使用 APPEND 事件上传您的块,每个事件最大为 5MB。

    • 发送 FINALIZE 事件以将草稿转换为准备推文的 media_id。

    • 发布您的推文并附上视频。

    请记住,每个 APPEND 必须为 5MB 或以下。

    如果您一直收到“无法识别的媒体类型”错误,则可能是您使用的视频与 Twitter 不兼容。您可以测试通过其他服务上传视频吗?

    【讨论】:

      【解决方案3】:

      非常感谢皮埃尔的回答!但是,如果我过早尝试创建推文,则会收到“无效视频”错误。 Twitter尚未处理该视频。除了 Pierre 的代码之外,我还需要这样的东西来检查 STATUS,在 FINALIZE 之后:

      $videoCount = 0;
      do
      {
          $tmhOAuth->request(
              'GET',
              $tmhOAuth->url('/1.1/media/upload.json'),
              array(
                  "command" => "STATUS",
                  "media_id" => $mediaID,
              )
          );
          $twitterResult = json_decode($tmhOAuth->response['response']);
          if ($twitterResult->processing_info->state != 'succeeded')
          { sleep(5); }
          $videoCount++;
      }
      while ($twitterResult->processing_info->state != 'succeeded' && $videoCount < 5);
      

      注意:我的变量名不同

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 2015-10-08
        • 2013-12-04
        • 2020-01-18
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 2016-10-30
        相关资源
        最近更新 更多