LoginSignup
14
8

More than 5 years have passed since last update.

Golang でGoogle Analytics からデータを引っ張ってくるサンプル

Posted at

色々探したけどぱっと見つからなかったので。
既出かもしれませんが、ググラビリティが低かったです。

参考にしたものは
- Go Quickstart  |  Drive REST API  |  Google Developers
- analytics - GoDoc
- Dimensions & Metrics Explorer  |  Analytics Reporting API V4  |  Google Developers

まず、Google API Console でoauth用の認証トークンを発行する(割愛。参考資料のGo Quickstartを参照の事)

必要なパッケージ

$ go get -u google.golang.org/api/drive/v3
$ go get -u golang.org/x/oauth2/...

以下がおおまかなサンプルコードになります。

sample.go

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"
    "os/user"
    "path/filepath"

    "golang.org/x/net/context"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/analytics/v3"
)


func getClient(ctx context.Context, config *oauth2.Config) *http.Client {
    cacheFile, err := tokenCacheFile()
    if err != nil {
        log.Fatalf("Unable to get path to cached credential file. %v", err)
    }
    token, err := tokenFromFile(cacheFile)
    if err != nil {
        token = getTokenFromWeb(config)
        saveToken(cacheFile,token)
    }

    return config.Client(ctx, token)
}

func getTokenFromWeb(config *oauth2.Config) *oauth2.Token {
    authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline)
    fmt.Printf("Go to the following link in your browser then type the authorization code : \n%v \n", authURL)
    var code string
    if _, err := fmt.Scan(&code); err != nil {
        log.Fatalf("Unable to read authorization code %v", err)
    }
    token, err := config.Exchange(oauth2.NoContext, code)
    if err != nil {
        log.Fatalf("Unable to retrieve toke from web %v", err)
    }
    return token

}

func tokenCacheFile() (string, error){
    usr, err := user.Current()
    if err != nil {
        return "", err
    }
    tokenCacheDir := filepath.Join(usr.HomeDir, ".credentials")
    os.MkdirAll(tokenCacheDir, 0700)
    return filepath.Join(tokenCacheDir, url.QueryEscape("google-api-tokens.json")), err

}


func tokenFromFile(file string) (*oauth2.Token, error) {
    f, err := os.Open(file)
    if err != nil {
        return nil, err
    }
    t := &oauth2.Token{}
    err = json.NewDecoder(f).Decode(t)
    defer f.Close()
    return t,err
}


func saveToken(file string, token *oauth2.Token) {
    fmt.Printf("Save credentials file to %s\n", file)
    f,err := os.Create(file)
    if err != nil {
        log.Fatalf("Unable to cache oauth token: %v", err)
    }
    defer f.Close()
    json.NewEncoder(f).Encode(token)
}

func main() {
    ctx := context.Background()

    b, err := ioutil.ReadFile("client_secret.json")
    if err != nil {
        log.Fatalf("Unable to read client secret file: %v", err)
    }
    config, err := google.ConfigFromJSON(b, analytics.AnalyticsReadonlyScope)
    if err != nil {
        log.Fatalf("Unable to read client secret file: %v", err)
    }
    client := getClient(ctx, config)


    // Google Analytics と接続するインスタンスの作成
    gasrv, err := analytics.New(client)
    if err != nil {
        log.Fatalf("Unable to Access Google Analytics: %v", err)
    }

    // アカウントが持つ全てのプロファイルIDを取得
    accounts, err := gasrv.Management.Accounts.List().Do()
    if err != nil {
        log.Fatalf("Unable to Get Accounts List: %v", err)
    }
    for _, account := range accounts.Items {
       properties, err := gasrv.Management.Webproperties.List(account.Id).Do()
       if err != nil {
            log.Fatalf("Error: %v", err)
        }
        for _, property := range properties.Items {
            profiles, err := gasrv.Management.Profiles.List(account.Id, property.Id).Do()
            if err != nil {
                log.Fatalf("Error: %v", err)
            }
            for _, profile := range profiles.Items {
                result, err := gasrv.Data.Ga.Get("ga:"+profile.Id, "7daysAgo", "today", "ga:sessions").Do()
                if err != nil {
                    log.Fatalf("もうエラー処理は嫌だ: %v",err)
                }
                fmt.Println("項目名: "+  result.ProfileInfo.ProfileName)
                fmt.Printf("Total Sessions: " + result.Rows[0][0]+"\n\n")
            }
        }
    }
}

以上になります。

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8