我写了一个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()
答案 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它通常工作得很好。我并不十分喜欢这种方法,理想情况下我希望它能正常工作。
如果没有其他解决方案,那么希望这将有助于将来的某个人。