【问题标题】:Cannot post a video to Twitter using Tweetinvi无法使用 Tweetinvi 将视频发布到 Twitter
【发布时间】:2017-02-08 22:39:06
【问题描述】:

我正在尝试使用 Tweetinvi 库将视频发布到 Twitter:

byte[] video = DownloadBlobFromUrl(parameters.VideoUrl);
IMedia media = Upload.ChunkUploadBinary(new UploadQueryParameters { Binaries = new List<byte[]> { video }, MediaType = "video/mp4", MediaCategory = "tweet_video", MaxChunkSize = VIDEO_MB_CHUNK_SIZE * 1024 * 1024 });
publishParameters.Medias = new List<IMedia> { media };
ITweet tweet = Tweet.PublishTweet(message, publishParameters);

问题是发布失败,除非我在发布之前添加某种睡眠,例如:

等待Task.Delay(25000);

延迟有效。有趣的是,IMedia 的成员 HasBeenUploaded 设置为 true。我也尝试使用块上传,但结果相同。假设这是问题所在,我该如何等到视频完全上传到 Twitter?

【问题讨论】:

  • 您好,我只是想让您知道该功能现已实现。这将是 Tweetinvi 1.2 版的一部分。如果您想立即使用它,您可以通过编译源代码。您可以在github.com/linvi/tweetinvi/issues/347 找到如何使用新功能的示例。

标签: c# twitter tweetinvi


【解决方案1】:

我是 Tweetinvi 的开发者。

您遇到的问题是 Twitter UPLOAD API 的问题。问题是,当上传完成时,他们的上传服务需要几毫秒到 1 秒的时间来处理它并将其提供给您。

从那里你有 2 个解决方案。

解决方案 1(简单)

不要指定MediaCategory,而是使用经典的Upload,如下所示:

var videoBinary = File.ReadAllBytes("file_path");
var videoMedia = Upload.UploadVideo(videoBinary);

Tweet.PublishTweet("test", new PublishTweetOptionalParameters()
{
    Medias = { videoMedia }
});

该视频应立即可用。但是我经历过需要延迟的时候。因此,我通常会为 Twitter 服务器添加 500 毫秒的延迟,以便为传入的推文做好准备。

解决方案 2 (amplify_video)

amplify_video 是一个更健壮的解决方案,因为它是 Twitter 提供的解决延迟问题的解决方案。

var videoBinary = File.ReadAllBytes(@"C:\Users\linvi\Pictures\mov_bbb.mp4");
var videoMedia = Upload.UploadVideo(videoBinary, "video/mp4", "amplify_video");

var isProcessed = videoMedia.UploadedMediaInfo.ProcessingInfo.State == "succeeded";
var timeToWait = videoMedia.UploadedMediaInfo.ProcessingInfo.CheckAfterInMilliseconds;

while (!isProcessed)
{
    Thread.Sleep(timeToWait);

    // The second parameter (false) informs Tweetinvi that you are manually awaiting the media to be ready
    var mediaStatus = Upload.GetMediaStatus(videoMedia, false);
    isProcessed = mediaStatus.ProcessingInfo.State == "succeeded";
    timeToWait = mediaStatus.ProcessingInfo.CheckAfterInMilliseconds;
}

我知道这很复杂,但很少有人使用amplify_video。 在下一个版本中,我将添加一个新方法,它会自动为您完成所有这些逻辑。

如果您想在此功能发布时收到通知,您可以在此处找到工作项:https://github.com/linvi/tweetinvi/issues/347

我还将为ProcessingInfo.State (https://github.com/linvi/tweetinvi/issues/348) 提供一个新的枚举。

我希望这个答案对你有所帮助。 祝你有美好的一天。

【讨论】:

    【解决方案2】:

    找到了一个答案,不是那么优雅,但它有效。您必须将媒体类别设置为 amplify_video。对于其他有此问题的人:

    byte[] video = DownloadBlobFromUrl(parameters.VideoUrl);
    IMedia media = Upload.ChunkUploadBinary(new UploadQueryParameters { Binaries = new List<byte[]> { video }, MediaType = "video/mp4", MediaCategory = "amplify_video", MaxChunkSize = VIDEO_MB_CHUNK_SIZE * 1024 * 1024 });
    publishParameters.Medias = new List<IMedia> { media };
    IUploadedMediaInfo status = Upload.GetMediaStatus(media);
    
    int numberOfTries = 1;
    while (status.ProcessingInfo.State != "succeeded" && numberOfTries < VIDEO_UPLOAD_TRY_COUNT)
    {
       numberOfTries++;
       await Task.Delay(VIDEO_UPLOAD_WAIT_SECONDS * 1000);
       status = Upload.GetMediaStatus(media);
    
     }
    
    if (status.ProcessingInfo.State == "succeeded")
    {
         tweet = Tweet.PublishTweet(message, publishParameters);
         return tweet.IdStr;
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 2019-12-16
      • 2015-09-03
      • 2016-01-08
      • 2015-09-17
      • 2011-09-30
      • 1970-01-01
      • 2021-12-28
      相关资源
      最近更新 更多