Загрузите видео на Youtube с помощью curl и api v3

Я бы загрузил видео с помощью Youtube API v3 с curl в PHP, как описано здесь: https://developers.google.com/youtube/v3/docs/videos/insert

У меня есть эта функция

function uploadVideo($file, $title, $description, $tags, $categoryId, $privacy) { $token = getToken(); // Tested function to retrieve the correct AuthToken $video->snippet['title'] = $title; $video->snippet['description'] = $description; $video->snippet['categoryId'] = $categoryId; $video->snippet['tags'] = $tags; // array $video->snippet['privacyStatus'] = $privacy; $res = json_encode($video); $parms = array( 'part' => 'snippet', 'file' => '@'.$_SERVER['DOCUMENT_ROOT'].'/complete/path/to/'.$file 'video' => $res ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/youtube/v3/videos'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $parms); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$token['access_token'])); $return = json_decode(curl_exec($ch)); curl_close($ch); return $return; } 

Но он возвращает это

 stdClass Object ( [error] => stdClass Object ( [errors] => Array ( [0] => stdClass Object ( [domain] => global [reason] => badContent [message] => Unsupported content with type: application/octet-stream ) ) [code] => 400 [message] => Unsupported content with type: application/octet-stream ) ) 

Файл MP4.

Кто-нибудь может помочь?

К сожалению, у нас пока нет конкретного примера загрузки API-интерфейсов YouTube API v3 с PHP, но мои общие рекомендации:

  • Используйте клиентскую библиотеку PHP вместо cURL.
  • Настройте свой код в этом примере, написанном для Drive API. Поскольку API YouTube v3 использует общую инфраструктуру API с другими API Google, примеры для работы с такими вещами, как загрузка файлов, должны быть очень похожими для разных служб.
  • Взгляните на пример Python для конкретных метаданных, которые необходимо установить в загрузке YouTube v3.

В общем, с вашим кодом cURL есть много чего-то, и я не могу пройти все шаги, которые он предпримет, чтобы исправить это, поскольку я думаю, что использование клиентской библиотеки PHP является гораздо лучшим вариантом. Если вы уверены, что хотите использовать cURL, тогда я отдам другому лицу, чтобы дать конкретные рекомендации.

Обновленная версия: теперь с настраиваемым URL-адресом загрузки и отправкой метаданных с процессом загрузки. Для всего процесса требуется 2 запроса:

  1. Получить пользовательское местоположение загрузки

    Сначала сделайте запрос POST для URL-адреса для загрузки:

     "https://www.googleapis.com/upload/youtube/v3/videos" 

    Вам нужно будет отправить 2 заголовка:

     "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" "Content-type": "application/json" 

    Вам необходимо отправить 3 параметра:

     "uploadType": "resumable" "part": "snippet, status" "key": {YOUR_API_KEY} 

    И вам нужно будет отправить метаданные для видео в тело запроса:

      { "snippet": { "title": {VIDEO TITLE}, "description": {VIDEO DESCRIPTION}, "tags": [{TAGS LIST}], "categoryId": {YOUTUBE CATEGORY ID} }, "status": { "privacyStatus": {"public", "unlisted" OR "private"} } } 

    Из этого запроса вы должны получить ответ с полем «местоположение» в заголовках.

  2. POST в пользовательское местоположение для отправки файла.

    Для загрузки вам нужен 1 заголовок:

     "Authorization": "Bearer {YOUR_ACCESS_TOKEN}" 

    И отправьте файл как ваш файл / тело.

Если вы прочитаете, как работает их клиент, вы увидите, что они рекомендуют повторить попытку, если вам возвращаются ошибки кода 500, 502, 503 или 504. Очевидно, что вам понадобится период ожидания между попытками и максимальное количество попыток. Он работает в моей системе каждый раз, хотя я использую python & urllib2 вместо cURL.

Кроме того, из-за пользовательского места загрузки эта версия загружается возобновляемой, хотя мне это еще нужно.

скрипт python:

 # categoryId is '1' for Film & Animation # to fetch all categories: https://www.googleapis.com/youtube/v3/videoCategories?part=snippet&regionCode={2 chars region code}&key={app key} meta = {'snippet': {'categoryId': '1', 'description': description, 'tags': ['any tag'], 'title': your_title}, 'status': {'privacyStatus': 'private' if private else 'public'}} param = {'key': {GOOGLE_API_KEY}, 'part': 'snippet,status', 'uploadType': 'resumable'} headers = {'Authorization': 'Bearer {}'.format(token), 'Content-type': 'application/json'} #get location url retries = 0 retries_count = 1 while retries <= retries_count: requset = requests.request('POST', 'https://www.googleapis.com/upload/youtube/v3/videos',headers=headers,params=param,data=json.dumps(meta)) if requset.status_code in [500,503]: retries += 1 break if requset.status_code != 200: #do something location = requset.headers['location'] file_data = open(file_name, 'rb').read() headers = {'Authorization': 'Bearer {}'.format(token)} #upload your video retries = 0 retries_count = 1 while retries <= retries_count: requset = requests.request('POST', location,headers=headers,data=file_data) if requset.status_code in [500,503]: retries += 1 break if requset.status_code != 200: #do something # get youtube id cont = json.loads(requset.content) youtube_id = cont['id'] 

Я смог загрузить видео на свой канал на YouTube, используя следующий сценарий оболочки.

 #!/bin/sh # Upload the given video file to your YouTube channel. cid_base_url="apps.googleusercontent.com" client_id="<YOUR_CLIENT_ID>.$cid_base_url" client_secret="<YOUR_CLIENT_SECRET>" refresh_token="<YOUR_REFRESH_TOKEN>" token_url="https://accounts.google.com/o/oauth2/token" api_base_url="https://www.googleapis.com/upload/youtube/v3" api_url="$api_base_url/videos?uploadType=resumable&part=snippet" access_token=$(curl -H "Content-Type: application/x-www-form-urlencoded" -d refresh_token="$refresh_token" -d client_id="$client_id" -d client_secret="$client_secret" -d grant_type="refresh_token" $token_url|awk -F '"' '/access/{print $4}') auth_header="Authorization: Bearer $access_token" upload_url=$(curl -I -X POST -H "$auth_header" "$api_url"|awk -F ' |\r' '/loc/{print $2}'); curl -v -X POST --data-binary "@$1" -H "$auth_header" "$upload_url" 

Обратитесь к этому аналогичному вопросу о том, как получить значения пользовательской переменной.