首页 > 解决方案 > 如何解决 Twitter API 错误“无效媒体”

问题描述

我正在尝试上传 15 MB 的视频。在步骤INIT中,服务成功返回media_id信息

在 APPEND 步骤中,我们使用了 Chunk 结构并成功传递了字节数组,每个 chunk 的值为 4mb

在 FINALIZE 步骤中,我们成功完成了上传过程

但是,当我们使用 STATUS 检查货物时,我们会收到以下错误。

{"media_id":1187325998846660609,"media_id_string":"1187325998846660609","media_key":"7_1187325998846660609","size":8795782,"processing_info":{"state":"failed","progress_percent":100,"error ":{"code":1,"name":"InvalidMedia","message":"文件无效"}}}

public class InitModel
    {
        public string media_id { get; set; }
        public string media_id_string { get; set; }
        public string expires_after_secs { get; set; }
    }

#region Init
            var client = new RestClient("https://upload.twitter.com/1.1/media/upload.json")
            {
                Authenticator = RestSharp.Authenticators.OAuth1Authenticator.ForProtectedResource("consumerKey", "consumerSecret", "accessToken", "accessTokenSecret")
            };
            var request = new RestRequest(Method.POST);
            request.AddParameter("command", "INIT");
            request.AddParameter("total_bytes", size);
            request.AddParameter("media_type", "video/mp4");
            request.AddParameter("media_category", "tweet_video");

            IRestResponse<InitModel> response = client.Execute<InitModel>(request);


            #endregion

#region Append
const int chunkSize = 4 * 1024 * 1024;
using (var filex = File.OpenRead(path))
{
    int bytesRead, chunkID = 0;
    var buffer = new byte[chunkSize];
    while ((bytesRead = filex.Read(buffer, 0, buffer.Length)) > 0)
    {
    if (bytesRead < chunkSize)
    {
    var lastBuffer = new byte[bytesRead];
    buffer = new byte[bytesRead];
    buffer = lastBuffer;
    }
    try
    {
    var client1 = new RestClient("https://upload.twitter.com/1.1/media/upload.json")
    {
    Authenticator = RestSharp.Authenticators.OAuth1Authenticator.ForProtectedResource("consumerKey", "consumerSecret", "accessToken", "accessTokenSecret")
    };
    var request1 = new RestRequest(Method.POST);
    request1.AddHeader("Content-Type", "multipart/form-data");
    request1.AddParameter("command", "APPEND");
    request1.AddParameter("media_id", response.Data.media_id);
    request1.AddFileBytes("media", buffer, "test");
    request1.AddParameter("segment_index", chunkID.ToString());
    IRestResponse response1 = client1.Execute(request1);
    }
    catch (Exception ex)
    {
    Console.WriteLine($"[ERROR] {ex.Message}");
    return;
    }
    chunkID++;
    }
}
#endregion

#region Finalize
            var client2 = new RestClient("https://upload.twitter.com/1.1/media/upload.json")
            {
                Authenticator = RestSharp.Authenticators.OAuth1Authenticator.ForProtectedResource("consumerKey", "consumerSecret", "accessToken", "accessTokenSecret")
            };
            var request2 = new RestRequest(Method.POST);
            request2.AddHeader("Content-Type", "application/x-www-form-urlencoded");
            request2.AddParameter("command", "FINALIZE");
            request2.AddParameter("media_id", response.Data.media_id);

            IRestResponse response2 = client2.Execute(request2);
            #endregion
#region Status
var client4 = new RestClient("https://upload.twitter.com/1.1/media/upload.json")
            {
                Authenticator = RestSharp.Authenticators.OAuth1Authenticator.ForProtectedResource("consumerKey", "consumerSecret", "accessToken", "accessTokenSecret")
            };
            var request4 = new RestRequest(Method.GET);
            request4.AddParameter("command", "STATUS");
            request4.AddParameter("media_id", response.Data.media_id);

            IRestResponse response4 = client4.Execute(request4);
    #endregion

标签: c#twitter

解决方案


推荐阅读