notebook

都内でWEB系エンジニアやってます。

Net::Google::Analytics でページごとのpageview数を取得する

ブログをやっているとアクセスとか気になったりしますよね?

記事毎のPV数だったりはてぶ数だったり...

GoogleAnalyticsから見れば。。。でもよかったのですが、ブログのURL毎のPV数とかを一覧で出したいといった場合にちょっと不便だったのでGoogleAnalyticsのAPIを使ってPVを取得してみることにしました

Net::Google::Analyticsを使ってみます

Google Developer Console

APIを有効にする

  • 下記を参考にしてAPI呼び出しを行えるようにする
  • 他にも探せば色々あるはず

初心者でも分かる!なGoogle Analytics APIの使い方

OAuth2 token の生成

client_id,client_secret,redirect_uriを設定し、スクリプトを実行する

Net::Google::Analytics::OAuth2モジュールを使いrefresh_tokenを生成する

  • token.pl
!/usr/bin/env perl
use strict;
use warnings;

use Net::Google::Analytics::OAuth2;

my $client_id     = "457217754354-1a51pns0tn4sevpl84dlb2ok874t70h2.apps.googleusercontent.com";
my $client_secret = "vMsT98SeVK-rQrmUqwT19ASt";

my $oauth = Net::Google::Analytics::OAuth2->new(
  client_id     => $client_id,
  client_secret => $client_secret,
  redirect_uri  => 'http://localhost',
);

$oauth->interactive;

実行

  • URLが出てくるのでそれにアクセス
  • アクセスした際のURLの末尾についているcodeの値を入力する
  • 正常に取得できればAccess token,Refresh tokenが取得できるので以後それを使う
  • redirect_uriはコンソール上でプロジェクトのAPIを有効にする時に設定するものと同じでないとエラーになる模様
$ perl token.pl
Please visit the following URL, grant access to this application, and enter
the code you will be shown:

https://accounts.google.com/o/oauth2/auth.......

Enter code: <アクセスした際のURLについているcodeパラメータの値を入力>

Access token:  *****
Refresh token: *****

取得してみる

準備が整ったので実際に値を取得する

下記のようにAPIにリクエストする

my $req = $ga->new_request(
  ids        => "ga:10......",
  start_date => "2016-01-01",
  end_date   => "2016-01-19",
  dimensions => 'ga:pagePath',
  metrics    => "ga:pageviews",
);

my $res = $ga->retrieve($req);

各項目はざっと下記のような認識でよさそう

ids

  • viewID GoogleAnalyticsの管理画面上で取得する

dimensions

  • 結果をグループ化する指標

metrics

  • 取得する指標

filters

  • 取得するデータにフィルターをかける

start_date

  • 集計期間の始まり

end_date

  • 集計期間の終わり

参考

Dimensions(ディメンション)とMetrics(マトリクス)

PVを取得する

  • ga.pl
my $req = $ga->new_request(
  ids        => "ga:10......",
  start_date => "2016-01-01",
  end_date   => "2016-01-19",
  dimensions => 'ga:pagePath',
  metrics    => "ga:pageviews",
);

my $res = $ga->retrieve($req);

foreach my $row ( @{ $res->rows } ) {
  print "pv: " . $row->[1] . "\tpath: " . $row->[0] . "\n";
}

実行します

perl ga.pl
pv: 15  path: /entry/2015/07/14/014233
pv: 155 path: /entry/2015/07/22/040354
pv: 66  path: /entry/2015/07/28/031712
pv: 14  path: /entry/2015/08/04/024945
....
....
....
pv: 6   path: /entry/2015/08/12/024246
pv: 47  path: /entry/2015/08/19/023956
pv: 5   path: /entry/2015/08/25/004447
pv: 8   path: /entry/2015/09/02/003644
pv: 4   path: /entry/2015/09/08/232210

これでpath毎のPV数が出せます。path毎にシェア数も取得すればShareRateみたいなのが出せそうですね。

意味があるかどうかはおいといて...

また、ディメンジョンはカンマ区切りで複数指定可能です

my $req = $ga->new_request(
  ids        => "ga:10......",
  start_date => "2016-01-01",
  end_date   => "2016-01-19",
-  dimensions => 'ga:pagePath',
+  dimensions => 'ga:pagePath,ga:date',
  metrics    => "ga:pageviews",
);

my $res = $ga->retrieve($req);

foreach my $row ( @{ $res->rows } ) {
-  print "pv: " . $row->[1] . "\tpath: " . $row->[0] . "\n";
+  print "pv: " . $row->[2] . "\tdate:" . $row->[1] . "\tpath: " . $row->[0] . "\n";
}

結果の一行一行は配列になっていますがdimensionsで指定した順、metricsで指定した順に値が格納されるようです

perl ga.pl
pv: 1   date:20160102   path: /entry/2015/07/22/040354
pv: 10  date:20160104   path: /entry/2015/07/22/040354
pv: 11  date:20160105   path: /entry/2015/07/22/040354
pv: 14  date:20160106   path: /entry/2015/07/22/040354

そもそもブログのPV自体が少ないのであれですが日別レポートも出せますねw

Analyticsのコンソールだとdimensionsは二つまで(セカンダリディメンジョン)ですが、API経由だとそれ以上ディメンジョンを指定できるのでより細かいレポートとかを独自に作れたりしそうです