以前使用 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 时它通常工作正常。我不太喜欢这种方法,理想情况下我希望它能正常工作。
如果没有其他解决方案,希望这对以后的人有所帮助。
我写了一个 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 时它通常工作正常。我不太喜欢这种方法,理想情况下我希望它能正常工作。
如果没有其他解决方案,希望这对以后的人有所帮助。