Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Youtube API请求凭据_Python_Oauth 2.0_Google Api_Youtube Api_Youtube Data Api - Fatal编程技术网

Python Youtube API请求凭据

Python 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实现这

我创建了一个使用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)
尝试使用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年关闭了客户端登录,您不能使用登录名和密码。没有办法自动登录。你只需要做一次就可以得到刷新令牌。我不明白为什么这是一个问题,当它是你自己的帐户。同样,你不需要每次登录。您需要登录一次并保存刷新令牌。每次代码出现后,都会使用刷新令牌请求访问令牌。你不需要再次登录,你不需要再次点击任何东西,只要一次,第一次。不是第二次,不是第三次。只有第一次一次。