Мой окончательный код похож на учебник:-
Код: Выделить всё
$file = fopen('svid.mp4', 'rb');
$size = fstat($file)['size'];
$media = $twitter->media_upload([
'command' => 'INIT',
'media_type' => 'video/mp4',
'media_category' => 'tweet_video',
'total_bytes' => $size,
]);
$mediaId = $media->media_id_string;
$segmentId = 0;
while (!feof($file)) {
$chunk = fread($file, 4 * 1024 * 1024);
$media = $twitter->media_upload([
'command' => 'APPEND',
'media_id' => $mediaId,
'segment_index' => $segmentId,
'media' => $chunk,
]);
$segmentId++;
}
fclose($file);
$media = $twitter->media_upload([
'command' => 'FINALIZE',
'media_id' => $mediaId,
]);
var_dump($media);
if(isset($media->processing_info)) {
$info = $media->processing_info;
if($info->state != 'succeeded') {
$attempts = 0;
$checkAfterSecs = $info->check_after_secs;
$success = false;
do {
$attempts++;
sleep($checkAfterSecs);
$media = $twitter->media_upload([
'command' => 'STATUS',
'media_id' => $mediaId,
]);
$procInfo = $media->processing_info;
if($procInfo->state == 'succeeded' || $procInfo->state == 'failed') {
break;
}
$checkAfterSecs = $procInfo->check_after_secs;
} while($attempts 'This is the text of your tweet!',
'media_ids' => $mediaId,
];
$tweet = $twitter->statuses_update($params);
object( stdClass)#7 (8) { ["media_id"]=> int(1879869571785728000)
["media_id_string"]=> string(19) "1879869571785728000" ["media_key"]=>
string(21) "7_1879869571785728000" ["size"]=> int(2848208)
["expires_after_secs"]=> int(86400) ["processing_info "]=>
object(stdClass)#5 (2) { ["state"]=> string(7) "pending"
["check_after_secs"]=> int(1) } ["httpstatus"]=> int (200) ["rate"]=>
object(stdClass)#10 (3) { ["limit"]=> string(3) "615" ["remaining"]=>
string(3) "605" ["reset"]=> string(10) "1737032398" }
Как видите, состояние находится в состоянии ожидания. Таким образом, невозможно будет опубликовать сообщение с использованием следующего кода: $tweet = $twitter->statuses_update($params);. Итак, я попытался запустить это, чтобы проверить проблему: -
Код: Выделить всё
$media = $twitter->media_upload([
'command' => 'STATUS',
'media_id' => '1879869571785728000',
]);
object(stdClass)#6 (3) { ["errors"] => array(1) { [0]=>
object(stdClass)#9 (2) { ["code"]=> int(38) ["message"]=> string(27)
"отсутствует медиа-параметр." } } ["httpstatus"]=> int(400) ["rate"]=>
object(stdClass)#11 (3) { ["limit"]=> string(3) "415" [" rest"]=>
string(3) "391" ["reset"]=> string(10) "1737032321" }
Я пытался это изучить, но решения не нашел. Теперь кратко изложу проблемы, с которыми я столкнулся:-
- при проверке статуса загрузки. Поэтому у меня нет возможности узнать, прошла ли загрузка успешно и успешно ли она обработана.
Код: Выделить всё
media parameter is missing
- не работает даже с удаленными media_ids (т. е. только текст). Я попробовал добавить твит с помощью двух других библиотек (https://github.com/abraham/twitteroauth и https://github.com/noweh/twitter-api-v2-php). В обоих случаях простой текст работает, но не работает с медиа. Но я пытался перейти на Codebird из-за простоты загрузки фрагментов.
Код: Выделить всё
$tweet = $twitter->statuses_update($params);
- Я попробовал запустить идентификатор носителя через https://docs.x.com/x-api. /mediaupload/media-upload-status?playground=open, чтобы узнать его статус, но он каждый раз выдает 404, независимо от конечной точки. Я пробовал все комбинации клиента Oauth и секрета, ключа потребителя/API, секрета и токена авторизации в пустой строке авторизации, но каждый раз просто выдает ошибку 404.
Подробнее здесь: https://stackoverflow.com/questions/793 ... g-when-che