以前使用Google Reporting API v4处理Python脚本现在返回403

时间:2017-12-08 15:42:49

标签: google-analytics google-oauth google-analytics-api google-oauth2 google-api-python-client

我写了一个python脚本来从Google Analytics中提取昨天的数据。我将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文件并验证我是否在配额范围内,但问题仍然存在。昨天和今天之间没有什么变化,但它今天拒绝运行。

修改 我使用相同的连接对象,它只实例化一次,代码与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()

1 个答案:

答案 0 :(得分:2)

我设法通过将指数退避与递归和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它通常工作得很好。我并不十分喜欢这种方法,理想情况下我希望它能正常工作。

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