約束の地

キャロの想い出

Google Analytics API 用の gem である Legato を使う

Legato

Google Analytics の API を扱うときに便利な gem です。

ごくごく基本的な使い方

Legato の詳しい使い方は 公式のREADME公式のWiki に詳しく載っていますが、やはりコードを実際に見て理解するのが一番良いと思いますので、コードベースで順を追って書き連ねていきます。

1. Google Analytics の APIキー を取得する

まず、Google Analytics 用 の APIキー(トークン)を取得します。ここでは詳細な説明は避けますので、別途、入手してください。取得したアカウントを Google Analytics のユーザとして登録することも忘れないようにしましょう。

2. APIキー を用いてアクセスするユーザのオブジェクトを作成する

「1.」で APIキー が取得できたならば、Google Anaytics にアクセスするユーザのオブジェクトを作成します。

まず、必要な gem を入れます。Legato 本体はもちろんですが、認証のために OAuth2 と Signet も入れます。

$ gem install legato
$ gem install oauth2
$ gem install signet

インストールできたら、以下のようなコードを書いて「ユーザのオブジェクト」を取得します。大半は「おまじない」です*1ga_userが「ユーザのオブジェクト」になります。

google_analytics_api_key = '-----BEGIN PRIVATE KEY-----\nabCDefgHIjkLMN...==\n-----END PRIVATE KEY-----\n'
private_key = google_analytics_api_key
signing_key = OpenSSL::PKey::RSA.new(private_key)
scope = 'https://www.googleapis.com/auth/analytics.readonly'

auth_client = Signet::OAuth2::Client.new(
  token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
  audience: 'https://accounts.google.com/o/oauth2/token',
  scope: scope,
  issuer: 'google-analytics-api-user@foo.bar.gserviceaccount.com',
  signing_key: signing_key,
  sub: 'google-analytics-api-user@foo.bar.gserviceaccount.com',
)

access_token = auth_client.fetch_access_token!

oauth_client = OAuth2::Client.new('', '', {
  authorize_url: 'https://accounts.google.com/o/oauth2/auth',
  token_url: 'https://accounts.google.com/o/oauth2/token',
  }
)

token = OAuth2::AccessToken.new(
  oauth_client,
  access_token['access_token'],
  expires_in: access_token['expires_in'],
)
ga_user = Legato::User.new(token)
ga_user.access_token.expired?

ga_user

この「ユーザのオブジェクト」さえ取得できれば、後は簡単です。

3. 「プロファイル(ビュー)」を選ぶ

データを取得するために、まずは対象の「プロファイル(=ビュー)」を選択しましょう*2。いくつか方法はあるのですが(別記事に書きます)、「ビューID」を使用する方法を紹介します。

ga_user.profiles.each do |profile|
  @target_profile = profile if profile.id == '12345678'
end

上記の記述で「ビューID」が「12345678」のビューのオブジェクトが@target_profileに格納されました。ここでの注意点は以下のとおりです。

  • profiles メソッドを用いるとプロファイルの「かたまり」*3が取得されるので、個別に取得するために each で回す
  • 「ビューID」は 文字列なのでクォートする*4
  • 「ビュー」を取得するために、「プロパティ(例: UA-123456-7)」は原則として関係がない

4-1. 検索条件を組み立てて検索結果を取得する

いよいよ検索条件を組み立てます。ここは GA を扱った人ならば容易に理解できると思います。記事の最後の「参考」に記してある公式のドキュメントもぜひ参考にしてください。

さて、具体的なコードは以下のとおりです。分かりやすくするためにベタ書き一直線で書いています。「日付ごと」の「検索キーワード」一覧につき、「セッション数」で集計したデータを取得するコードです*5

class SearchByLegato
  extend Legato::Model

  dimensions(:date, :searchKeyword)
  metrics(:searchSessions)
end

start_date = '5daysAgo'
end_date = '2daysAgo'
limit = 10
sort = '-searchSessions'
sampling_level = 'HIGHER_PRECISION'

query = @target_profile.search_by_legato # Modelを使用する

search_results = query.results(start_date: start_date, end_date: end_date, limit: limit, sort: sort, sampling_level: sampling_level)

ここでの最大のポイントはquery = @target_profile.search_by_legatoの箇所です。search_by_legatoって何ぞやと思うかもしれませんが、これは Legato の Model の定義に沿ったメソッド名です。直前のクラス定義でSearchByLegatoという、Legato::Modelextendしたクラスを生成しており、これによりsearch_by_legatoというメソッドが自動的に生成されます。「プロファイルのオブジェクト」に対してこのメソッドを実行することで「クエリのオブジェクト」が生成されます。

「クエリのオブジェクト」に対してresultsメソッドを実行すれば、 search_results に検索の結果が格納されます!

4-2. 各検索条件の説明

「4-1.」にて設定している、各検索項目の説明は以下のとおりです。より詳しくは記事の最後の「参考」から公式ドキュメントをたどってみてください。

  • dimensionsmetricsで取得する値の具体的な項目を決めます
    • dimensionsディメンションを指します
    • metricsは日本語で指標(グループ)と呼ばれている項目です
  • dimensionsmetrics以外の項目で取得する値の条件を付与します
    • start_dateは検索の開始日時を示します
    • end_dateは検索の終了日時を示します
    • sortは結果のソート順を指定しています
      • 項目の頭に「マイナス」をつけると降順になります*6
      • 配列で値を渡すことで複数の項目をソート対象に指定することもできます
    • sampling_levelDEFAULTFASTERHIGHER_PRECISIONから選べます
      • HIGHER_PRECISIONが最も精度がよいのですが遅くなります*7
      • が、いくらか試してみたところ遅さは全く感じられないので、この項目はHIGHER_PRECISION固定でよいと思います

5. 結果を表示する

それでは結果を表示しましょう。search_resultsは結果の「かたまり」のオブジェクトなので、each で回してあげます。以下のコードをご覧ください。

search_results.each do |result|
  puts "検索日は #{result.date} です。検索キーワードは #{result.searchKeyword} です。検索回数(セッション)は #{result.searchSessions} 回です"
end

search_resultsを単体にバラして(単体にバラした結果をresultとしています)、result に格納されているそれぞれの検索結果の値をドットを用いて指定すればよいです*8。これで値を具体的に取得できました。ここまでできたならば、値をデータベースやCSVファイルなどの外部に出すことは容易でしょう。

参考

以下のページを参考にさせていただきました。感謝!

Google Analytics 公式

ブログ

*1:もちろんちゃんと理解しておくのに越したことはありません

*2:昔の呼称の名残で「プロファイル」と呼ぶようです(「ビュー」と呼ぶのではなく)

*3:分かりやすいようにこう書きます

*4:これ地味にハマりました

*5:ちなみに :date を使うとリクエストが増えるという問題があり、興味がある方は公式Wikiを参照してみてください

*6:例: '-searchSessions'

*7:と書いてあります

*8:「result.date」のように

Powered by はてなブログ