YouTube API请求凭证

时间:2018-11-29 04:25:54

标签: python oauth-2.0 google-api youtube-api youtube-data-api

我创建了一个使用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">

可以做到的证据

  

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

youtube api Oauth flow docs

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

1 个答案:

答案 0 :(得分:5)

问题在于大多数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())