即使令牌有效,Youtube Analytics API也会禁止403

时间:2018-05-29 10:55:10

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

我对访问Youtube Analytics API以获取随机youtube频道存在问题。

使用以下范围成功授权后:

我将tokenrefresh token保存在数据库中。一切都运作良好一段时间。在我的应用发出请求后一段时间(例如三个月),Google返回403:

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "forbidden",
        "message": "Forbidden"
      }
    ],
    "code": 403,
    "message": "Forbidden"
  }
}

但仅适用于Youtube Analytics API,Youtube Data API中的其他端点可以正常使用此令牌。 这种情况发生在随机账户(渠道)上。这些渠道的所有者没有撤销对我的应用的访问权限,也没有更改帐户密码等。

此问题会影响我应用中所有频道的大约40%(Youtube Analytics API停止工作的时间不同,获取OAuth2令牌后1到6个月)。然后我必须定期向他们发送一个新的授权网址。

问题出在哪里?

这是我生成auth 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请求时附加了屏幕截图。这是发生了什么:

  1. 使用Youtube Data API
  2. 检索频道的基本统计信息
  3. 使用Youtube Analytics API检索频道的高级统计信息
  4. 我的观点是,刷新令牌在两种情况下都成功交换,但仅适用于Youtube Data API。我故意交换两次。同样的结果是当我仅使用一次成功的令牌交换访问Youtube Analytics API时(不调用Youtube Data API)。

    最有趣的部分是,这段代码可以工作一段时间(几周或几个月)然后停止: - )

    API requests

2 个答案:

答案 0 :(得分:1)

好的,我们先从一些背景信息开始。

刷新令牌停止工作的原因很简单。

  1. 如果不使用,它会在六个月后过期。#/ li>
  2. 用户可以重新刷新您的应用程序并获得一个新的刷新令牌,刷新令牌将起作用,您可以拥有最多五十个未完成的刷新令牌,然后第一个将停止工作。
  3. 用户可以撤消您的访问权限。
  4. 2015年Wakey夏令时错误。(我们不会谈论那个)
  5. 现在对你来说都不是这样。为什么因为刷新令牌仍然可以正常下垂范围。用户无法删除您对一个范围的访问权限并且它不会使一个范围到期,这是疯狂的。

    据说我正在导致这是一个错误。我已经发送了一封电子邮件给我认识的Oauth团队成员。

    同时。我有个主意吗?

    如果您尝试使用刷新令牌请求新的访问令牌会怎样?是否存在返回给您的访问令牌的问题?

答案 1 :(得分:1)

鉴于您说令牌刷新有效但API调用返回错误,我唯一怀疑的是api方面的问题。

您是否正在从服务器进行这些API调用?有多少用户?您可能遇到基于IP的限制。我肯定不知道。

我认为找到问题的最简单方法是,如果您可以向我们发送一些开始返回错误的令牌。我们可以查询令牌是否无效或API方面是否存在问题。 您可以通过电子邮件将其发送至oauth-help@google.com