Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
80
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@ryota-sasabe

Google Analytics API を叩いてデータを取得するまでの流れ(Ruby)

業務でサイトに人気記事ランキングを実装することになって、そのデータを Google Analytics から取得することにしました。自サーバーにRedisなどを入れてPVデータをカウントしておく方法もありますが、Google Analyticsのデータを使えば任意のディメンションや指標を使った集計が簡単に行えるのが魅力です。

方法を調べていて、あまり日本語の最新の情報がなく苦労したので手順を書いておきます。

前提

  • API の認証方式は、OAuth認証とサービスアカウント認証がありますが、今回はサービスアカウント認証を使用しています。どちらの認証が適切かまだよく分かっていないため後日見直す可能性があります。
  • G Suite を使っている場合で、使用できるドメインや機能を限定している場合うまく登録できないかもしれません。

Google APIs から、サービスアカウント認証情報を登録して JSON ファイルを取得

Google APIs にアクセス
https://console.developers.google.com/apis

プロジェクトを作っていない場合、プロジェクトを作成
API_ライブラリ.png

プロジェクトの情報を入力して、作成を押す
API_ライブラリ.png

左メニューのライブラリを開いて、API の検索ボックスから Analytics で検索Google Analytics Reporting API をクリック
API_ライブラリ_-_My_Project.png

有効にする をクリック(有効じゃない場合)
API_Manager_-_My_Project.png

認証情報を作成する をクリック
API_Manager_-_My_Project.png

認証情報を入力する
使用するAPI: Google Analytics Reporting API
API を呼び出す場所: ウェブサーバー
アクセスするデータの種類: アプリケーションデータ
Google App Engine か Google Compute Engine は今回使用しない
必要な認証情報をクリック
認証情報ウィザード_-_My_Project.png

サービスアカウントを作成する
サービスアカウント名を入力。キーのタイプは、JSON にする
認証情報ウィザード_-_My_Project.png

次へ、をクリックすると以下の画面が表示されて、json ファイルがダウンロードされる
認証情報ウィザード_-_My_Project.png

JSONファイルのサンプル
このJSONファイルを、プログラムから読み込んで使用します。

{
  "type": "service_account",
  "project_id": "my-project-152392889",
  "private_key_id": "b2f97b9daec858a25b34ca8b6a99a0fb60e36836",
  "private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n",
  "client_email": "analytics-report@my-project-152392889.iam.gserviceaccount.com",
  "client_id": "112337920347961566540",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/analytics-report%40my-project-152392889.iam.gserviceaccount.com"
}

データを取りたい Google Analytics のビューに、ユーザーアカウントを追加

Google Analytics の管理を開いて、ユーザー管理をクリック
アナリティクス.png

JSON ファイルの client_email のメールアドレスを、権限を付与するユーザーとして追加
アナリティクス.png

ビューのIDを取得
管理 -> ビュー設定から、ビューID をコピーしておく
アナリティクス.png

Ruby プログラムから、Google Analytics API を叩いてデータを取得する

JSON ファイルは、google-auth-cred.json という名前にして、Ruby プログラムと同じフォルダに置いておきます。

google-api-client が必要ですので入れておきます。
https://github.com/google/google-api-ruby-client

gem 'google-api-client', '~> 0.9'

サンプルプログラム
Google::Apis::AnalyticsreportingV4 の使い方は http://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AnalyticsreportingV4 を参考に。

require 'googleauth/stores/redis_token_store'
require 'google/apis/analyticsreporting_v4'

view_id = '123456789'
scope = ['https://www.googleapis.com/auth/analytics.readonly']
analytics =Google::Apis::AnalyticsreportingV4

client = analytics::AnalyticsReportingService.new
client.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open('google-auth-cred.json'),
  scope: scope
)

date_range = analytics::DateRange.new(start_date: '7DaysAgo', end_date: 'today')
metric = analytics::Metric.new(expression: 'ga:sessions', alias: 'sessions')
dimension = analytics::Dimension.new(name: 'ga:browser')
request = analytics::GetReportsRequest.new(
  report_requests: [analytics::ReportRequest.new(
    view_id: view_id, metrics: [metric], dimensions: [dimension], date_ranges: [date_range]
  )]
)
response = client.batch_get_reports(request)

response.reports

取得できる戻り値のサンプル

> response.to_h
=> {:reports=>
  [{:column_header=>{:dimensions=>["ga:browser"], :metric_header=>{:metric_header_entries=>[{:type=>"INTEGER", :name=>"sessions"}]}},
    :data=>
     {:row_count=>24,
      :maximums=>[{:values=>["95666"]}],
      :minimums=>[{:values=>["1"]}],
      :rows=>
       [{:dimensions=>["Amazon Silk"], :metrics=>[{:values=>["43"]}]},
        {:dimensions=>["Android Browser"], :metrics=>[{:values=>["4642"]}]},
        {:dimensions=>["Android Webview"], :metrics=>[{:values=>["6372"]}]},
        {:dimensions=>["BlackBerry"], :metrics=>[{:values=>["8"]}]},
        {:dimensions=>["Camino"], :metrics=>[{:values=>["1"]}]},
        {:dimensions=>["Chrome"], :metrics=>[{:values=>["35649"]}]},
        {:dimensions=>["Coc Coc"], :metrics=>[{:values=>["1"]}]},
        {:dimensions=>["DoCoMo"], :metrics=>[{:values=>["42"]}]},
        {:dimensions=>["Edge"], :metrics=>[{:values=>["7255"]}]},
        {:dimensions=>["Firefox"], :metrics=>[{:values=>["1664"]}]},
        {:dimensions=>["IE with Chrome Frame"], :metrics=>[{:values=>["3"]}]},
        {:dimensions=>["Internet Explorer"], :metrics=>[{:values=>["22139"]}]},
        {:dimensions=>["Iron"], :metrics=>[{:values=>["3"]}]},
        {:dimensions=>["Lunascape"], :metrics=>[{:values=>["12"]}]},
        {:dimensions=>["Mozilla"], :metrics=>[{:values=>["1"]}]},
        {:dimensions=>["Mozilla Compatible Agent"], :metrics=>[{:values=>["2"]}]},
        {:dimensions=>["Nintendo Browser"], :metrics=>[{:values=>["11"]}]},
        {:dimensions=>["Opera"], :metrics=>[{:values=>["87"]}]},
        {:dimensions=>["Opera Mini"], :metrics=>[{:values=>["18"]}]},
        {:dimensions=>["Playstation Vita Browser"], :metrics=>[{:values=>["7"]}]},
        {:dimensions=>["Puffin"], :metrics=>[{:values=>["9"]}]},
        {:dimensions=>["Safari"], :metrics=>[{:values=>["95666"]}]},
        {:dimensions=>["Safari (in-app)"], :metrics=>[{:values=>["7624"]}]},
        {:dimensions=>["UC Browser"], :metrics=>[{:values=>["3"]}]}],
      :totals=>[{:values=>["181262"]}]}}]}

参考にしたページ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
80
Help us understand the problem. What are the problem?