无法使用Tweetinvi将视频发布到Twitter

时间:2016-09-30 11:03:59

标签: c# twitter tweetinvi

我正在尝试使用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?

2 个答案:

答案 0 :(得分:2)

我是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.Statehttps://github.com/linvi/tweetinvi/issues/348)提供新的枚举。

我希望这个答案可以帮到你。 祝你有美好的一天。

答案 1 :(得分:0)

找到答案,不是那么优雅,但它有效。您必须将媒体类别设置为 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;
 }