Загрузка видео в Twitter с помощью API

1

Я использую библиотеку tmhOAuth для отправки в Twitter в приложении, и я уже реализовал загрузку фотографий, но у меня проблемы с загрузкой видео.

Это вызов, который я использую для загрузки изображений и отлично работает с изображениями.

$temp = '@upload/'.$name.';type='.$_FILES['img']['type'].';filename='.$name;
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json', array('media' => $temp), true, true);

Поэтому я думал, что это может быть одинаково для видео, но я получил ошибку

stdClass Object ( [request] => /1.1/media/upload.json [error] => media type unrecognized. )

Я считаю, что я должен сделать 3 отдельных вызова, согласно API Twitter, поэтому я попробовал это

$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=INIT&media_type=video/mp4&total_bytes='.$_FILES['img']['size'], array('media' => $temp), true, true);
$media_id = json_decode($tmhOAuth->response['response'])->media_id_string;
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id='.$media_id.'&segment_index=0', array('media' => $temp), true, true);
$media = $tmhOAuth->request('POST', 'https://upload.twitter.com/1.1/media/upload.json?command=FINALIZE&media_id='.$media_id, array('media' => $temp), true, true);

но я все равно получал ту же ошибку для всех 3 вызовов

stdClass Object ( [request] => /1.1/media/upload.json [error] => media type unrecognized. )

Может ли кто-нибудь представить пример того, как загружать видео в твиттер? Я не мог найти примеров онлайн, и это может быть просто невозможно.

Теги:
twitter

3 ответа

6

У меня такая же проблема. Вот как мне удалось это решить. Сначала вы настроили var, содержащий полный путь к файловой системе, на носитель, который вы хотите загрузить.

$media_path = '/PATH/TO/THE/file.mp4';

Затем создайте экземпляр $ tmhOAuth и выполните 3 шага:

$tmhOAuthUpload = new tmhOAuth();

ИНИТ:

$code = $tmhOAuthUpload->request(
      'POST',
      $tmhOAuthUpload->url('/1.1/media/upload.json'),
      array(
          "command" => "INIT",
          "total_bytes" => (int)filesize($media_path),
          'media_type' => 'video/mp4',
      )
);

Получить идентификатор СМИ, возвращенный Twitter

$results = json_decode($tmhOAuthUpload->response['response']);
$media_id = $results->media_id_string;

ПРИЛОЖЕНИЕ: Обработка загрузки видео/мультимедиа с помощью цикла Append

$fp = fopen($media_path, 'r');
$segment_id = 0;
while (! feof($fp)) {
    $chunk = fread($fp, 1048576); // 1MB per chunk for this sample

    $tmhOAuthUpload->request(
        'POST',
        $tmhOAuthUpload->url('/1.1/media/upload.json'),
        array(
            "command" => "APPEND",
            "media_id" => $media_id,
            'media_data' => base64_encode($chunk),
            "segment_index" => $segment_id
        )
    );
    $segment_id++;
}

ЗАКЛЮЧИТЕЛЬНО:

$tmhOAuthUpload->request(
     'POST',
     $tmhOAuthUpload->url('/1.1/media/upload.json'),
     array(
          "command" => "FINALIZE",
          "media_id" => $media_id,
     )
);

К тому моменту я смог отправить свой твит:

$code = $tmhOAuth->request(
      'POST',
      $tmhOAuthUpload->url('1.1/statuses/update'),
      array(
            'media_ids'  => $media_id,
            'status'   => $text,
      ),
      true // use auth
);

надеюсь, это поможет

  • 0
    С некоторыми изменениями это сработало (спасибо). Хост для загрузки отличается от хоста для обновления (api.twitter.com и upload.twitter.com).
2

Большое спасибо за ответ Пьер! Тем не менее, я получал ошибку "Недействительный видео", если я попытался создать твитер слишком рано. Видео не было обработано Twitter. В дополнение к коду Пьера мне понадобилось что-то вроде этого, чтобы проверить состояние, после того, как FINALIZE:

$videoCount = 0;
do
{
    $tmhOAuth->request(
        'GET',
        $tmhOAuth->url('/1.1/media/upload.json'),
        array(
            "command" => "STATUS",
            "media_id" => $mediaID,
        )
    );
    $twitterResult = json_decode($tmhOAuth->response['response']);
    if ($twitterResult->processing_info->state != 'succeeded')
    { sleep(5); }
    $videoCount++;
}
while ($twitterResult->processing_info->state != 'succeeded' && $videoCount < 5);

Примечание. Мои имена переменных различаются

1

Мне удалось загрузить видео с помощью CodeBird - другой библиотеки PHP.

API API Twitter для видео отличается от загрузки изображений, как вы обнаружили.

Загрузка видео в Twitter (≤ 15 МБ, MP4) требует, чтобы вы отправляли их в куски. Вам необходимо выполнить не менее 3 вызовов, чтобы получить медиа файл для видео:

  • Отправьте событие INIT, чтобы получить проект media_id.

  • Загрузите свои куски с помощью событий APPEND, каждый размером до 5 МБ.

  • Отправьте событие FINALIZE, чтобы преобразовать черновик в готовый к чтению media_id.
  • Отправьте свой твит с прикрепленным видео.

Помните, что каждый APPEND должен быть 5 МБ или меньше.

Если вы последовательно получаете ошибки "Тип носителя без признания", возможно, видео, которое вы используете, несовместимо с Twitter. Можете ли вы проверить загрузку видео через другую услугу?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню