RubyでGoogleAnalyticsの値を取得する


ウリドキネットでリードエンジニアをしている三浦です。

今回は、会社のアクセス解析でGoogleAnalyticsを使っているところも多いかと思いますが、Rubyでアクセス解析の特定の条件の結果を取得する方法を紹介させていただこうかなと思います。
gemはgoogle-api-clientを使ったものになります。
動作確認したバージョンは少し古く0.23.4で、最新版とは違う部分があるかもしれませんが、ご容赦いただきたいです。
また、認証についは調べると色々わかると思うのでこの記事では取り上げません。
今回は検索ページを閲覧数が多い順に取得するという例で取り上げようと思っています。
GoogleAnalytics APIの用語だとDimension(性質)がga:pagePath、Metric(指標)がga:pageviewsとなります。
Dimenssion, Metricについては数が多すぎて説明しきれないので、こちらを参照いただければと思います。(執筆現在英語のページしかないようですが)
データ取得するサービスは下記のように初期化します。
ruby
require 'google/apis/analyticsreporting_v4'

service = Google::Apis::AnalyticsreportingV4::AnalyticsReportingService.new
service.authorization = [何らかの認証]
対象日時の範囲は下記のように指定できます。
ruby
date_range = Google::Apis::AnalyticsreportingV4::DateRange.new(start_date: 'yesterday', end_date: 'yesterday')
基本はYYYY-MM-DD 形式ですが、today、yesterday、NdaysAgo(N は正の整数)が使用することができます。
今回は昨日のもので絞り込むようにします。
下記で対象Dimensionを指定します。
ruby
 dimension = Google::Apis::AnalyticsreportingV4::Dimension.new(name: 'ga:pagePath')
下記でDimensionの絞り込み条件を指定しています。
ruby
 dimension_filter_clause = Google::Apis::AnalyticsreportingV4::DimensionFilterClause.new(
   filters: [
     Google::Apis::AnalyticsreportingV4::DimensionFilter.new(
         operator: 'BEGINS_WITH',
         dimension_name: 'ga:pagePath',
         expressions: ['/search?']
       )
    ]
 )
operatorはこちらのものが使用できます。
今回は「/search?」で始まるもので絞りこむようにします。
filtersは配列なので複数指定することも可能です。
ORかANDかをDimensionFilterClause.newにoperator: 'AND'のように渡すことで指定できます。
デフォルトはORになります。
以下Metricsの指定をしている部分です。
operatorには、こちらのものが使用できます。
今回は1より大きいもので絞り込むようにします。
他、filtersやoperatorの話はDimensionFilterClauseと同様なので割愛します。
ruby
metric = Google::Apis::AnalyticsreportingV4::Metric.new(expression: 'ga:pageviews')
metric_filter_clause = Google::Apis::AnalyticsreportingV4::MetricFilterClause.new(
  filters: [
    Google::Apis::AnalyticsreportingV4::MetricFilter.new(
      metric_name: 'ga:pageviews',
      operator: 'GREATER_THAN',
      comparison_value: '1'
     )
   ]
 )
並び順は下記のように指定します。
field_nameにはMetricに設定したものが指定できます。
sort_orderにはASCENDING(昇順), DESCENDING(降順)が指定できます。
order_typeもこちらの指定できますが、今回はデフォルトのVALUEでいいので何も指定していません。
ruby
order_by = Google::Apis::AnalyticsreportingV4::OrderBy.new(field_name: 'ga:pageviews', sort_order: 'DESCENDING')
ここまで定義したものをReportRequestとしてGetReportsRequestに指定します。
ReportRequestが配列渡せるので、複数のレポートをまとめて取得することもできます。
その他ReportRequestにMetricなども複数渡すことができます。
ruby
request = Google::Apis::AnalyticsreportingV4::GetReportsRequest.new(
  report_requests: [
     Google::Apis::AnalyticsreportingV4::ReportRequest.new(
       view_id: [見たいビューのID],
       metrics: [metric],
       metric_filter_clauses: [metric_filter_clause],
       dimensions: [dimension],
       date_ranges: [date_range],
       dimension_filter_clauses: [dimension_filter_clause],
       order_bys: [order_by]
    )
  ]
)
あとはデータ取得処理ですReportRequest, Dimensionなど1つしか設定していないのでfirstで取得しています。
ruby
response = service.batch_get_reports(request)
result = response.reports&.first
 if result
    result.data.rows.map do |row|
       row.dimensions.first
     end
  else
    []
end
これで下記のように検索のパスをアクセスが多い順に取得できます。
ruby
['/search?q=hoge', `/search?q=huga', ・・・]
どうだったでしょうか?
これを参考にRubyでGoogleAnalyticsのデータを活用できるようなっていただけるとありがたいです。