【发布时间】:2018-11-08 00:09:04
【问题描述】:
我在访问随机 youtube 频道的 Youtube Analytics API 时遇到问题。
在以下范围内成功授权后:
- https://www.googleapis.com/auth/youtube.readonly
- https://www.googleapis.com/auth/yt-analytics.readonly
我将token 和refresh token 保存在数据库中。一段时间内一切正常。一段时间后(例如三个月),当我的应用发出请求时,Google 返回 403:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Forbidden"
}
],
"code": 403,
"message": "Forbidden"
}
}
但仅适用于 Youtube 分析 API,Youtube 数据 API 中的其他端点可以正常使用此令牌。 随机帐户(频道)会发生这种情况。此频道的所有者没有撤销对我的应用的访问权限,也没有更改帐户密码等。
这个问题影响了我的应用程序中大约 40% 的通道(Youtube Analytics API 停止工作的时间不同,从获得 OAuth2 令牌后的 1 到 6 个月)。然后我必须定期向他们发送一个新的授权网址。
问题出在哪里?
这就是我生成身份验证 URL 并发出请求的方式:
-
授权网址:
flow = client.flow_from_clientsecrets( secret_file_path, scope=["https://www.googleapis.com/auth/youtube.readonly", "https://www.googleapis.com/auth/yt-analytics.readonly"], redirect_uri=redirect_url, prompt="consent" ) flow.params["access_type"] = "offline" url = flow.step1_get_authorize_url(state=state) -
统计请求:
auth = client.OAuth2Credentials.from_json(credentials_from_db) http_auth = auth.authorize(httplib2.Http()) api = discovery.build("youtubeAnalytics", "v1", http=http_auth, cache_discovery=False) api.reports().query( ids="channel==%s" % channel_id, metrics="estimatedMinutesWatched", dimensions="video", start_date=start_date, end_date=end_date, max_results=20, filters="video=={}".format(",".join(video_ids)) ).execute(http=http)
我使用的是 google-api-python-client 1.6.5
编辑
我在使用google-api-python-client 调试对 google API 的请求时附上了屏幕截图。这是发生了什么:
- 使用 Youtube Data API 检索频道的基本统计数据
- 使用 Youtube Analytics API 检索频道的高级统计数据
我的意思是,刷新令牌在这两种情况下都已成功交换,但仅适用于 Youtube Data API。我特意换了两次。同样的结果是当我通过一次成功的令牌交换(不调用 Youtube Data API)只访问 Youtube Analytics API 时。
最有趣的是,这段代码可以运行一段时间(几周或几个月)然后停止:-)
【问题讨论】:
-
API请求有没有配额限制之类的?我这样说是因为在使用 Google Cloud Vision API 时我遇到了类似的问题:因为我在那个时间范围内用尽了我的配额。
-
@unholy_me 限制很好,大约 30-40% 的使用率(适用于所有限制)。
-
您使用这些用户的刷新令牌调用 api 的频率如何?
-
@DaImTo 视情况而定;有时一周一次,有时一天一次。然而,在所有情况下,刷新令牌总是成功地交换为身份验证令牌(我调试了它:-)。
-
您经常使用它来调用这两个 API?用户是否可以多次验证您的应用程序?是否可以进行多个安装?
标签: python google-api youtube-api google-api-python-client youtube-analytics-api