Python Youtube数据API不断要求授权

Python Youtube数据API不断要求授权,python,google-oauth,youtube-data-api,Python,Google Oauth,Youtube Data Api,我正在尝试制作一个简单的python程序,它使用Youtube数据API根据Youtube搜索查询检索结果 我已经创建了OAuth凭据并拥有一个客户端。每次我运行python程序时,它总是要求我获取授权密钥,以便我可以进行查询。我必须打开chrome浏览器,访问API提供给我的URL,登录到我的Google帐户并粘贴密钥 有人能演示一下我如何使这个过程自动化吗?我在网上和stackoverflow上读到,我需要一个刷新令牌,或者以某种方式存储一个,这样每次都不会提示我授权 我的代码(复制自):

我正在尝试制作一个简单的python程序,它使用Youtube数据API根据Youtube搜索查询检索结果

我已经创建了OAuth凭据并拥有一个客户端。每次我运行python程序时,它总是要求我获取授权密钥,以便我可以进行查询。我必须打开chrome浏览器,访问API提供给我的URL,登录到我的Google帐户并粘贴密钥

有人能演示一下我如何使这个过程自动化吗?我在网上和stackoverflow上读到,我需要一个刷新令牌,或者以某种方式存储一个,这样每次都不会提示我授权

我的代码(复制自):


我也遇到了同样的问题。在搜索“YouTube数据Api v3”文档后,我发现:

如果您使用的是已安装的应用程序流,则此示例代码中不会存储授权凭据,因此后续执行将提示重新授权

所以我想你应该改用“Web服务器应用程序”流程。这是没办法的

# -*- coding: utf-8 -*-

import os

import google.oauth2.credentials

import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow

# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'

def get_authenticated_service():
  flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRETS_FILE, SCOPES)
  credentials = flow.run_console()
  return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)

def print_response(response):
  print(response)

# Build a resource based on a list of properties given as key-value pairs.
# Leave properties with empty values out of the inserted resource.
def build_resource(properties):
  resource = {}
  for p in properties:
    # Given a key like "snippet.title", split into "snippet" and "title", where
    # "snippet" will be an object and "title" will be a property in that object.
    prop_array = p.split('.')
    ref = resource
    for pa in range(0, len(prop_array)):
      is_array = False
      key = prop_array[pa]

      # For properties that have array values, convert a name like
      # "snippet.tags[]" to snippet.tags, and set a flag to handle
      # the value as an array.
      if key[-2:] == '[]':
        key = key[0:len(key)-2:]
        is_array = True

      if pa == (len(prop_array) - 1):
        # Leave properties without values out of inserted resource.
        if properties[p]:
          if is_array:
            ref[key] = properties[p].split(',')
          else:
            ref[key] = properties[p]
      elif key not in ref:
        # For example, the property is "snippet.title", but the resource does
        # not yet have a "snippet" object. Create the snippet object here.
        # Setting "ref = ref[key]" means that in the next time through the
        # "for pa in range ..." loop, we will be setting a property in the
        # resource's "snippet" object.
        ref[key] = {}
        ref = ref[key]
      else:
        # For example, the property is "snippet.description", and the resource
        # already has a "snippet" object.
        ref = ref[key]
  return resource

# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
  good_kwargs = {}
  if kwargs is not None:
    for key, value in kwargs.iteritems():
      if value:
        good_kwargs[key] = value
  return good_kwargs

def search_list_by_keyword(client, **kwargs):
  # See full sample for function
  kwargs = remove_empty_kwargs(**kwargs)

  response = client.search().list(
    **kwargs
  ).execute()

  return print_response(response)


if __name__ == '__main__':
  # When running locally, disable OAuthlib's HTTPs verification. When
  # running in production *do not* leave this option enabled.
  os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
  client = get_authenticated_service()

  search_list_by_keyword(client,
    part='snippet',
    maxResults=25,
    q='surfing',
    type='')