无法使用 Tweetinvi post 将视频发送到 Twitter
Cannot post a video to Twitter using Tweetinvi
我正在尝试 post 使用 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);
问题是发布失败,除非我在发布之前添加某种睡眠,例如:
await Task.Delay(25000);
延迟即可。有趣的是 IMedia 的成员 HasBeenUploaded 被设置为 true。我也尝试使用块上传,但结果相同。假设这是问题所在,我如何才能等到视频完全上传到 Twitter?
找到了一个答案,不是那么优雅,但它有效。您必须将媒体类别设置为 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;
}
我是 Tweetinvi 的开发者。
您遇到的问题是推特上传的问题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
是一个比较健壮的方案,因为它是推特提供的解决延迟问题的方案。
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) 提供一个新的枚举。
希望这个回答对您有所帮助。
祝你有美好的一天。
我正在尝试 post 使用 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);
问题是发布失败,除非我在发布之前添加某种睡眠,例如:
await Task.Delay(25000);
延迟即可。有趣的是 IMedia 的成员 HasBeenUploaded 被设置为 true。我也尝试使用块上传,但结果相同。假设这是问题所在,我如何才能等到视频完全上传到 Twitter?
找到了一个答案,不是那么优雅,但它有效。您必须将媒体类别设置为 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;
}
我是 Tweetinvi 的开发者。
您遇到的问题是推特上传的问题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
是一个比较健壮的方案,因为它是推特提供的解决延迟问题的方案。
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) 提供一个新的枚举。
希望这个回答对您有所帮助。 祝你有美好的一天。