Python 3.x Youtube数据API v.3-全自动oAuth流(Python)?

Python 3.x Youtube数据API v.3-全自动oAuth流(Python)?,python-3.x,youtube-data-api,google-oauth,Python 3.x,Youtube Data Api,Google Oauth,我一直在探索YouTube数据API。我的项目的前提很简单:使用API,进行身份验证(是的,我有帐户的凭据),然后简单地检索我的所有视频列表,包括公共和私人视频 我已经能够成功地完成这一点,除了完全自动化的部分。我使用了来自不同来源的代码,当我在命令行上运行它时,它为我提供了一个链接,供我在浏览器中使用,以便进行授权 它看起来像这样: 请访问此URL以授权此应用程序: 输入授权代码: 下面是我的python代码片段: import google_auth_oauthlib.flow impor

我一直在探索YouTube数据API。我的项目的前提很简单:使用API,进行身份验证(是的,我有帐户的凭据),然后简单地检索我的所有视频列表,包括公共和私人视频

我已经能够成功地完成这一点,除了完全自动化的部分。我使用了来自不同来源的代码,当我在命令行上运行它时,它为我提供了一个链接,供我在浏览器中使用,以便进行授权

它看起来像这样:

请访问此URL以授权此应用程序: 输入授权代码:

下面是我的python代码片段:

import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
...
...

# Get credentials and create an API client
flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
    client_secrets_file, scopes)
credentials = flow.run_console()
youtube = googleapiclient.discovery.build(
    api_service_name, api_version, credentials=credentials)
## MAKE youtube SEARCH REQUEST
last_date = '2018-10-01T00:00:00Z'
request = youtube.search().list(
    part="snippet",
    forMine=True,
    maxResults=50,
    order="date",
    type="video"
)
all_items = []
response = request.execute()
我的问题如下:是否可以通过编程执行授权,以便应用程序可以独立运行,而不必等待此用户操作(要从CMD复制URL,请访问以获取令牌,然后再次复制并粘贴令牌)?我想安排这个,因此希望它在没有人为干预的情况下运行和验证。这可能吗?如果是这样,有人能给我指一些工作示例和/或其他资源来帮助我达到目的吗?非常感谢。

复制自

第三步:谷歌提示用户同意 在此步骤中,用户决定是否授予您的应用程序所请求的访问权限。在此阶段,Google将显示一个同意窗口,其中显示您的应用程序的名称以及Google API服务的名称,该应用程序和服务请求使用用户的授权凭据进行访问。然后,用户可以同意或拒绝授予对您的应用程序的访问权限

在这个阶段,您的应用程序不需要做任何事情,因为它会等待来自Google的OAuth 2.0服务器的响应,该响应指示是否授予了访问权限。该响应将在以下步骤中解释

这一点很重要:

在此阶段,Google将显示一个同意窗口,其中显示您的应用程序的名称以及Google API服务的名称,该应用程序和服务请求使用用户的授权凭据进行访问

所以,至少在我的理解中,出于安全原因,您不应该做您想做的事情。 但是:您可以通过python有多少libs来“模拟”浏览器。另一方面:一旦您获得了auth令牌,您就可以重新使用它,而不是每次都请求一个新令牌。我在GitHub上提供的文档中找不到它,但Java作为示例支持将获取的令牌与其刷新令牌一起存储,以便在获取并自动刷新后可以重用。也许python提供了一些方法来存储获得的令牌(检查它是否包含刷新令牌)并重新加载它。另外:如果加载这样的令牌,首先要做的是在使用它之前刷新它。Java提供了一种只保存刷新令牌而不是整个身份验证令牌的方法,它可以在以后的运行中用于自动获取新的身份验证令牌。 由于响应是一个JSON,如果lib还没有提供,那么您可以自己构建一些JSON

//编辑

除 有两种方法可以从“授权用户信息”(也可以从文件中加载)或直接从文件中加载凭据对象。所以,我想你只需要弄清楚如何存储代币。正如doc所说,对于from_authorized_user_文件:

从授权用户json文件创建凭据实例


我猜这意味着您只需保存完成初始授权后得到的令牌响应。

来自
Credentials=flow的
凭据
实例。run_console()
具有刷新令牌的内置功能。 如果需要,它将在执行请求时刷新令牌

因此,您可以将
凭证
对象保存到pickle中,并在需要时将其读回

Google python示例代码的一些改动:

def get_authenticated_service():
如果os.path.存在(凭据\u PICKLE\u文件):
打开(凭据\u PICKLE\u文件'rb')作为f:
凭据=pickle.load(f)
其他:
flow=InstalledAppFlow.from_client_secrets_文件(client_secrets_文件,作用域)
凭据=流。运行控制台()
打开(凭证\u PICKLE\u文件“wb”)作为f:
pickle.dump(凭证,f)
返回生成(API\U服务\U名称、API\U版本、凭据=凭据)
# -*- coding: utf-8 -*-
# Sample Python code for youtube.channels.list
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/guides/code_samples#python
#!/usr/bin/python3.7
import os
import pickle
import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors
scopes = ["https://www.googleapis.com/auth/youtube.readonly"]
client_secrets_file = "client_secret.json"
api_service_name = "youtube"
api_version = "v3"

def main():
    # Disable OAuthlib's HTTPS verification when running locally.
    # *DO NOT* leave this option enabled in production.
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    # Get credentials and create an API client
    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
        client_secrets_file, scopes)
    youtube = get_authenticated_service()
    request = youtube.channels().list(
        part="contentDetails",
        mine=True
    )
    response = request.execute()
    print(response)

def get_authenticated_service():
    if os.path.exists("CREDENTIALS_PICKLE_FILE"):
        with open("CREDENTIALS_PICKLE_FILE", 'rb') as f:
            credentials = pickle.load(f)
    else:
        flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(client_secrets_file, scopes)
        credentials = flow.run_console()
        with open("CREDENTIALS_PICKLE_FILE", 'wb') as f:
            pickle.dump(credentials, f)
    return googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials)
if __name__ == "__main__":
    main()