如何在Node.js服务器端获取Google Analytics报告?无需跳转登录
解决方案:服务器端静默获取Google Analytics数据
完全可行!你碰到的跳转登录问题,是因为用了面向终端用户的OAuth 2.0授权流程——这种流程本来就需要用户自己登录谷歌账号授权。但要在服务器端静默获取GA数据,你得用**服务账号(Service Account)**的授权方式,全程不需要终端用户参与登录,完美匹配你的需求!
具体实现步骤
1. 创建Google服务账号
- 登录Google Cloud控制台,创建一个新项目(如果还没有对应项目的话)
- 启用对应API:如果是GA4媒体资源,启用「Analytics Data API」;如果是UA(旧版通用分析),启用「Analytics Reporting API」
- 进入「IAM与管理员」→「服务账号」页面,创建新服务账号,生成并下载JSON格式的密钥文件(这个文件是服务账号的身份凭证,务必妥善保管,别泄露给任何人)
2. 给服务账号授予GA访问权限
- 打开Google Analytics后台,找到你要获取数据的目标媒体资源
- 进入「管理员」面板:
- GA4:选择「账号访问管理」或「媒体资源访问管理」,添加新用户,输入服务账号的邮箱(格式类似
xxx@xxx.iam.gserviceaccount.com),授予「查看者」或「分析师」权限 - UA:选择「用户管理」,添加新用户,输入服务账号邮箱,授予「查看者」权限
- GA4:选择「账号访问管理」或「媒体资源访问管理」,添加新用户,输入服务账号的邮箱(格式类似
- 保存设置,等待几分钟让权限生效
3. Node.js代码实现
下面分GA4和UA两种场景给出代码示例:
GA4 示例(使用官方@google-analytics/data库)
首先安装依赖:
npm install @google-analytics/data
然后编写服务端代码:
const { BetaAnalyticsDataClient } = require('@google-analytics/data'); // 用服务账号密钥初始化客户端 const analyticsDataClient = new BetaAnalyticsDataClient({ keyFilename: './your-service-account-key.json' // 替换成你的密钥文件实际路径 }); async function fetchGA4Report() { try { const [response] = await analyticsDataClient.runReport({ property: 'properties/你的GA4媒体资源ID', // 格式为properties/xxxx,替换成你的ID dateRanges: [{ startDate: '7daysAgo', endDate: 'today' }], dimensions: [{ name: 'city' }], // 你需要的维度 metrics: [{ name: 'activeUsers' }] // 你需要的指标 }); // 处理返回的数据,这里可以把数据整理后返回给前端展示 const formattedData = response.rows.map(row => ({ city: row.dimensionValues[0].value, activeUsers: row.metricValues[0].value })); console.log('GA4报告数据:', formattedData); return formattedData; } catch (err) { console.error('获取GA4报告失败:', err); throw err; } } // 调用函数获取数据 fetchGA4Report();
UA 示例(使用官方@googleapis/analyticsreporting库)
首先安装依赖:
npm install @googleapis/analyticsreporting googleapis
然后编写服务端代码:
const { analyticsreporting } = require('@googleapis/analyticsreporting'); const { google } = require('googleapis'); const fs = require('fs'); // 加载服务账号密钥 const credentials = JSON.parse(fs.readFileSync('./your-service-account-key.json')); // 初始化授权客户端 const authClient = new google.auth.JWT( credentials.client_email, null, credentials.private_key, ['https://www.googleapis.com/auth/analytics.readonly'] // 只读权限足够 ); // 初始化Analytics Reporting客户端 const client = analyticsreporting({ version: 'v4', auth: authClient }); async function fetchUAReport() { try { const response = await client.reports.batchGet({ requestBody: { reportRequests: [{ viewId: '你的UA视图ID', // 替换成你的UA视图ID dateRanges: [{ startDate: '7daysAgo', endDate: 'today' }], dimensions: [{ name: 'ga:city' }], metrics: [{ expression: 'ga:users' }] }] } }); // 处理数据并返回 const formattedData = response.data.reports[0].data.rows?.map(row => ({ city: row.dimensions[0], users: row.metrics[0].values[0] })) || []; console.log('UA报告数据:', formattedData); return formattedData; } catch (err) { console.error('获取UA报告失败:', err); throw err; } } // 调用函数获取数据 fetchUAReport();
关键注意事项
- 密钥安全:服务账号的密钥文件绝对不能暴露给前端,也不要提交到代码仓库。可以把密钥内容存在环境变量中,在代码里读取环境变量解析,比如:
// 用环境变量加载密钥 const credentials = JSON.parse(process.env.GOOGLE_SERVICE_ACCOUNT_KEY); - API匹配:确保启用的API和你的GA版本对应,GA4用Analytics Data API,UA用Analytics Reporting API,用错会导致请求失败
- 权限生效时间:给服务账号添加GA权限后,可能需要等待5-10分钟才能生效,刚添加就请求可能会报权限错误
内容的提问来源于stack exchange,提问作者Ashutosh Jha
相关产品推荐
相关产品推荐

