YouTube API v3 постоянно запрашивает авторизацию

Я использую YouTube api v3 для извлечения списка видео с помощью примера на странице https://developers.google.com/youtube/v3/code_samples/php#retrieve_my_uploads

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

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

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

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

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

У меня длинный ответ, но это должно быть большой помощью. У меня была такая же проблема с плохой документацией, и я также пытаюсь получить список видео из плейлиста для моего проекта. API v3 волшебным образом начал работать для меня после битвы за последние пару дней, вот что я сделал.

Сначала был фактически получен ключ API. Я уверен, что вы уже были в Google Developers Console, но на всякий случай вот что нужно сделать для этого шага:

  1. Создайте проект в Google Developers Console
  2. Включить API API данных YouTube v3
  3. В разделе «Учетные данные», если у вас была такая же проблема, как и я, вы можете создать новый идентификатор клиента, но не ключ API.

Это серьезная проблема, потому что вам нужен ключ API для простого запроса данных без авторизации, например, получение списка видео из списка воспроизведения. Чтобы получить ключ API, вернитесь в раздел «API», нажмите «API данных YouTube 3», и вот экран с индикатором загрузки, который никогда ничего не нагружает. Однако вы можете нажать «Квота» здесь, и он перенесет вас в более старую версию Консоли разработчиков.

Из этой старой версии вы можете перейти к «API-доступу» и добавить ключи простого доступа к API (ключи API работают в этой старой версии, но не в новой версии Консоли разработчиков). Я мог ошибаться в этом, но я думаю, что «Создать новый ключ сервера …» для серверных языков, таких как PHP, и «Создать новый ключ браузера …» – для клиентских языков, таких как Javascript. Есть также кнопки для Android и iOS-ключей, но я предполагаю, что вам это не нужны. Во всяком случае, я использую cURL в PHP, и для меня работал серверный ключ, я настроил его на любые рефереры, пока мой проект все еще находится в разработке.

После того, как вы получите свой Ключ для серверных приложений под Простым API-доступом , может быть какое-то время, прежде чем все запросы, использующие ключ, действительно будут работать. Для меня мой сценарий не работал около 4-5 часов (я думаю, что на этой неделе у Google возникают настоящие проблемы с их серверами, и именно поэтому мне пришлось «обмануть» его, предоставив мне ключ API. почему страница «Учетные данные» не загружает ничего).

Теперь воспользуйтесь инструментом https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.playlists.list, чтобы помочь создать запрос GET. Введите «фрагмент» в поле детали и целое число для maxResults, если это необходимо. Затем получите идентификатор списка воспроизведения из URL-адреса на Youtube. Например, серия «Clueless Gamer» Конана – https://www.youtube.com/playlist?list=PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY , поэтому идентификатор PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY . Затем нажмите « Выполнить» .

Теперь он даст вам запрос GET, что-то вроде

GET https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY&maxResults=20&key={YOUR_API_KEY} X-JavaScript-User-Agent: Google APIs Explorer 

Просто возьмите URL-адрес после слова GET и замените {YOUR_API_KEY} на свой ключ API.

Теперь вы можете использовать этот URL-адрес в запросе cURL, например, где $ request_url – это URL-адрес выше с вашим ключом API в нем:

 //http://codular.com/curl-with-php // Get cURL resource $curl = curl_init(); // Set some options - we are passing in a useragent too here curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $request_url, CURLOPT_USERAGENT => 'Codular Sample cURL Request' )); // Send the request & save response to $resp $resp = curl_exec($curl); // Close request to clear up some resources curl_close($curl); 

Теперь $ resp будет содержать строку JSON, которую вы можете проанализировать и получить данные для видео этого плейлиста. Я оставлю JSON синтаксический анализ до вас, но именно так вы получаете данные, похожие на старый gdata путь в v2. И нет аутентификации 🙂

Он может сообщить об ошибке, что ваш ключ API не авторизован, и в этом случае вам нужно будет подождать несколько часов. Опять же, я думаю, что Google в последнее время испытывает проблемы с сервером, поэтому будьте терпеливы; это не ваш скрипт, который не работает, это Google;)

Отмечу, что

 $resp = file_get_contents($request_url); 

похоже, работает, но я честно не знаю, какой метод «лучше» между cURL и file_get_contents ().

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

Оказалось, что мне нужно создать запрос POST для получения кода доступа и обновления токена, и это было достигнуто с помощью Curlfrom командной строки

 url --data "code=AUHROISATON_CODE&client_id=CLIENT_ID.apps.googleusercontent.com&client_secret=CLINET_SECRET&redirect_uri=http://www.example.com&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token 

После нескольких ошибок, таких как «Отсутствует grant_type», «Недопустимый код» теперь работает.

Я отозвал доступ к приложению, выполнил следующий запрос GET (взятый из https://developers.google.com/accounts/docs/OAuth2WebServer#formingtheurl ), чтобы получить код и смог использовать код в приведенном выше описании Curl

https://accounts.google.com/o/oauth2/auth ? scope = https://www.googleapis.com/auth/youtube& state = security_token% 3D138r5719ru3e1% 26url% 3Dhttps: //oa2cb.example.com/myHome& redirect_uri = https% 3A% 2F% 2Foauth2-login-demo.appspot. com% 2Fcode &, response_type = code & client_id = 812741506391.apps.googleusercontent.com & approved_prompt = force