以前使用 Google 报告 API v4 的 Python 脚本现在返回 403

Previously working Python script using Google Reporting API v4 now returning 403

我写了一个 python 脚本来从 Google Analytics 中提取昨天的数据。我将 OAuth v2 与 Google Reporting API v4 一起使用。脚本的 backbone 与 Google 的示例版本基本相同,除了我包含递归以克服分页限制并将结果输出到 CSV 文件。 今天开始 return 一个 403 错误:

HttpError 403 when requesting https://analyticsreporting.googleapis.com/v4/reports:batchGet?alt=json returned "The caller does not have permission"

我通过搜索解决方案进行了尽职调查,但我已经在使用 ViewID 并且 运行 所在的计算机未登录任何其他帐户(它存在仅 运行 报告)。我也尝试创建一个新的 client_secrets.json 文件并验证我是否在配额之内,但问题仍然存在。昨天和今天没有任何变化,但它拒绝今天运行。

编辑 我正在使用相同的连接对象,它只被实例化一次,代码与 Google 网站上的代码完全相同 -> Hello Analytics Reporting API v4 - Python

def initialize_analyticsreporting():
  parser = argparse.ArgumentParser(
      formatter_class=argparse.RawDescriptionHelpFormatter,
      parents=[tools.argparser])
  flags = parser.parse_args([])

  flow = client.flow_from_clientsecrets(
      CLIENT_SECRETS_PATH, scope=SCOPES,
      message=tools.message_if_missing(CLIENT_SECRETS_PATH))

  storage = file.Storage('analyticsreporting.dat')
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = tools.run_flow(flow, storage, flags)
  http = credentials.authorize(http=httplib2.Http())

  analytics = build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)
  return analytics

我像这样在每个请求上调用它的 batchGet 方法...

response = analytics.reports().batchGet(body=loaded_request.get("request", {})).execute()

我已经设法通过将指数退避与递归和 try/except 块结合使用来解决这个问题,类似于 Google 此处推荐的方法 -> Error Responses

像这样:

try:
    response = analytics.reports().batchGet(body=loaded_request.get("request", {})).execute()
except HttpError as err:
    print(err)
    time.sleep(2**expontential_backoff)
    expontential_backoff += 1
    if expontential_backoff < 5:
        get_response(analytics, request, page_token, file_name, expontential_backoff)
    else:
        print("expontential_backoff:", expontential_backoff, "Exceeded")
    return

如果错误发生,那么当 n > 1 时它通常工作正常。我不太喜欢这种方法,理想情况下我希望它能正常工作。

如果没有其他解决方案,希望这对以后的人有所帮助。