アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Ruby で Google Analytics API その2

こんにちは、tahara です。

しばらくぼんやりしていたら Google API がすごい勢いで変っていて全然ついていけていませんでした。 Google APIs Console なんてものができていたんですね。

というわけで、今回は最近のやり方で Analytics の API をたたいてみたいと思います。

Ruby で Google Analytics API」では Garb を使いましたが、今回は google-api-ruby-client を使います。

まずは Google APIs Console で新しいプロジェクを作り、Analytics API を ON にします。 引き続き Google APIs Console の API Access で Client ID for installed applications を作ります。 これで Client ID と Client secret が手に入ります。

Gemfile に gem 'google-api-client' を追加して bundle install を実行します。 OAuth のアクセスキーはコマンドラインを使うと簡単に取得できます。

bundle exec google-api oauth-2-login --scope='https://www.googleapis.com/auth/analytics.readonly' --client-id='Google APIs Console で取得した Client ID' --client-secret='Google APIs Console で取得した Client secret'

これを実行するとブラウザが起動していアクセス許可を求められます。 アクセスを許可すると次のような ~/.google-api.yaml というファイルにアクセスキー等が書き出されます。

---
mechanism: oauth_2
scope: https://www.googleapis.com/auth/analytics.readonly
client_id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
client_secret: xxxxxxxxxxxxxxxxxxxxxxxx
access_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
refresh_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これで必要なものがそろったので API をたたきます。

# -*- coding: utf-8 -*-
require 'google/api_client'

module Actindi
  module Google
    class Analytics

      PROFILE_DEFAULT        = 'ga:99999999' # プロファイル ID

      attr_accessor :profile

      def initialize
        @profile = PROFILE_DEFAULT
        @max_results = 10000

        @client = ::Google::APIClient.new(:authorization => :oauth_2)
        @client.authorization.scope = 'https://www.googleapis.com/auth/analytics.readonly'
        # Google APIs Console で取得した Client ID
        @client.authorization.client_id = 'xxxxxxxxxxxxxxxxxxxxxxx'
        # Google APIs Console で取得した Client secret
        @client.authorization.client_secret = 'xxxxxxxxxxxxxxxxxxx'
        # ~/.google-api.yamlaccess_token
        @client.authorization.access_token = 'xxxxxxxxxxxxxxxxxxxx'
        # ~/.google-api.yaml の refresh_token
        @client.authorization.refresh_token = 'xxxxxxxxxxxxxxxxxxx'
        @client.authorization.fetch_access_token!

        @analytics = @client.discovered_api('analytics', 'v3')
      end

      # x = Actindi::Google::Analytics.new.page_view('^/facilities/[0-9]+$', 1.month.ago, Date.today)
      def page_view(path, from, to, start_index = 1)
        result = @client.execute(:api_method => @analytics.data.ga.get,
                                 :parameters => {
                                   'ids' => @profile,
                                   'start-date' => from.to_date.strftime('%Y-%m-%d'),
                                   'end-date' => to.to_date.strftime('%Y-%m-%d'),
                                   'metrics' => 'ga:pageviews',
                                   'dimensions' => 'ga:pagePath',
                                   'filters' => "ga:pagePath=~#{path}",
                                   'sort' => '-ga:pageviews',
                                   'start-index' => start_index,
                                   'max-results' => @max_results
                                 })
        if result.status != 200
          raise result.response.body.to_s
        end
        hash = result.data.rows.inject(Hash.new(0)) do |acc, x|
          x[0] =~ /([0-9]+)/
          acc[$1.to_i] = x[1].to_i
          acc
        end
        if result.data.rows.size >= @max_results
          hash.merge!(page_view(path, from, to, start_index + @max_results))
        end
        hash
      end
    end
  end
end

いこーよ の過去1か月間のスポット詳細のアクセス数を取得します。

x = Actindi::Google::Analytics.new.page_view('^/facilities/[0-9]+$', 1.month.ago, Date.today)

@client.execute に渡す parameters にいては Google Analytics Query Explorer 2 を使って確認するといいと思います。

最後に、弊社ではシステムエンジニア、プログラマ、インフラエンジニアなどを募集しています。 おきがるにお問い合わせください。