如何将 Google Analytics Data API v1 与 golang 结合使用

问题描述 投票:0回答:2

https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries中没有使用 Google Analytics Data API v1 的 golang 演示代码

当我编写golang代码使用Analytics Data API v1时,出现如下错误:

C:\Users\qiuskill\go\src\google_api_test>go run main.go &{0xc0001ac700} panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x0 pc=0x1114c1d] goroutine 1 [running]: google.golang.org/grpc/internal/grpcsync.(*Event).HasFired(...) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/internal/grpcsync/event.go:55 google.golang.org/grpc.(*ClientConn).waitForResolvedAddrs(0xc00011bd20, {0x12b3670, 0xc000022050}) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/clientconn.go:573 +0x3d google.golang.org/grpc.newClientStream({0x12b3670, 0xc000022050}, 0x15b3a60, 0xc0001ac700, {0x1237a5c, 0xa}, {0x0, 0x0, 0x0}) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/stream.go:177 +0x133 google.golang.org/grpc.invoke({0x12b3670, 0xc000022050}, {0x1237a5c, 0xe0}, {0x1207460, 0xc0001e6000}, {0x11ffe20, 0xc0001e8000}, 0x0, {0x0, ...}) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/call.go:66 +0x7d google.golang.org/grpc.(*ClientConn).Invoke(0x20aa1a80108, {0x12b3670, 0xc000022050}, {0x1237a5c, 0x0}, {0x1207460, 0xc0001e6000}, {0x11ffe20, 0xc0001e8000}, {0x0, ...}) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/call.go:37 +0x265 google.golang.org/genproto/googleapis/analytics/data/v1beta.(*betaAnalyticsDataClient).RunReport(0xc00005ba50, {0x12b3670, 0xc000022050}, 0x1, {0x0, 0x0, 0x0}) C:/Users/qiuskill/go/pkg/mod/google.golang.org/[email protected]/googleapis/analytics/data/v1beta/analytics_data_api.pb.go:2407 +0xce main.main() C:/Users/qiuskill/go/src/google_api_test/main.go:76 +0x28d exit status 2


下面是我的源代码,我用********替换了我的属性ID:

