PHP Twitter API 分块上传问题:Segments 加起来没有达到提供的总文件大小

Dea*_*con 5 php api twitter

所以我将 Twitter API 集成到一个应用程序中,我需要它能够发布图像、视频和 gif 动画。

我正在使用 php5.6 和 J7mbo/twitter-api-php 包。

到目前为止,我的代码如下:

     $file = fopen(realpath('../path/' . $row['path']), 'rb');
      $size = fstat($file)['size'];
      $mime_type = mime_content_type($row['path']);

      var_dump($size);
      var_dump($mime_type);


      $upload_url = 'https://upload.twitter.com/1.1/media/upload.json';
      $requestMethod = 'POST';

  $postfields = array(
          "command" => "INIT",
          'media_type' => $mime_type,
        //  'media_category' => 'tweet_video',
          'total_bytes' => $size
      );

      $initResult = json_decode($twitter->buildOauth($upload_url, $requestMethod)
        ->setPostfields($postfields)
        ->performRequest());


      $mediaId = $initResult->media_id_string;

      $segmentId = 0;

      while (!feof($file)) {
        $chunk = fread($file, 100000);

          echo strlen($chunk);


          $postfields = array(
              "command" => "APPEND",
              "media_id" => $mediaId,
              "segment_index" => $segmentId,

              "media" => $chunk
          );

          //var_dump($chunk);

          $appendResult = $twitter->buildOauth($upload_url, $requestMethod)
            ->setPostfields($postfields)
            ->performRequest();

          echo('chunk: '. $segmentId);

          var_dump($appendResult);

          $segmentId++;
      }

      echo ('done uploading');

      fclose($file);

      $postfields = array(
          "command" => "FINALIZE",
          "media_id" => $mediaId
      );

      $finResult = $twitter->buildOauth($upload_url, $requestMethod)
        ->setPostfields($postfields)
        ->performRequest();

      var_dump($finResult);

Run Code Online (Sandbox Code Playgroud)

无论我的块有多大或多小,FINALIZE 请求的结果总是:

{"request":"\/1.1\/media\/upload.json","error":"Segments do not add up to provided total file size."}"
Run Code Online (Sandbox Code Playgroud)

最令人沮丧的是,在我的测试中,$size 是 273872,无论我如何分割块,它们的总长度总是 100% 保证为 273872。

这里到底发生了什么?我什至如何去调试这个?

INIT 有效。附加返回 "" 但根据 twitter 的文档(https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-append)这是完全正确的。不过,我不知道如何提取响应状态,所以我还不确定。

PS:我很久没有使用任何社交网络 api 我不完全知道有什么可以告诉你的,请请求你希望我添加到这篇文章中的任何内容。

编辑:我用 curl 重新制作了这个。我有完全相同的结果。我想“也许它正在处理或其他什么”,所以我做了两个测试:



     {
            ["errors"]=>
              array(1) {
                [0]=>
                  array(2) {
                    ["message"]=>
                    string(31) "Sorry, that page does not exist"
                    ["code"]=>
                    int(34)
                  }
                }
         }

Run Code Online (Sandbox Code Playgroud)

不知道我是否会用这个图书馆得到它。明天试试。

  • 我试过睡 20 秒……结果一样。这可能是别的东西。

小智 0

那是几年后的事了,但是……

你应该对你的块进行base64编码

"media" => base64_encode($chunk)
Run Code Online (Sandbox Code Playgroud)