代码之家  ›  专栏  ›  技术社区  ›  MosaicOrange

以前使用Google Reporting API v4编写的Python脚本现在返回403

  •  1
  • MosaicOrange  · 技术社区  · 8 年前

    我编写了一个python脚本来从谷歌分析中提取昨天的数据。我正在使用OAuth v2和Google Reporting API v4。脚本的主干基本上与Google的示例版本相同,只是我加入了递归以克服分页限制,并将结果输出到CSV文件。 今天它开始返回一个 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 并验证我是否在配额内,但问题仍然存在。昨天和今天之间没有任何变化,但它拒绝今天运行。

    编辑 我使用的是同一个连接对象,它只实例化了一次,代码与谷歌网站上的代码完全相同-> 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()
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   MosaicOrange    8 年前

    我已经设法解决这个问题,通过使用指数回退与递归和try/except块,类似于谷歌推荐的方法-> 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它通常工作正常。我不太喜欢这种方法,理想情况下我希望它能正常工作。

    如果没有其他解决方案,那么希望这将有助于未来的人。