またもやHugo用にGoのサーバーにAPIを追加しました。HugoでGoogle Analyticsで取っているPV順に並べた結果を使ってコンテンツを作るためです。
似たようなことをこの辺↓↓で書いてます。
まず認証情報を作るところがなかなか面倒です。こちらのURLがほぼまんま参考になるので順を追って実施してみてください(丸投げ)。
jsonを取得してGoogle Analytics側にjsonの中に書いてあるメールアドレスをユーザーとして追加するところまでやっておきます。
次にコードを書きます。
まずは依存するライブラリを追加します。(Echoのコードはすでにある前提とします。
1% dep ensure -add golang.org/x/oauth2
2% dep ensure
そしてimportに追加
1import (
2 "golang.org/x/oauth2"
3 "golang.org/x/oauth2/google"
4 analytics "google.golang.org/api/analytics/v3"
5)
Echoに新しいルーティングを追加します。
1func main() {
2 e.GET("/ga", getGA)
3}
ハンドラはこんな感じ。こちらをかなり参考にさせてもらいました。
1func getGA(ctx echo.Context) error {
2 client, err := google.DefaultClient(
3 oauth2.NoContext,
4 "https://www.googleapis.com/auth/analytics.readonly")
5 if err != nil {
6 return ctx.String(http.StatusInternalServerError, fmt.Sprintf("Unable to read client : %s", err.Error()))
7 }
8
9 service, err := analytics.New(client)
10 if err != nil {
11 return ctx.String(http.StatusInternalServerError, fmt.Sprintf("Unable to Access Google Analytics: %s", err.Error()))
12 }
13
14 result, err := service.Data.Ga.Get("ga:xxxxxxxxxx", "7daysAgo", "today", "ga:pageviews").Dimensions("ga:pagePath,ga:pagePathLevel1,ga:pagePathLevel2,ga:pageTitle").Filters("ga:pagePath=~^/posts/").Sort("-ga:pageviews").Do()
15 if err != nil {
16 return ctx.String(http.StatusInternalServerError, fmt.Sprintf("Unable to get data: %s", err.Error()))
17 }
18
19 return ctx.JSON(http.StatusOK, result)
20}
ga:xxxxxxxxxxとなっている箇所はGoogle AnalyticsのViewに対応しています。
また、コードの14行目のあたりでDimensionやらFilterやらSortやらを指定しています。これらはQuery Explorerで確認して決めると便利です。
これでコードはOKです。実行時に先ほどのjsonファイルが必要となります。環境変数での指定が必要なので、GOOGLE_APPLICATION_CREDENTIALS=path/to/jsonのような形で実行してあげると、無事Echo経由でGoogle AnalyticsのAPI呼び出しをJSONで取得できるようになりました。

