golang简单封装实现Google Analytics报告功能插件库google-analytics的使用
Golang简单封装实现Google Analytics报告功能插件库google-analytics的使用
Google Analytics数据拉取
这是一个轻量级的Golang库,用于从Google Analytics API拉取数据。该库基于Core Reporting API (v3)构建。
安装
go get github.com/chonthu/go-google-analytics
认证
为了使用该库访问您的Google Analytics账户,需要生成一个oauth2令牌。对于新项目,请登录Google开发者控制台并创建项目。
添加Analytics API到API列表,创建一个新的"Installed"应用客户端ID,并以JSON格式下载。
将client_secret.json文件放在应用程序的根目录下。注意:您需要将文件名从复杂的名称重命名为"client_secret.json"。
使用示例
以下是一个完整的示例代码,展示如何使用该库获取Google Analytics数据:
package main
import (
"fmt"
"log"
"os"
analytics "github.com/chonthu/go-google-analytics"
)
func main() {
// 初始化Google Analytics客户端
client, err := analytics.NewClient("client_secret.json")
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
// 设置查询参数
query := &analytics.Query{
ProfileID: "YOUR_PROFILE_ID", // 替换为您的Google Analytics视图ID
StartDate: "2023-01-01",
EndDate: "2023-01-31",
Metrics: "ga:sessions,ga:pageviews",
Dimensions: "ga:date,ga:country",
Sort: "-ga:sessions",
MaxResults: 10,
}
// 执行查询
data, err := client.Get(query)
if err != nil {
log.Fatalf("Failed to get analytics data: %v", err)
}
// 打印结果
fmt.Println("Analytics Report:")
for _, row := range data.Rows {
fmt.Printf("Date: %s, Country: %s, Sessions: %s, Pageviews: %s\n",
row[0], row[1], row[2], row[3])
}
// 可选:将结果导出到CSV文件
err = data.ExportToCSV("analytics_report.csv")
if err != nil {
log.Printf("Failed to export to CSV: %v", err)
} else {
fmt.Println("Report exported to analytics_report.csv")
}
}
测试
该库包含单元测试,可以使用以下命令运行:
go test ./...
更新日志
1.0.0
- 更清晰的命名
- 更清晰的工作示例
0.1.1:
- 实现了批处理
- 新增请求周期分段功能
- 更清晰的错误报告和解决方案建议
0.1.0:
- 初始版本
注意:在使用前,请确保您已在Google开发者控制台正确设置了项目,并获得了必要的API访问权限。
更多关于golang简单封装实现Google Analytics报告功能插件库google-analytics的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang简单封装实现Google Analytics报告功能插件库google-analytics的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Google Analytics报告功能封装库实现
下面我将为你展示如何使用Go语言封装Google Analytics(GA)的报告API功能,创建一个简单的插件库。
1. 基础封装实现
首先我们需要创建一个基础结构体来封装GA API的交互:
package googleanalytics
import (
"context"
"encoding/json"
"fmt"
"log"
"time"
"golang.org/x/oauth2"
"golang.org/x/oauth2/google"
"google.golang.org/api/analyticsreporting/v4"
)
// GAClient 封装Google Analytics客户端
type GAClient struct {
service *analyticsreporting.Service
viewID string
}
// NewGAClient 创建新的GA客户端
func NewGAClient(credentialsJSON []byte, viewID string) (*GAClient, error) {
// 创建JWT配置
config, err := google.JWTConfigFromJSON(
credentialsJSON,
analyticsreporting.AnalyticsReadonlyScope,
)
if err != nil {
return nil, fmt.Errorf("无法解析服务账号JSON: %v", err)
}
// 创建HTTP客户端
ctx := context.Background()
client := config.Client(ctx)
// 创建GA服务
service, err := analyticsreporting.New(client)
if err != nil {
return nil, fmt.Errorf("无法创建GA服务: %v", err)
}
return &GAClient{
service: service,
viewID: viewID,
}, nil
}
2. 报告查询功能
添加获取报告的核心功能:
// ReportRequest 定义报告请求参数
type ReportRequest struct {
StartDate string
EndDate string
Metrics []string
Dimensions []string
OrderBys []string
Filters string
PageSize int64
IncludeEmpty bool
UseSampling bool
}
// GetReport 获取GA报告数据
func (ga *GAClient) GetReport(req *ReportRequest) (*analyticsreporting.GetReportsResponse, error) {
// 构建指标
var metrics []*analyticsreporting.Metric
for _, m := range req.Metrics {
metrics = append(metrics, &analyticsreporting.Metric{
Expression: m,
})
}
// 构建维度
var dimensions []*analyticsreporting.Dimension
for _, d := range req.Dimensions {
dimensions = append(dimensions, &analyticsreporting.Dimension{
Name: d,
})
}
// 构建排序
var orderBys []*analyticsreporting.OrderBy
for _, o := range req.OrderBys {
orderBys = append(orderBys, &analyticsreporting.OrderBy{
FieldName: o,
SortOrder: "DESCENDING",
})
}
// 创建报告请求
reportRequest := &analyticsreporting.ReportRequest{
ViewId: ga.viewID,
DateRanges: []*analyticsreporting.DateRange{
{StartDate: req.StartDate, EndDate: req.EndDate},
},
Metrics: metrics,
Dimensions: dimensions,
OrderBys: orderBys,
PageSize: req.PageSize,
IncludeEmptyRows: req.IncludeEmpty,
SamplingLevel: "LARGE",
}
if req.Filters != "" {
reportRequest.FiltersExpression = req.Filters
}
// 发送请求
return ga.service.Reports.BatchGet(
&analyticsreporting.GetReportsRequest{
ReportRequests: []*analyticsreporting.ReportRequest{reportRequest},
},
).Do()
}
3. 简化使用示例
添加一些简化使用的方法:
// GetSimpleReport 获取简化报告
func (ga *GAClient) GetSimpleReport(metrics, dimensions []string, days int) ([]map[string]string, error) {
// 设置日期范围
endDate := time.Now().Format("2006-01-02")
startDate := time.Now().AddDate(0, 0, -days).Format("2006-01-02")
// 构建请求
req := &ReportRequest{
StartDate: startDate,
EndDate: endDate,
Metrics: metrics,
Dimensions: dimensions,
PageSize: 1000,
IncludeEmpty: false,
}
// 获取报告
res, err := ga.GetReport(req)
if err != nil {
return nil, err
}
// 处理报告数据
var results []map[string]string
for _, report := range res.Reports {
for _, row := range report.Data.Rows {
rowData := make(map[string]string)
// 添加维度
for i, dim := range row.Dimensions {
if i < len(req.Dimensions) {
rowData[req.Dimensions[i]] = dim
}
}
// 添加指标
for i, metric := range row.Metrics[0].Values {
if i < len(req.Metrics) {
rowData[req.Metrics[i]] = metric
}
}
results = append(results, rowData)
}
}
return results, nil
}
4. 使用示例
下面是如何使用这个封装库的示例:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"github.com/yourusername/googleanalytics"
)
func main() {
// 1. 读取服务账号凭据
credentials, err := ioutil.ReadFile("service-account.json")
if err != nil {
log.Fatalf("无法读取凭据文件: %v", err)
}
// 2. 创建GA客户端
ga, err := googleanalytics.NewGAClient(credentials, "YOUR_VIEW_ID")
if err != nil {
log.Fatalf("创建GA客户端失败: %v", err)
}
// 3. 获取简单报告
metrics := []string{"ga:sessions", "ga:pageviews"}
dimensions := []string{"ga:date", "ga:country"}
data, err := ga.GetSimpleReport(metrics, dimensions, 7)
if err != nil {
log.Fatalf("获取报告失败: %v", err)
}
// 4. 输出结果
jsonData, _ := json.MarshalIndent(data, "", " ")
fmt.Println(string(jsonData))
}
5. 高级功能扩展
你还可以添加更多高级功能:
// GetRealtimeData 获取实时数据
func (ga *GAClient) GetRealtimeData(metrics, dimensions []string) (*analyticsreporting.GetReportsResponse, error) {
req := &ReportRequest{
StartDate: "today",
EndDate: "today",
Metrics: metrics,
Dimensions: dimensions,
}
return ga.GetReport(req)
}
// GetUserActivity 获取用户活动数据
func (ga *GAClient) GetUserActivity(userID string, days int) (*analyticsreporting.GetReportsResponse, error) {
req := &ReportRequest{
StartDate: time.Now().AddDate(0, 0, -days).Format("2006-01-02"),
EndDate: time.Now().Format("2006-01-02"),
Metrics: []string{"ga:totalEvents", "ga:sessionDuration"},
Dimensions: []string{"ga:date", "ga:eventCategory", "ga:eventAction"},
Filters: fmt.Sprintf("ga:dimension1==%s", userID), // 假设dimension1是用户ID
PageSize: 1000,
}
return ga.GetReport(req)
}
6. 错误处理和日志
添加更好的错误处理和日志记录:
// withRetry 带重试的请求执行
func (ga *GAClient) withRetry(fn func() (*analyticsreporting.GetReportsResponse, error), retries int) (*analyticsreporting.GetReportsResponse, error) {
var lastErr error
for i := 0; i < retries; i++ {
res, err := fn()
if err == nil {
return res, nil
}
lastErr = err
time.Sleep(time.Duration(i+1) * time.Second) // 指数退避
}
return nil, fmt.Errorf("重试%d次后失败: %v", retries, lastErr)
}
// GetReportWithRetry 带重试的报告获取
func (ga *GAClient) GetReportWithRetry(req *ReportRequest, retries int) (*analyticsreporting.GetReportsResponse, error) {
fn := func() (*analyticsreporting.GetReportsResponse, error) {
return ga.GetReport(req)
}
return ga.withRetry(fn, retries)
}
这个封装库提供了Google Analytics报告API的基本功能,包括:
- 认证和客户端初始化
- 报告请求构建
- 简化数据获取
- 错误处理和重试机制
- 实时数据和用户活动等扩展功能
你可以根据需要进一步扩展这个库,添加缓存、并发请求、数据转换等功能。