尝试使用Golang使用【Google Analytics 4】Reporting API v4
首先
我是株式会社データインサイト的山元。我们公司开发了多款产品,如积分活动应用和开业准备支援应用等。通过观察用户使用情况,我们考虑下一步行动并改进应用。
只需在公司内部共享KPI,Firebase就足够了。但是,我们需要将主要的KPI与合作伙伴公司等外部用户实时协调,因此我们决定构建一个可以在我们和外部用户之间使用的管理应用程序。
由於後端服務器使用Golang,因此我們將嘗試使用Golang的Google Analytics 4 API。
谷歌分析4是什么?
首先,Google Analytics有两个版本:”Universal Analytics(GA3)”和”Google Analytics 4″。关于它们的区别,只要搜索一下就会有很多结果,简单来说就是…
■ Universal Analytics(UA 或 GA3)
– 无论在界面还是功能方面都被大家广泛熟悉,一般提到 GA 就是指这个版本
– 主要用于测量网站的页面浏览量和与 GTM 结合使用的各种事件
– 由于测量对象是设备 × 浏览器,所以是基于 Cookie 的测量方法
■ Google Analytics 4(GA4)
・GA4是UA的进化版,尚未广泛普及
・除了网站,还可以测量应用程序(与Firebase集成是常见用例)
・测量目标基于用户在网站或应用程序中执行的事件
在网络上,使用UA(Universal Analytics)更加方便,但对于应用程序的事件追踪而言,GA4(Google Analytics 4)更合适。
而且,到2023年7月1日,UA的支持将终止,因此我们不得不最终迁移到GA4。
建议当前使用Google Analytics的客户准备切换到使用Universal Analytics的标准属性的新数据处理将于2023年7月1日停止。我们建议您做好准备并开始使用Google Analytics 4。
Google Analytics Reporting API v4 是什么
虽然有适用于UA的API,但也有适用于GA4的API。
您可以使用这个来调用在GA4中测量的数字的API。
根据Google官方网站的说法,这个还是一个β版,所以将来可能会有一些规格变更,但是我认为它可能不会有太大的改变,并且从一开始就没有太多针对一般用户展示GA4中可获得的数字的用例,所以我认为在正式版中使用它应该没有问题。(请自行负责…!)
那么现在我们终于进入正题了。
从这里开始,我们将使得能够在运行于Golang服务器上调用Reporting API v4。
在GCP上创建一个专用的服务账户。
在从外部程序调用Google服务的API时,需要使用Google服务账户进行OAuth2认证,因此首先需要创建服务账户。


请注意,在后续步骤中会自动下载一个JSON格式的密钥文件,请务必保存好它。(请注意,一旦下载,无法再次获取该JSON文件。)
为便于后续使用,请将文件命名为”credentials.json”。
2. 将GA4与服务账户进行连接

