Python Youtube API请求凭据
我创建了一个使用Youtube api的python应用程序(因此示例是python的,但实际上并不重要,概念应该是相同的)。我设法让它在我可以连接和进行api调用的地方工作。但是,当我连接到api时,我必须定义一个流来检查凭证存储文件是否存在。如果没有,那么我必须使用流手动登录。登录文件(main.py-oauth2.json)后,将使用令牌创建该文件。我希望能够下载凭据,而无需手动登录。我希望有一种方法可以对该令牌发出POST请求,正如我所看到的,但我已经能够通过Youtube api实现这一点。有人知道如何实现所需的功能吗 main.pyPython Youtube API请求凭据,python,oauth-2.0,google-api,youtube-api,youtube-data-api,Python,Oauth 2.0,Google Api,Youtube Api,Youtube Data Api,我创建了一个使用Youtube api的python应用程序(因此示例是python的,但实际上并不重要,概念应该是相同的)。我设法让它在我可以连接和进行api调用的地方工作。但是,当我连接到api时,我必须定义一个流来检查凭证存储文件是否存在。如果没有,那么我必须使用流手动登录。登录文件(main.py-oauth2.json)后,将使用令牌创建该文件。我希望能够下载凭据,而无需手动登录。我希望有一种方法可以对该令牌发出POST请求,正如我所看到的,但我已经能够通过Youtube api实现这
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">
credentials=credentials.from\u service\u account\u文件(
服务\帐户\文件,作用域=YOUTUBE\上传\作用域)
如果凭据为无或凭据已过期:
raise VALUERROR('无效凭据')
返回构建(YOUTUBE\u API\u服务名称、YOUTUBE\u API\u版本、,
凭证=凭证)
...
状态,响应=插入请求。下一个\u块()
#
有证据表明这是可以做到的
oauth2client.service\u account.ServiceAccountCredentials类为
仅用于OAuth 2.0服务帐户不涉及最终用户
对于这些服务器到服务器API调用,您可以创建此对象
直接使用流对象而不使用流对象。
问题在于,大多数YouTube数据都是私人用户数据。由于它是私人用户数据,您必须作为有权访问相关数据的用户进行身份验证才能访问它。为此,我们使用Oauth2并登录到我们的帐户,并获得一个访问令牌和一个返回的刷新令牌 访问令牌可用于从Youtube Api请求数据,刷新令牌可用于在访问令牌过期时(一小时后)请求新的访问令牌 通常我会说你应该考虑使用服务帐户。服务帐户是可以预配置访问用户数据的虚拟用户。不幸的是,Youtube api不支持服务帐户 您应该做的事情,以及我在过去多次做的事情是对代码进行一次身份验证。获取刷新令牌并保存它。将来,每当您希望运行应用程序时,只需使用刷新令牌来请求新的访问令牌,就可以访问api。您不再需要手动键入登录名和密码并同意访问,所有操作都可以在后台使用refesh令牌完成 注意:您需要注意,有些情况可能会导致刷新令牌过期,但您不必担心,只要您继续定期使用它们,大部分情况下它们都是好的 我不是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())
你是否担心如何使用下载的
client\u secrets.json?
@jess,我不这么认为。据我所知,流使用客户机机密存储客户机api详细信息,您仍然需要登录才能获得令牌。从我在这里读到的内容来看,是的,你仍然需要从你的谷歌帐户登录,才能从控制台生成客户机密。不幸的是,你想要的东西在YouTube API中是不可能实现的。具体而言,YouTube API不支持服务帐户凭据。您可以做的最接近的事情是将其创建为一个“已安装”的应用程序,使用您要求的长期令牌,但这仍然需要至少一个初始用户登录。有关更多详细信息,请参阅。如果im错误,请更正我,但您必须创建一个流,以便用户通过,获取刷新令牌,您知道无需使用google UI或自动功能即可获取刷新令牌的方法吗?您不需要让用户至少执行一次,然后保存重定向URI。用户必须始终登录并单击同意屏幕,这两个都是网页,因此无法连接到youtube帐户,google帐户与serve rice帐户或客户端api关联?我认为文档明确地说不需要最终用户。你不能解决这个问题,用户必须登录并点击同意屏幕。这就是Oauth2的要点。谷歌在2015年关闭了客户端登录,您不能使用登录名和密码。没有办法自动登录。你只需要做一次就可以得到刷新令牌。我不明白为什么这是一个问题,当它是你自己的帐户。同样,你不需要每次登录。您需要登录一次并保存刷新令牌。每次代码出现后,都会使用刷新令牌请求访问令牌。你不需要再次登录,你不需要再次点击任何东西,只要一次,第一次。不是第二次,不是第三次。只有第一次一次。