Youtube API 请求凭据

Youtube API request credentials

我创建了一个使用 Youtube api 的 python 应用程序(示例在 python 中,但并不重要,概念应该相同)。我设法让它在我可以连接和拨打 api 电话的地方工作。但是,当我连接到 api 时,我必须定义一个流程来检查凭证存储文件是否存在。如果没有,那么我必须使用流程手动登录。登录文件 (main.py-oauth2.json) 后,将使用令牌创建文件。我希望能够下载凭据而无需手动登录。我希望有一种方法可以为该令牌发出 POST 请求,就像我看到的 here,但我已经能够通过 Youtube api 做到这一点。有谁知道如何实现所需的功能?

main.py

flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
    scope=YOUTUBE_UPLOAD_SCOPE,
    message=MISSING_CLIENT_SECRETS_MESSAGE)
storage = Storage(OAUTH_CREDENTIALS)

credentials = storage.get()

if credentials is None or credentials.invalid:
    # manual / UI login
    credentials = run_flow(flow, storage, args)

尝试使用 google 服务帐户上传时出现 401 错误。

credentials = Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=YOUTUBE_UPLOAD_SCOPES)

if credentials is None or credentials.expired:
    raise ValueError('Invalid credentials')

return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    credentials=credentials)
...
status, response = insert_request.next_chunk()
# <HttpError 401 "Unauthorized">

有证据表明可以做到这一点

The oauth2client.service_account.ServiceAccountCredentials class is only used with OAuth 2.0 Service Accounts. No end-user is involved for these server-to-server API calls, so you can create this object directly without using a Flow object.

youtube api Oauth flow docs

https://developers.google.com/identity/protocols/OAuth2#serviceaccount

问题是大多数 YouTube 数据都是私人用户数据。由于它是私人用户数据,因此您必须通过身份验证才能访问相关数据。为此,我们使用 Oauth2 并登录到我们的帐户并获取访问令牌和返回的刷新令牌。

访问令牌可用于从 Youtube 请求数据Api,刷新令牌可用于在访问令牌过期(一小时后)时请求新的访问令牌

通常我会说您应该考虑使用服务帐户。服务帐户是虚拟用户,可以预先配置为访问用户数据。很遗憾,Youtube api 不支持服务帐户。

你应该做的和我过去做过很多次的是对你的代码进行一次验证。获取刷新令牌并保存。将来,无论何时您希望 运行 您的应用程序,您只需使用刷新令牌请求一个新的访问令牌,您就可以访问 api。您无需手动输入登录名和密码并同意访问,一切都可以使用刷新令牌在后台完成。

注意:您需要注意,在某些情况下可能会导致刷新令牌过期,但在大多数情况下,只要您继续定期使用它们,您就不必担心它们是好的。

我不是 python 开发者但发现了这个

from oauth2client import client, GOOGLE_TOKEN_URI

CLIENT_ID = "client_id"
CLIENT_SECRET = "client_secret"
REFRESH_TOKEN = "refresh_token"


credentials = client.OAuth2Credentials(
    access_token = None, 
    client_id = CLIENT_ID, 
    client_secret = CLIENT_SECRET, 
    refresh_token = REFRESH_TOKEN, 
    token_expiry = None, 
    token_uri = GOOGLE_TOKEN_URI,
    token_ id = None, 
    revoke_uri= None)

http = credentials.authorize(httplib2.Http())