首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Youtube数据API v.3 -全自动oAuth流(Python)?

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

Stack Overflow用户
提问于 2019-09-24 04:31:59
回答 3查看 3.1K关注 0票数 4

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

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

看起来是这样的:

请访问此URL以授权此应用程序:https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=7932902759886-cb8ai84grcqshe24nn459ka46uh45ssj.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&state=zNVvgEyO47nmacvdEEAhDsQipY194k&prompt=consent&access_type=offline&code_challenge=aF7uTCghjwgwjg49o3fgiIU-_ryK19rDeX4l1uzr37w&code_challenge_method=S256输入授权代码:

……

下面是我的python代码片段:

代码语言:javascript
复制
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、访问获取令牌以及复制和粘贴令牌)?我想安排这一点,因此希望它在没有人为干预的情况下运行和验证。这有可能吗?如果是这样的话,能给我指出一些有用的例子和/或其他资源来帮助我达到这个目标吗?谢谢百万,

EN

回答 3

Stack Overflow用户

发布于 2020-03-11 05:55:50

代码语言:javascript
复制
# -*- 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()
票数 6
EN

Stack Overflow用户

发布于 2020-02-27 02:32:02

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

因此,您可以将credentials对象保存到泡菜中,并在需要时读取它。

对Google示例代码做一些修改:

代码语言:javascript
复制
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 = 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 build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
票数 5
EN

Stack Overflow用户

发布于 2019-09-24 09:48:43

https://developers.google.com/identity/protocols/OAuth2InstalledApp复制

步骤3:在此步骤中,用户决定是否授予应用程序所请求的访问权限。在此阶段,Google显示一个同意窗口,该窗口显示应用程序的名称以及它请求使用用户授权凭据访问权限的Google服务。然后,用户可以同意或拒绝授予您的应用程序访问权限。

您的应用程序在这个阶段不需要做任何事情,因为它等待来自谷歌OAuth 2.0服务器的响应,指示访问是否被授予。这一反应将在下面的步骤中解释。

如果这一点很重要:

在这个阶段,

显示一个同意窗口,该窗口显示应用程序的名称以及它请求使用用户授权凭据访问权限的Google服务。

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

//编辑

此外,在https://github.com/googleapis/google-auth-library-python/blob/master/google/oauth2/credentials.py中还有一些方法可以从“授权用户信息”(在某个地方也可以从文件加载)加载凭据对象,或者直接从文件加载它。所以,我想你只需要想出如何存储令牌就行了。正如医生对from_authorized_user_file所说的那样:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58073119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档