尝试使用Golang调用API。
为了调用API,您需要在GCP中将Google Analytics Data API设置为“启用”。
(您可以通过以下链接进行设置)
https://console.cloud.google.com/apis/library/analyticsdata.googleapis.com
很抱歉,對於後續的大致步驟,最準確的方式還是參考官方指南。然而,令人驚訝的是,並沒有針對 Golang 的教程。
尽管提及了使用以下库,但没有明确说明具体调用的方法。
go get google.golang.org/genproto/googleapis/analytics/data/v1beta
在设置环境变量”GOOGLE_APPLICATION_CREDENTIALS”并将其设置为”credentials.json”文件的路径后,尝试将Python等教程的代码转换为Go并编写。
import (
ga "google.golang.org/genproto/googleapis/analytics/data/v1beta"
"google.golang.org/grpc"
}
func GetAnalytics() (*ga.RunReportResponse, error) {
cc := &grpc.ClientConn{}
client := ga.NewBetaAnalyticsDataClient(cc)
ctx := context.Background()
runReportRequest := &ga.RunReportRequest{
Property: "properties/XXXXXXXXX", // XXXXXXXXX の部分に property id が入る
DateRanges: []*ga.DateRange{
{StartDate: "2022-03-30", EndDate: "2022-04-30"},
},
Dimensions: []*ga.Dimension{
{Name: "city"},
},
Metrics: []*ga.Metric{
{Name: "active1DayUsers"},
{Name: "active7DayUsers"},
{Name: "active28DayUsers"},
},
}
res, err := client.RunReport(ctx, runReportRequest)
if err != nil {
return nil, err
}
return res, nil
}
由于请求中没有包含服务帐户的身份验证信息,所以会出现空指针错误。
顺便提一下,property id请使用要测量的Google Analytics 4属性。
panic: runtime error: invalid memory address or nil pointer dereference
仅通过“cloud.google.com/go”开头的包名进行自动检测的服务帐号的发现,并且即使手动设置环境变量,也无法在此包中检测到。有关服务帐号认证的详细信息,请查阅官方网站。
用另一个包进行服务账号认证后,正常运行了。
import (
ga "google.golang.org/api/analyticsdata/v1beta"
"google.golang.org/api/option"
}
func GetAnalytics() (*ga.RunReportResponse, error) {
ctx := context.Background()
client, err := ga.NewService(ctx, option.WithCredentialsFile("./credentials.json"))
if err != nil {
return nil, err
}
runReportRequest := &ga.RunReportRequest{
DateRanges: []*ga.DateRange{
{StartDate: "2022-03-30", EndDate: "2022-04-30"},
},
Dimensions: []*ga.Dimension{
{Name: "city"},
},
Metrics: []*ga.Metric{
{Name: "active1DayUsers"},
{Name: "active7DayUsers"},
{Name: "active28DayUsers"},
},
}
res, err := client.Properties.RunReport("properties/XXXXXXXXX", runReportRequest).Do() // XXXXXXXXX の部分に property id が入る
if err != nil {
return nil, err
}
return res, nil
}
只要能从此次设置的 Dimensions和Metrics 返回以下类似的响应,就表示成功。
{
"dimensionHeaders": [
{
"name": "city"
}
],
"kind": "analyticsData#runReport",
"metadata": {
"currencyCode": "JPY",
"timeZone": "Asia/Tokyo"
},
"metricHeaders": [
{
"name": "active1DayUsers",
"type": "TYPE_INTEGER"
},
{
"name": "active7DayUsers",
"type": "TYPE_INTEGER"
},
{
"name": "active28DayUsers",
"type": "TYPE_INTEGER"
}
],
"rowCount": 1,
"rows": [
{
"dimensionValues": [
{
"value": "Chuo City"
}
],
"metricValues": [
{
"value": "1000"
},
{
"value": "7000"
},
{
"value": "28000"
}
]
},
]
}
整理
以上是使用Golang调用Reporting API v4的方法。
总之,关于GA4的信息太少了,所以我遇到了一些困难…。
在 Stack Overflow 上,自几个月前开始就有相同的问题被提出,一直都笼罩在谜团之中,但是几天前已经有人发布了解决方案。(与本文相同)
在寻求不依赖于Google官方教程介绍的包的情况下调用的过程中,我尝试了自己创建Bearer令牌的代码,并通过以下URL进行了请求以进行操作确认。
https://content-analyticsdata.googleapis.com/v1beta/properties/XXXXXXXXX:runReport
// XXXXXXXXX の部分に property id が入る
因为我没有找到关于那种方法明确的事情,所以我会在另一篇文章中介绍。虽然不知道是否有需求,但可以更加详细地了解有关Google服务的OAuth认证,并且有可能在使用上不受语言限制是个好处。另外,我也计划在今后的文章中介绍关于此API中Dimensions和Metrics等API规范以及最终能够通过该API实现什么。
最后
感谢您阅读至最后!在Data Insight Inc.,我们致力于”地图×数据,创造新未来”,正在进行利用各种数据和技术的工作。为了进一步扩大业务,我们正在招募数据科学家、工程师和设计师等伙伴。如果您对此感兴趣,请随时联系我们!