Python中向BetaAnalyticsDataClient传入服务账号参数的问题
解决Azure Function中GA4服务账号凭证直接认证的问题
问题概述
在Azure Function中编写Python代码调用GA4报表接口时,受环境限制无法通过服务账号JSON文件路径完成认证,尝试直接传入client_email、private_key等参数到BetaAnalyticsDataClient多次报错,同时代码存在变量未赋值、字符串格式化错误、返回格式不符合需求等问题。
修正后的完整代码
import logging import json import azure.functions as func from google.analytics.data_v1beta import BetaAnalyticsDataClient from google.analytics.data_v1beta.types import ( DateRange, Dimension, Metric, MetricType, RunReportRequest, ) from google.oauth2 import service_account # 新增服务账号认证模块 scopes = ['https://www.googleapis.com/auth/analytics.readonly'] viewid = '---redacted---' # 替换为你的GA4属性数字ID def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') try: keyfile = req.get_json() # 获取请求中的服务账号JSON内容 clientemail = keyfile.get('client_email') key = keyfile.get('private_key') projectid = keyfile.get('project_id') if not all([clientemail, key, projectid]): return func.HttpResponse("缺少服务账号关键凭证信息", status_code=400) response = get_report(key, clientemail, projectid) print_response(response) # 将GA4报表结果转换为标准JSON格式返回 result_json = format_response_to_json(response) return func.HttpResponse(result_json, mimetype="application/json", status_code=200) except Exception as e: logging.error(f"执行失败: {str(e)}") return func.HttpResponse(f"执行失败: {str(e)}", status_code=400) def get_report(key, clientemail, projectid): # 从服务账号信息直接构建认证凭证 credentials = service_account.Credentials.from_service_account_info( { "client_email": clientemail, "private_key": key, "project_id": projectid }, scopes=scopes ) # 传入凭证初始化GA4客户端 client = BetaAnalyticsDataClient(credentials=credentials) # 修正GA4属性ID的字符串拼接方式 request = RunReportRequest( property=f"properties/{viewid}", dimensions=[Dimension(name="date"), Dimension(name="contentType")], metrics=[ Metric(name="totalUsers"), Metric(name="screenPageViews"), Metric(name="screenPageViewsPerSession"), Metric(name="screenPageViewsPerUser"), Metric(name="averageSessionDuration") ], date_ranges=[DateRange(start_date="7daysAgo", end_date="today")], ) return client.run_report(request) def print_response(response): print(f"{response.row_count} rows received") for dimensionHeader in response.dimension_headers: print(f"Dimension header name: {dimensionHeader.name}") for metricHeader in response.metric_headers: metric_type = MetricType(metricHeader.type_).name print(f"Metric header name: {metricHeader.name} ({metric_type})") print("Report result:") for rowIdx, row in enumerate(response.rows): print(f"\nRow {rowIdx}") for i, dimension_value in enumerate(row.dimension_values): dimension_name = response.dimension_headers[i].name print(f"{dimension_name}: {dimension_value.value}") for i, metric_value in enumerate(row.metric_values): metric_name = response.metric_headers[i].name print(f"{metric_name}: {metric_value.value}") def format_response_to_json(response): # 自定义转换逻辑,将GA4响应转为易读的JSON结构 result = { "row_count": response.row_count, "dimension_headers": [dh.name for dh in response.dimension_headers], "metric_headers": [{"name": mh.name, "type": MetricType(mh.type_).name} for mh in response.metric_headers], "rows": [] } for row in response.rows: row_data = { "dimensions": [dv.value for dv in row.dimension_values], "metrics": [mv.value for mv in row.metric_values] } result["rows"].append(row_data) return json.dumps(result)
关键改动说明
- 新增认证模块:导入
google.oauth2.service_account,通过from_service_account_info直接从JSON内容构建凭证,绕开文件路径限制。 - 修复客户端初始化:将构建好的
credentials参数传入BetaAnalyticsDataClient,完成服务账号认证。 - 修正属性ID拼接:用f-string正确拼接GA4属性ID,避免硬编码占位符导致的请求失败。
- 添加参数校验:提前检查服务账号关键字段是否齐全,快速返回错误提示。
- 返回标准JSON:新增转换函数将GA4原始响应转为标准JSON格式,满足需求。
- 优化日志:将异常日志改为error级别,便于Azure Function日志排查问题。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

