Google API授权(服务帐户)错误:HttpAccessTokenRefreshError:unauthorized_client:请求中未经授权的客户端或范围

时间:2016-10-13 17:58:15

标签: python youtube-api google-oauth google-api-client

我正在尝试使用Python连接到YouTube Analytics API。当我在“凭据”标签中转到Google的开发者控制台时,我会点击Create credentials下拉菜单,然后选择Help me choose。我点击了我想要使用的API(YouTube Analytics API),我将从(Other non-UI (e.g. cron job, daemon))调用,我将访问哪些数据(Application Data),然后我是否'使用Google App Engine(no)。我点击按钮查看我需要的凭据,它会告诉我You alread have credentials that are suitable for this purpose

我有Service account用于连接Google Search Console API以访问我公司拥有的多个网站的数据。因为我们有多个站点,所以我根据我的电子邮件地址使用委派凭据。这是我用于对Search Console API进行身份验证的代码:

from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

scopes = ['https://www.googleapis.com/auth/webmasters.readonly']
credentials = ServiceAccountCredentials.from_json_keyfile_name('keyfile.json', scopes=scopes)

delegated_credentials = credentials.create_delegated('<my-email>')
http_auth = delegated_credentials.authorize(Http())

webmasters_service = build('webmasters', 'v3', http=http_auth)

现在,我正在尝试使用与YouTube Analytics API类似的方法,但我收到此错误:HttpAccessTokenRefreshError: unauthorized_client: Unauthorized client or scope in request.。这是我的代码:

from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

START_DATE = "2016-09-01"
END_DATE = "2016-09-30"

scopes = ['https://www.googleapis.com/auth/yt-analytics.readonly']
credentials = ServiceAccountCredentials.from_json_keyfile_name('keyfile.json', scopes=scopes)

delegated_credentials = credentials.create_delegated('<my-email>')
http_auth = delegated_credentials.authorize(Http())

youtube_service = build('youtubeAnalytics', 'v1', http=http_auth)

analytics_query_response = youtube_service.reports().query(
    ids="channel==<my-youtube-channel-id>",
    metrics="views",
    start_date=START_DATE,
    end_date=END_DATE
).execute()

keyfile.json是我用来连接Search Console API的同一文件(包含服务帐户凭据)。我甚至尝试创建一个新的服务帐户并使用这些凭据,但我没有任何运气。是的,我已经在开发者控制台中启用了所有YouTube API。

你知道我为什么会收到HttpAccessTokenRefreshError: unauthorized_client: ...错误吗?

编辑:之前我使用的是OAuth ID,而不是服务帐户,当我运行脚本时,会显示一个浏览器标签,我必须选择一个帐户。我收到了两个选项:一个是我的电子邮件,另一个是我作为经理添加的YouTube帐户。你是否认为我收到了这个错误,因为我正在使用我的电子邮件地址来生成凭据(而不是YouTube帐户)?

edit2:YouTube帐户似乎不属于我们Google Apps域的范畴。因此,这可能就是我无法使用我的电子邮件地址进行授权的原因,即使我已经成为该电子邮件地址的YouTube帐户的经理。

1 个答案:

答案 0 :(得分:2)

我在documentation上发现您无法在YouTube Analytics API中使用服务帐户。

这里说:

  

服务帐户流支持服务器到服务器的交互   不访问用户信息。但是,YouTube Analytics API   不支持这种流程。由于无法链接服务   帐户使用YouTube帐户,尝试使用此帐户授权请求   flow会产生错误。

我也在谷歌搜索者的回答中找到了这个thread

有关详细信息,请查看此SO question