Youtube API请求凭据

AJ_*_*AJ_ 13 python google-api youtube-api oauth-2.0 youtube-data-api

我创建了一个使用Youtube api的python应用程序(所以示例是在python中,但实际上并不重要,概念应该是相同的).我设法让它在我可以连接的地方工作并进行api调用.但是,当我连接到api时,我必须定义一个流程来检查凭证存储文件是否存在.如果没有,那么我必须使用流程手动登录.登录文件(main.py-oauth2.json)后,使用令牌创建.我希望能够下载凭证,而无需手动登录.我希望有一种方法可以为该令牌发出POST请求,就像我在这里看到的那样,但我已经能够使用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)
Run Code Online (Sandbox Code Playgroud)

尝试使用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">
Run Code Online (Sandbox Code Playgroud)

证据可以做到这一点

oauth2client.service_account.ServiceAccountCredentials类仅用于OAuth 2.0服务帐户.这些服务器到服务器API调用不涉及最终用户,因此您可以直接创建此对象而无需使用Flow对象.

youtube api Oauth流程文档

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

DaI*_*mTo 5

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

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

通常我会说你应该考虑使用服务帐户.服务帐户是虚拟用户,可以预先配置访问用户数据.不幸的是,Youtube api不支持服务帐户.

您应该做的以及我过去多次做过的事情就是验证您的代码一次.获取刷新令牌并保存.将来,只要您希望运行应用程序,只需使用刷新令牌来请求新的访问令牌,您就可以访问api.您不必手动输入您的登录名和密码并同意访问权限,可以使用refesh令牌在后台完成所有操作.

注意:您需要观察它有一些可能导致刷新令牌过期的情况,但只要您继续经常使用它们,您就不必担心它们的好处.

我不是一个python dev但是发现了这个

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())
Run Code Online (Sandbox Code Playgroud)

  • 同样,您不需要每次都登录。您需要登录一次以保存刷新令牌。每次之后,您的代码都将使用刷新令牌来请求访问令牌。您不需要再次登录,也不需要第一次单击任何东西。不是第二次,不是第三次。只有第一次一次。 (2认同)