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

Use*_*ser 7 python google-api youtube-api google-api-python-client youtube-analytics-api

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

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

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

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "forbidden",
        "message": "Forbidden"
      }
    ],
    "code": 403,
    "message": "Forbidden"
  }
}
Run Code Online (Sandbox Code Playgroud)

但仅适用于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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 统计要求:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

我正在使用google-api-python-client 1.6.5

编辑

我在调试使用google API的请求时附加了屏幕截图google-api-python-client.这是发生了什么:

  1. 使用Youtube Data API检索频道的基本统计信息
  2. 使用Youtube Analytics API检索频道的高级统计信息

我的观点是,刷新令牌在两种情况下都成功交换,但仅适用于Youtube Data API.我故意交换两次.同样的结果是当我仅通过一次成功的令牌交换访问Youtube Analytics API时(不调用Youtube Data API).

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

API请求

DaI*_*mTo 1

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

刷新令牌停止工作的原因有多种。

  1. 如果不使用,旧的刷新令牌将在六个月后过期。
  2. 用户可以重新验证您的应用程序并获取新的刷新令牌,两个刷新令牌都可以工作,您最多可以有 50 个未完成的刷新令牌,然后第一个将停止工作。
  3. 用户可以撤销您的访问权限。
  4. 2015 年唤醒夏令时错误。(我们不会谈论这个)

现在,这一切都不适用于您。为什么,因为刷新令牌仍然有效,只是降低了范围。这是疯狂的,用户无法删除您对一个范围的访问权限,并且它不会使一个范围过期。

话虽如此,我正在导致这是一个错误。我已向 Oauth 团队中我认识的人发送了一封电子邮件。

同时。我有个主意?

如果您尝试使用刷新令牌请求新的访问令牌,会发生什么情况?是否是返回给您的访问令牌存在问题?