使用 Python 的具有多个帐户的 YouTube 数据 API

Posted

技术标签:

【中文标题】使用 Python 的具有多个帐户的 YouTube 数据 API【英文标题】:YouTube Data API with multiple accounts using Python 【发布时间】:2021-05-17 20:58:06 【问题描述】:

我正在开发一个应用程序,旨在帮助我的一个朋友更好地组织他的 YouTube 频道。他在不同的 Google 帐户上有多个频道。我正在使用 Python 进行开发,目前我对 YouTube 数据 API 没有太多经验,我打算使用它,因为它似乎是唯一的选择。

应用程序本身并不是很复杂。它唯一需要做的就是上传具有指定标题、描述和其他属性的视频,并且还应该可以在视频上编写 cmets。我在 Google Developers Console 中启动了一个简单的应用程序,启用了 YouTube 数据 API 并创建了一个 API 密钥和一个 OAUTH-Client ID。

到目前为止,我已经设法在视频上发布了 cmets,但似乎每次我运行 Python 脚本(目前它只是一个发布单个评论的简单脚本)时,Google 都希望我明确选择我想要的帐户使用,每次运行时我都必须授予脚本权限。

有没有一种方法可以让我只运行一次脚本并告诉 Google 我想使用哪个帐户来发表评论,授予所有权限,然后 Google 会记住这一点,这样我就不必每次都明确授予权限?

另外,我如何能够切换帐户并使用该帐户进行上传,因为目前我总是需要选择一个,当谷歌客户端弹出时,运行脚本时。

我听说您可以获得 Google 授权的应用程序,这对这有帮助吗?或者如果我只是将我的应用程序保持在测试中而不是在生产环境中是否可以?

【问题讨论】:

您的代码在哪里?正如我在第一次运行时知道的那样,您使用的代码要求特权并为您提供应保存在文件中的令牌。下次您应该从文件中加载令牌并跳过要求特权的代码。这甚至可以显示在 Google 示例中(在 GitHub 代码或其他文档中) 欢迎来到 ***!请阅读:How do I ask a good question? 对于多个帐户,您将获得多个tokens(您必须将其保存在文件中 - 即pickle),并且每个令牌都只能让您访问一个帐户。 Any way to use Google Api without every-time authentication? 请@roblox99 再次发布您的问题。在我能够完成对您的 API 用例的回答之前,他们就匆忙结束了您的问题。 【参考方案1】:

如果您有N 帐户并希望在每个帐户上上传视频,那么您必须运行以成功完成N OAuth 2 授权/身份验证流程。

对于这些N OAuth 流程中的每一个,在成功完成每个流程后,您必须将获得的凭据数据永久保存到计算机本地存储中的单独文件中。

这很可能被认为是您的应用程序的初始化步骤(尽管在以后的任何阶段,您都可以为您的应用程序需要注意的任何其他渠道重复它)。您的代码如下所示:

# run an OAuth flow; then obtain credentials data
# relative to the channel the app's user had chosen
# during that OAuth flow
from google_auth_oauthlib.flow import InstalledAppFlow
scopes = ['https://www.googleapis.com/auth/youtube']
flow = InstalledAppFlow.from_client_secrets_file(
           client_secret_file, scopes)
cred = flow.run_console()

# build an YouTube service object such that to
# be able to retrieve the ID of the channel that
# the app's user had chosen during the OAuth flow
from googleapiclient.discovery import build
youtube = build('youtube', 'v3', credentials = cred)
response = youtube.channels().list(
    part = 'id',
    mine = True
).execute()
channel_id = response['items'][0]['id']

# save the credentials data to a JSON text file
cred_file = f"/path/to/credentials/data/dir/channel_id.json"
with open(cred_file, 'w', encoding = 'UTF-8') as json_file:
    json_file.write(cred.to_json())

在上面,client_secret_file 是包含您从 Google Developers Console 获得的应用的客户端机密 JSON 文件的文件的完整路径。

随后,每次您要上传视频时,您都必须在应用程序中选择要将视频上传到哪个频道。从您的程序逻辑的角度来看,这意味着以下事情——假设您选择了 ID 为channel_id 的频道:请读入与channel_id 关联的凭据数据文件,以便将其内容传递给你的 YouTube 服务对象youtube 构造如下:

# read in the credentials data associated to
# the channel identified by its ID 'channel_id'
from google.oauth2.credentials import Credentials
cred_file = f"/path/to/credentials/data/dir/channel_id.json"
cred = Credentials.from_authorized_user_file(cred_file)

# the access token need be refreshed when
# the previously saved one expired already
from google.auth.transport.requests import Request
assert cred and cred.valid and cred.refresh_token
if cred.expired:
    cred.refresh(Request())
    # save credentials data upon it got refreshed
    with open(cred_file, 'w', encoding = 'UTF-8') as json_file:
        json_file.write(cred.to_json())

# construct an YouTube service object through
# which any API invocations are authorized on
# behalf of the channel with ID 'channel_id'
from googleapiclient.discovery import build
youtube = build('youtube', 'v3', credentials = cred)

运行此代码时,YouTube 服务对象 youtube 将被初始化,通过此对象发出的每个 API 端点调用都将代表 channel_id 标识的频道完成授权请求。

重要提示:您需要安装包Google Authentication Library for Python,google-auth,版本>= 1.21.3(google-auth v1.3.0 引入Credentials.from_authorized_user_file,v1.8.0 引入Credentials.to_json 和v1。 21.3 修复了后一个函数 wrt 其类'expiry 成员),以便将凭据对象 cred 保存到 JSON 文本文件并从中加载。

还有一个重要说明:上面的代码已尽可能简化。根本不处理错误条件。例如,当cred_file 在写出新的凭据数据文件时已经存在或cred_file 在读取应该已经存在的凭据数据时不存在时,上面的代码不会处理错误情况.

【讨论】:

很抱歉我的回答迟了,但这周我的工作很忙。无论如何,这对我很有帮助,非常感谢。 亲爱的 stvar,这段代码对我很有帮助。我很高兴你一直在推动重新打开这个问题

以上是关于使用 Python 的具有多个帐户的 YouTube 数据 API的主要内容,如果未能解决你的问题,请参考以下文章

具有多个帐户的应用内购买

如何在同一系统中维护多个具有多个 ssh 密钥的 bitbucket 帐户

如何为具有多个帐户的用户在Google App Scripts中选择帐户?

具有多个条件的python imaplib搜索

具有 Activemerchant gem 的多个商家帐户

具有多个用户帐户的Google Drive SDK OAuth2