zakihayaメモ

RubyとRailsのことが中心

RubyのバッチでGoogleAnalyticsのデータを取得する(OAuth2利用)

Garbが使えなくなった・・・

もともとはGarbというgemを使ってアクセス数を取得するバッチを作っていたのですが、急にGoogleにログインができなくなってしまいました。。

Sija/garb · GitHub

いろいろと見てみると、Google APIがOAuth2以外の認証を受け付けなくなってしまった模様。
GarbでOAuth2を使うためにいろいろ試してみたのですがうまくいかず、Google謹製のgemに乗り換えました。

乗り換えたgemはこちら
google/google-api-ruby-client · GitHub

Google Developers Consoleで鍵ファイルを取得

まず準備として、Google Developers Consoleにアクセス。 https://console.developers.google.com

プロジェクトを作成していない場合は作成する。

プロジェクトを開いたら、
 APIと認証 > 認証情報
を開き、新しいクライアントIDを作成する。
アプリケーションの種類は、「サービス アカウント」を選択する。

IDを作成したら、「新しい P12 キーを生成」をクリックして、鍵ファイルをダウンロードする。

作成したクライアントのメールアドレスに権限を設定する

Analyticsのデータが見れるように、権限を設定します。
自分はこれを忘れてだいぶハマりました。

Google Analyticsを開き、「アナリティクス設定」を選択します。

アカウント→プロパティ→ビュー の順に、取得したいサイトの項目を選択していきます。

ビューの下の「ユーザー管理」をクリックし、Google Developers ConsoleのクライアントIDの下に表示されているメールアドレスを追加してください。
権限は、自分は編集までにしましたが、もっと低くても大丈夫かもしれません。

この時、ビュー設定の「ビューID」をコピっておきます。
後で使用します。

Gemfile設定

# Gemfile

gem 'google-api-client'
gem 'signet'

を記入して、 bundle install する。

OAuth2認証

client = Google::APIClient.new(:application_name => '')
# 鍵ファイルの場所を指定
key = Google::APIClient::PKCS12.load_key(File.join(Rails.root, 'certificates', 'analytics.p12'), 'notasecret')
client.authorization = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience             => 'https://accounts.google.com/o/oauth2/token',
  :scope                => 'https://www.googleapis.com/auth/analytics',
  :issuer               => 'example@example.com',    # Google Developers Consoleに表示されているメールアドレスを入力
  :signing_key          => key,
)
client.authorization.fetch_access_token!

今回は鍵ファイルを、 RAILS_ROOT/certificates/analytics.p12 に配置しています。
鍵ファイルの場所は各自書き換えてください。

client.authorizationのパラメータ issuer には、先程権限を追加したメールアドレスを入力してください。

Analytcsからデータを取得する

start_date = Date.today - 7
end_date = Date.today - 1

api_method = client.discovered_api('analytics','v3').data.ga.get
results = client.execute(:api_method => api_method, :parameters => {
  'ids'        => 'ga:999999',    # ビューIDを設定する
  'start-date' => start_date.to_s,
  'end-date'   => end_date.to_s,
  'dimensions' => 'ga:pagePath',
  'metrics'    => 'ga:pageviews'
}).data.rows

パラメータ ids には、権限追加時にコピーしておいたビューIDを入力します。

これを実行すると、

results
=> [["/", 10], ["page1.html", "5"], ["page2.html"], "8"]

のような形式でページビューが取得できます。

全体のソース

require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'

module Google
  class Analytics
    def self.import
      start_date = Date.today - 7
      end_date = Date.today - 1

      # OAuth2認証
      client = Google::APIClient.new(:application_name => '')
      key = Google::APIClient::PKCS12.load_key(File.join(Rails.root, 'certificates', 'analytics.p12'), 'notasecret')
      client.authorization = Signet::OAuth2::Client.new(
        :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
        :audience             => 'https://accounts.google.com/o/oauth2/token',
        :scope                => 'https://www.googleapis.com/auth/analytics',
        :issuer               => 'example@example.com',
        :signing_key          => key,
      )
      client.authorization.fetch_access_token!

      # Analyticsからデータ取得
      api_method = client.discovered_api('analytics','v3').data.ga.get
      results = client.execute(:api_method => api_method, :parameters => {
        'ids'        => 'ga:999999',
        'start-date' => start_date.to_s,
        'end-date'   => end_date.to_s,
        'dimensions' => 'ga:pagePath',
        'metrics'    => 'ga:pageviews'
      }).data.rows

      # resultsからデータを取得する処理
      #  ・
      #  ・
      #  ・

    end
  end
end