google.oauth2.credentials.Credentials завершается ошибкой с действительным токеном - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь перечислить свои каналы YouTube через Python 3.6, учитывая (и это важно) токен доступа EXISTING и некоторый действительный ключ API. Он хорошо работает с curl и возвращает действительный JSON ответ:

curl 'https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true&key=API_KEY' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer ACCESS_TOKEN'

ответ:

{
    "kind": "youtube#channelListResponse",
    "etag": "\"xxxxxxxxx\"",
    "pageInfo": {...},
    "items": [...]
}

Если я удаляю заголовок авторизации, я получаю ожидаемую ошибку:

{
    "error": {
        "errors": [
            {
                "domain": "youtube.parameter",
                "reason": "authorizationRequired",
                "message": "The request uses the <code>mine</code> parameter but is not properly authorized.",
                "locationType": "parameter",
                "location": "mine"
            }
        ],
        "code": 401,
        "message": "The request uses the <code>mine</code> parameter but is not properly authorized."
    }
}

Теперь я пытаюсь сделать то же самое с библиотекой Google Python (потому что она мне нужна для более сложных операций и контроля кода), но она не работает. Я получаю ту же ошибку, как если бы я не передал токен доступа. Есть идеи, что я делаю не так? Вот мой Python код (обратите внимание, что коду присвоен код доступа, я ДОЛЖЕН использовать его как есть):

import argparse
import google.oauth2.credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

def get_authenticated_service(options):
  creds = google.oauth2.credentials.Credentials(options.access_token)
  return build('youtube', 'v3', credentials=creds, developerKey=options.api_key)

def list_channels(youtube, options):
  request = youtube.channels().list(part="snippet", mine=True)
  response = request.execute()
  print(response)

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--api_key', required=True)
  parser.add_argument('--access_token', required=True)
  args = parser.parse_args()
  youtube = get_authenticated_service(args)
  try:
    list_channels(youtube, args)
  except HttpError as e:
    print('An HTTP error {0} occurred:\n{1}'.format(e.resp.status, e.content))

Я запускаю его так:

python3 test.py --api_key MY_API_KEY --access_token MY_ACCESS_TOKEN

1 Ответ

1 голос
/ 20 марта 2020

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

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

Ссылка:

...