package main import ( "context" "fmt" data "google.golang.org/genproto/googleapis/analytics/data/v1beta" "google.golang.org/grpc" ) func main() { cc := &grpc.ClientConn{} // fmt.Println(cc) client := data.NewBetaAnalyticsDataClient(cc) fmt.Println(client) ctx := context.Background() runReportRequest := &data.RunReportRequest{ Property: "properties/*******", DateRanges: []*data.DateRange{ {StartDate: "2022-01-10", EndDate: "2022-01-10"}, }, Dimensions: []*data.Dimension{ {Name: "city"}, }, Metrics: []*data.Metric{ {Name: "activeUsers"}, }, } // fmt.Println(runReportRequest) _, err := client.RunReport(ctx, runReportRequest) if err != nil { panic(err) } else { // cnt := response.RowCount // println(string(cnt)) } }


任何人都可以知道发生错误的原因是什么吗?或者任何人都可以编写一个golang演示来使用Google Analytics Data API v1,等待您的答案,非常感谢!!!

go google-analytics google-analytics-data-api
2个回答
0
投票
这是一个工作示例:

package main import ( "context" "fmt" "github.com/labstack/echo/v4" ga "google.golang.org/api/analyticsdata/v1beta" "google.golang.org/api/option" "net/http" ) func main() { ctx := context.Background() client, err := ga.NewService(ctx, option.WithCredentialsFile("client.json")) if err != nil { panic(err) } runReportRequest := &ga.RunReportRequest{ DateRanges: []*ga.DateRange{ { StartDate: "2022-04-19", EndDate: "today" }, }, //Dimensions: []*data.Dimension{ // { // Name: "city" // }, //}, Metrics: []*ga.Metric{ { Name: "activeUsers" }, }, } e := echo.New() e.GET("/", func(c echo.Context) error { r, _ := client.Properties.RunReport("properties/xxxxxxx", runReportRequest).Do() fmt.Println(r) return c.JSON(http.StatusOK, r.Rows) }) e.Logger.Fatal(e.Start(":1323")) }
    

0
投票
这对我有用

package libraries import ( "context" "fmt" "log" data "google.golang.org/genproto/googleapis/analytics/data/v1beta" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/oauth" ) const ( propertyID = "12312312321" serviceAccountJsonPath = "path/to/your/service_account/json/key/file" ) func get_data_analytics() { // Load service account credentials from JSON key file creds, err := oauth.NewServiceAccountFromFile(serviceAccountJsonPath, "https://www.googleapis.com/auth/analytics.readonly") if err != nil { log.Fatalf("Failed to load credentials: %v", err) } // Create a gRPC connection with credentials conn, err := grpc.Dial( "analyticsdata.googleapis.com:443", grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithPerRPCCredentials(creds), ) if err != nil { log.Fatalf("Failed to create connection: %v", err) } defer conn.Close() // Create a client for the Analytics Data API client := data.NewBetaAnalyticsDataClient(conn) // Make a request to the GA4 Data API request := &data.RunReportRequest{ Property: "properties/" + propertyID, Dimensions: []*data.Dimension{ {Name: "eventName"}, // change according to your needs }, Metrics: []*data.Metric{ {Name: "eventCount"}, // change according to your needs {Name: "totalUsers"}, // change according to your needs }, DateRanges: []*data.DateRange{ { StartDate: time.Now().AddDate(0, 0, -28).Format("2006-01-02"), // change according to your needs EndDate: time.Now().Format("2006-01-02"), // change according to your needs }, }, } response, err := client.RunReport(context.Background(), request) if err != nil { log.Fatalf("Failed to run report: %v", err) } fmt.Println("Report result:") for _, row := range response.Rows { // fmt.Printf("%s, %v\n", row.DimensionValues[0].GetValue(), row.MetricValues[0].GetValue()) fmt.Printf("%s, Event Count: %v, Active Users: %v\n", row.DimensionValues[0].GetValue(), row.MetricValues[0].GetValue(), row.MetricValues[1].GetValue()) } }

奖励内容,这是如何进行维度过滤

单一值

dimensionFilter := &data.Filter{ FieldName: "eventName", OneFilter: &data.Filter_StringFilter_{ StringFilter: &data.Filter_StringFilter{ MatchType: data.Filter_StringFilter_EXACT, Value: "banner click", CaseSensitive: false, }, }, } // Make a request to the GA4 Data API request := &data.RunReportRequest{ Property: "properties/" + propertyID, Dimensions: []*data.Dimension{ {Name: "eventName"}, }, Metrics: []*data.Metric{ {Name: "eventCount"}, {Name: "totalUsers"}, }, DateRanges: []*data.DateRange{ { StartDate: "2023-10-30", EndDate: "2023-11-26", }, }, DimensionFilter: &data.FilterExpression{ Expr: &data.FilterExpression_Filter{ Filter: dimensionFilter, }, }, }
多值

// Create two filter expressions for each event name eventNameFilter1 := &data.Filter{ FieldName: "eventName", OneFilter: &data.Filter_StringFilter_{ StringFilter: &data.Filter_StringFilter{ MatchType: data.Filter_StringFilter_EXACT, Value: "banner_click", CaseSensitive: false, }, }, } eventNameFilter2 := &data.Filter{ FieldName: "eventName", OneFilter: &data.Filter_StringFilter_{ StringFilter: &data.Filter_StringFilter{ MatchType: data.Filter_StringFilter_EXACT, Value: "header_click", CaseSensitive: false, }, }, } // Create an OR group to combine the two filter expressions orGroup := &data.FilterExpression_OrGroup{ OrGroup: &data.FilterExpressionList{ Expressions: []*data.FilterExpression{ {Expr: &data.FilterExpression_Filter{Filter: eventNameFilter1}}, {Expr: &data.FilterExpression_Filter{Filter: eventNameFilter2}}, }, }, } // Make a request to the GA4 Data API request := &data.RunReportRequest{ Property: "properties/" + propertyID, Dimensions: []*data.Dimension{ {Name: "eventName"}, }, Metrics: []*data.Metric{ {Name: "eventCount"}, {Name: "totalUsers"}, }, DateRanges: []*data.DateRange{ { StartDate: "2023-10-30", EndDate: "2023-11-26", }, }, DimensionFilter: &data.FilterExpression{ Expr: orGroup, }, }
    
© www.soinside.com 2019 - 2024. All rights reserved.