またもや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で取得できるようになりました。