表題にある通り、

Go言語でGoogle Search Consoleの値を取得してみる。


https://search.google.com/search-console/about


Google Search Consoleというのは、

運営しているサイトがどのような検索ワードで訪問してくるか?

を調べることが出来るWebサービス。


早速、Search Consoleの値をGo言語で取得する為の手続きを見てみる。


https://console.cloud.google.com/apis/library


Google API Console - Google Cloud Consoleを開き、

トップページのAPIとサービスを検索で、Search Consoleと入力する。



Google Search Console APIをクリックし、



APIを有効にする。

有効後に管理をクリックし、



認証情報を作成をクリックする。



認証情報の画面で

使用するAPIをGoogle Search Console API

APIを呼び出す場所をその他のUI (Windows, CLIツールなど)

アクセスするデータの種類をアプリケーションデータ

にして必要な認証情報をクリックする。



次の画面で再び認証情報を作成をクリックし、

サービスアカウントキーをクリックする。



サービスアカウントで管理したいサイトを作成して、

キーのタイプをJSONにして作成をクリックする。


次の画面で生成されたjsonファイルをダウンロードして、

ファイル名をsecret.jsonにリネームしておく。




続いて、

Google Search Consoleの方の設定を行う。

先程作成したsecret.jsonを開き、client_emailの値をコピーしておく。


https://search.google.com/search-console/about


Google Search Consoleを開き、

サービスの画面で設定を開く。



ユーザを追加の画面で、

先程コピーしたメールアドレスを貼り付け、

権限をフルにして作成する。


これでSearch Console APIの設定は終了。




Go言語でSearch Console APIを使用する為のコードに話を移す。


はじめにAPIの使用に必要なライブラリを取得しておく。

$ go get golang.org/x/oauth2
$ go get golang.org/x/oauth2/google
$ go get google.golang.org/api/webmasters/v3

https://godoc.org/google.golang.org/api/webmasters/v3


今回は/home/saito/workspace/consoleでGoのコードを作成することにする。

consoleディレクトリに先程取得したsecret.jsonを配置する。


consoleディレクトリは下記の通り

console
├── main.go
└── secret.json

main.goで書いたコードは下記の通り。

package main

import (
	"fmt"
	"log"
	"time"

	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	webmasters "google.golang.org/api/webmasters/v3"
)

func main() {
	//認証資格情報を取得するHTTPクライアントを返す
	client, err := google.DefaultClient(
		oauth2.NoContext,
		"https://www.googleapis.com/auth/webmasters.readonly")
	if err != nil {
		log.Fatal(err)
	}

	// データ取得用の構造体の値を取得
	service, err := webmasters.New(client)
	if err != nil {
		log.Fatal(err)
	}

	analyticsService := webmasters.NewSearchanalyticsService(service)

	yesterday := time.Now().AddDate(0, 0, -1)
	oneWeekBefore := yesterday.AddDate(0, 0, -7)
	format := "2006-01-02"

	//8日前から1日前までのデータを取得する RowLimitは取得する件数
	req := &webmasters.SearchAnalyticsQueryRequest{
		StartDate:  oneWeekBefore.Format(format),
		EndDate:    yesterday.Format(format),
		Dimensions: []string{"query"},
		RowLimit:   10,
	}

	//saitodev.coの値を取得する
	resp, err := analyticsService.Query("https://saitodev.co", req).Do()
	if err != nil {
		log.Fatal(err)
	}

	//結果を一行ずつ取得する
	for _, row := range resp.Rows {
		fmt.Println(row)
	}
}

端末を開き、下記のコマンドで実行する。

$ cd ~/workspace/console
$ GOOGLE_APPLICATION_CREDENTIALS=secret.json go run main.go

実行結果は下記の通り。

&{61 0.12734864300626306 479 [鶏糞] 2.0250521920668056 [] []}
&{31 0.62 50 [ジスルフィド結合 切断] 1.04 [] []}
&{28 0.1339712918660287 209 [牛糞堆肥] 2.1291866028708135 [] []}
&{25 0.9259259259259259 27 [植物のミカタ] 1 [] []}
&{21 0.27631578947368424 76 [廃菌床] 1.1052631578947367 [] []}
&{20 0.02047082906857728 977 [解糖系] 9.795291709314228 [] []}
&{17 0.6071428571428571 28 [ubuntu android エミュレータ] 1 [] []}
&{17 0.4473684210526316 38 [コーンコブ] 1 [] []}
&{16 0.1391304347826087 115 [シリカゲル 水] 3.217391304347826 [] []}
&{16 0.13008130081300814 123 [スランプ構造] 2.91869918699187 [] []}