You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:23:15