php - 使用 codebird 时出现错误代码 324“无效视频”
问题描述
我正在使用最新版本的 Codebird 从我的网站发推文。我正在尝试添加推文视频的功能,代码成功推文图像。
我在网上找不到任何其他内容。这是代码:
\Codebird\Codebird::setConsumerKey(xxxx, xxxx);
$cb = \Codebird\Codebird::getInstance();
$cb->setToken(xxxx, xxxx);
$video = /path/to/file.mp4
$params = [
'status' => mb_substr('the tweet text', 0, 280),
'media_ids' => twitterUpdloadLargeFile($cb, $video)
];
$reply = $cb->statuses_update($params); // code 324 'not valid video'
function twitterUpdloadLargeFile($cb, $video) {
$size_bytes = filesize($video); // test video 2.5MB
$mime = mime_content_type($video);
$fp = fopen($video, 'r');
$reply = $cb->media_upload([
'command' => 'INIT',
'media_type' => $mime,
'media_category' => 'tweet_video',
'check_progress' => true,
'total_bytes' => $size_bytes,
]);
$media_id = $reply->media_id_string;
$segment_id = 0;
while (! feof($fp)) {
$chunk = fread($fp, 524288); // 512KB per chunk
$reply = $cb->media_upload([
'command' => 'APPEND',
'media_id' => $media_id,
'segment_index' => $segment_id,
'media' => $chunk
]);
$segment_id++;
}
fclose($fp);
$reply = $cb->media_upload([
'command' => 'FINALIZE',
'media_id' => $media_id,
'media_category' => 'tweet_video',
]);
return $reply->media_id_string;
}
上面的代码导致代码 324 和消息“无效视频”,Twitter 上没有任何显示。
INIT 上传给出状态 202。每个 APPEND 给出状态 204。“FINALIZE”上传给出状态 200。
解决方案
正如 Andy Piper 所建议的,我需要在使用 media_id 之前为视频上传添加状态检查。
解决方案:
\Codebird\Codebird::setConsumerKey(xxxx, xxxx);
$cb = \Codebird\Codebird::getInstance();
$cb->setToken(xxxx, xxxx);
$video = /path/to/file.mp4
$params = [
'status' => mb_substr('the tweet text', 0, 280),
'media_ids' => twitterUpdloadLargeFile($cb, $video)
];
$reply = $cb->statuses_update($params); // code 324 'not valid video'
function twitterUpdloadLargeFile($cb, $video) {
$size_bytes = filesize($video); // test video 2.5MB
$mime = mime_content_type($video);
$fp = fopen($video, 'r');
$reply = $cb->media_upload([
'command' => 'INIT',
'media_type' => $mime,
'media_category' => 'tweet_video',
'check_progress' => true,
'total_bytes' => $size_bytes,
]);
$media_id = $reply->media_id_string;
$segment_id = 0;
while (! feof($fp)) {
$chunk = fread($fp, 524288); // 512KB per chunk
$reply = $cb->media_upload([
'command' => 'APPEND',
'media_id' => $media_id,
'segment_index' => $segment_id,
'media' => $chunk
]);
$segment_id++;
}
fclose($fp);
$reply = $cb->media_upload([
'command' => 'FINALIZE',
'media_id' => $media_id,
'media_category' => 'tweet_video',
]);
$notDone = true;
while($notDone) {
$reply = $cb->media_upload([
'command' => 'STATUS',
'media_id' => $media_id,
]);
if (!empty($reply->processing_info->check_after_secs)) {
sleep($reply->processing_info->check_after_secs);
} else {
$notDone = false;
}
}
return $reply->media_id_string;
}
现在它可以正常工作了。
推荐阅读
- php - 选择电子邮件后selectpicker不显示数据
- sql - 我开发了一个 SQL 查询,但出现错误“遇到除以零错误”。
- graphics - 三.js renderer.setPixelRatio() 应该改变渲染对象的大小吗?
- reactjs - 404页面不适用于反应中的嵌套路由
- python - 为列中 True 值的每个子块添加一个序列号
- vba - 自动显示基于单元格值的图像
- swift - 如何从核心数据中的每组对象中获取第一个对象
- twitter-bootstrap - Javsacript:根据图像数据创建背景渐变
- android - 如何在android形状中绘制水平线和垂直线
- java - 为什么我升级 android studio v.2020.3.1 后无法运行颤振