PHPでGoogle Analytics APIを利用して、アクセス解析のデータをSlackに投げる(前編)

こんにちは、今回はみんな大好きGoogle AnalyticsとSlackの話です。
TAMでは、チャットツールでSlackを使用しているのですが、Google Analyticsで取得したアクセス解析のデータを定期的にSlackに投げるような仕組みを作れば、サイトやサービスの運営に役に立つと思いつくってみました!
記事が長くなってしまったので
- GAのAPIを使用してアクセス解析の結果を取得する
- 取得した値をSlackに投稿する
の前後編に分けてお送りします。
後編は1週間後くらいに公開予定です!
公開しました!後編はこちら!
Google Analytics APIって?
まずは、APIを利用して何が出来るのかというところですが、Google Analyticsのアカウントやユーザー管理・アクセス解析レポートの各情報を取得することができます。
レポートの情報を取得してプログラムで処理させれば、別のデータと紐付けしたり、レポートの作業を自動化したり、様々なことが出来るようになります。
例えば、サイトのよく見られているページのランキングを表示させることなどが可能です。
今回はReporting APIというレポートデータを取得するためのAPIを使用します。
APIを使うための準備
1. Google Developers Consoleでプロジェクト作成
Google Analytics APIを使用するには、まずGoogle Developers Consoleに登録が必要なので、アカウントが無い方は取得しましょう。安心してください、無料ですよ。
プロジェクトを作成するか、既存のプロジェクトを選択して、APIを有効にします。
認証情報を作成してくださいと言われるので、認証情報の作成に進みます。
色々入力するところがありますが、ここは気にせずにサービスアカウントの作成に進みます。
「サービスアカウントを作成」のボタンを押すと、アカウント名の入力と秘密鍵の作成するためのモーダルが立ち上がりますので、
アカウント名は任意の名前で、秘密鍵のタイプはP12を選んでください。「作成」ボタンを押すと、ファイルがダウンロードされます。これは後で使用します。
作成したサービスアカウントのメールアドレスも後で使用します。Developers Consoleでの作業はここまでです。
2. Google Analytics側の設定
Google Analytics側の管理画面で先ほど作成したアカウントを許可します。
「アナリティクス設定」 のアクセスしたいビューの 「ユーザー管理」で先ほど作成したサービスアカウントのメールアドレスを追加します。アクセス権は「表示と分析」でOKです。
3. クライアントライブラリをインストール
ここまで来たら、もうちょっとです!
次にGoogle クライアント ライブラリをインストールをします。
公式のリファレンスどおり、下記のGitコマンドでクローンします。
git clone -b v1-master https://github.com/google/google-api-php-client.git
※GitHubのページから直接Zipでダウンロードして使った時はファイルがたりないとのエラーが出たので、Gitコマンドでダウンロードするほうが確実そうです。
ライブラリのインストールが完了したら実際にコードを書いていきます!
1週間分のセッション数を取得してみる
やっとコードを書いていきます!
公式ガイドにHelloAnalytics.phpという1週間分のセッション数を出力するサンプルがあるので、そちらを参考にしつつ、出来るだけコンパクトにしました。
// ライブラリの読み込み
require_once 'google-api-php-client/src/Google/autoload.php';
// サービスアカウントのメールアドレス
$service_account_email = '取得したサービスアカウントのメールアドレス';
// 秘密キーファイルの読み込み
$key = file_get_contents('取得した秘密キーのファイル名');
// プロファイル(ビュー)ID
$profile = '取得したいレポートのビューID';
// Googleクライアントのインスタンスを作成
$client = new Google_Client();
$analytics = new Google_Service_Analytics($client);
// クレデンシャルの作成
$cred = new Google_Auth_AssertionCredentials(
$service_account_email,
array(Google_Service_Analytics::ANALYTICS_READONLY),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
ここでは、「1. Google Developers Consoleでプロジェクト作成」の工程で作成したアカウントや秘密キーファイルを設定します。
ビューIDはGoogle Analyticsの管理画面の「アナリティクス設定」 → 「ビュー設定」から確認することができます。
また、パスは適宜に合わせてください。
ここまでAPIを使う準備ができましたので、1週間分のセッション数の取得をしてみます。
レポーティングAPIでは get メソッドに引数を与えてレポートの数値を取得していきます。
| ids | ビューID |
|---|---|
| start-date | アナリティクスデータの取得を開始する日付 |
| end-date | アナリティクスデータの取得を終了する日付 |
| metrics | 取得したい値。複数の値を取得したい場合は、カンマ区切りで指定します |
が必須になります。試しに、必須の引数だけ与えた以下の様なコードを実行してみます
$result = $analytics->data_ga->get( 'ga:' . $profile, // アナリティクス ビュー ID '7daysAgo', // データの取得を開始する日付は7日前 'yesterday', // データの取得を終了する日付は昨日 'ga:sessions' // セッション数を取得する ); // 結果を出力 echo $result -> rows[0][0];
これで1週間のセッションが出力されたら成功です。
その他の様々なパラメータを組み合わせることで、日付ごとやページごとに値を取得したり、並び替えが出来るようになります。詳しくは公式のクエリパラメータを参考にしていただければと思います。
では、スラックに送りたいレポートを取得するための処理を書いていこうと思います。
今回は「1週間分のレポートと先週との比較」「1週間分の人気記事とPV」を取得するための処理を書いていきます。
1週間分のレポートと先週との比較
先ほど、 metrics に与えていた値を増やして、1週間分のセッション数・PV・平均閲覧ページ数・平均セッション時間・直帰率を取得出来るようにしてみました。値は10個まで指定できるようです。
function getWeeklyReport($analytics, $profile){
// セッション数・PV・平均閲覧ページ数・平均セッション時間・直帰率を取得
$results = $analytics->data_ga->get(
'ga:' . $profile,
'7daysAgo',
'yesterday',
'ga:sessions,ga:pageviews,ga:pageviewsPerSession,ga:avgSessionDuration,ga:bounceRate'
);
// 取得したデータからレポート部分を抽出
$data = $results->rows;
// 7日前と昨日の日付を取得
$start = date("n/d", strtotime("-1 week"));
$end = date("n/d", strtotime("-1 day"));
// データを整形
$report = $start . '〜' . $end . 'のレポート' . "\n";
$report .= '訪問数 : ' . $data[0][0] . "\n";
$report .= '合計PV : ' . $data[0][1] . "\n";
$report .= '平均閲覧ページ数 : ' . round( $data[0][2], 2 ) . 'ページ' . "\n";
$report .= '平均滞在時間 : ' . ceil( $data[0][3] ) . '秒' . "\n";
$report .= '直帰率 : ' . round( $data[0][4], 1 ) . '%' . "\n";
return $report;
}
$report = getWeeklyReport($analytics, $profile);
get メソッドで様々なデータが取得できるのですが、 rows という項目の中にメインとなるデータが配列で入っています。
あとは、そのデータを元に整形していけばOKです!
これで $report を print_r で出力してみると、

のように返って来ます。取れてる!
(※改行がなくてわかりにくかったのでソースコードで見てます)
先週の値と比較できるように改良してみます!
function getWeeklyReport($analytics, $profile){
// 7日前から昨日までのセッション数・PV・平均閲覧ページ数・平均セッション時間・直帰率を取得
$results_this_week = $analytics->data_ga->get(
'ga:' . $profile,
'7daysAgo',
'yesterday',
'ga:sessions,ga:pageviews,ga:pageviewsPerSession,ga:avgSessionDuration,ga:bounceRate'
);
// 14日前から8日前までのセッション数・PV・平均閲覧ページ数・平均セッション時間・直帰率を取得
$results_last_week = $analytics->data_ga->get(
'ga:' . $profile,
'14daysAgo',
'8daysAgo',
'ga:sessions,ga:pageviews,ga:pageviewsPerSession,ga:avgSessionDuration,ga:bounceRate'
);
// 取得したデータから必要な部分を抽出
$this_week_data = $results_this_week->rows;
$last_week_data = $results_last_week->rows;
// 7日前と昨日の日付を取得
$start = date('n/d', strtotime('-1 week'));
$end = date('n/d', strtotime('-1 day'));
// 先週と今週のレポートを比較して増減を計算する関数
function calcReport($this, $last){
$result = round( $this - $last , 1);
if($result > 0){
return ' (+' . $result . ') ';
} else {
return ' (' . $result . ') ';
}
}
// データを整形
$report = $start . '〜' . $end . 'のレポート' . "\n";
$report .= '訪問数 : ' . $this_week_data[0][0] . calcReport( $this_week_data[0][0], $last_week_data[0][0] ) . "\n";
$report .= '合計PV : ' . $this_week_data[0][1] . calcReport( $this_week_data[0][1], $last_week_data[0][1] ) . "\n";
$report .= '平均閲覧ページ数 : ' . round( $this_week_data[0][2], 2 ) . calcReport( $this_week_data[0][2], $last_week_data[0][2] ) . "\n";
$report .= '平均滞在時間 : ' . ceil( $this_week_data[0][3] ) . '秒' . calcReport( $this_week_data[0][3], $last_week_data[0][3] ) . "\n";
$report .= '直帰率 : ' . round( $this_week_data[0][4], 1 ) . '%' . calcReport( $this_week_data[0][4], $last_week_data[0][4] ) . "\n";
return $report;
}
$report = getWeeklyReport($analytics, $profile);
単純に、取得する日付を変えて、PHPで計算をしています!
値ごとに調整するのがめんどくさかったんで、増減は全て小数第2位が四捨五入されるようになってます。
これで 先ほどと同じように $report を print_r してみます。

()の中に先週のレポートと比べた増減が入るようになりました!いい感じ!
この調子でランキングの取得にすすみます!
1週間のPV数上位記事を取得してランキングを作る
人気記事を取得するためには、引数に dimensions や sort を与えてあげるようにします。
function getWeeklyRanking($analytics, $profile){
$results = $analytics->data_ga->get(
'ga:' . $profile,
'7daysAgo',
'yesterday',
'ga:pageviews',
array(
'dimensions' => 'ga:pageTitle', // データの区切り
'sort' => '-ga:pageviews', // ページビューでソート
'max-results' => '10', // 取得件数
)
);
// 取得したデータから必要な部分を抽出
$data = $results->rows;
// 7日前と昨日の日付を取得
$start = date('n/d', strtotime('-1 week'));
$end = date('n/d', strtotime('-1 day'));
// 配列で取得したデータをループで回してランキングに
$ranking = $start . '〜' . $end . 'の記事ランキング' . "\n";
foreach ($data as $key => $row) {
$ranking .= ($key + 1) . '.' . $row[0] . ' ' . $row[1] . 'PV' . "\n";
}
return $ranking;
}
$ranking = getWeeklyRanking($analytics, $profile);
このように書くと、「ページタイトルごと」に「PV数」で「10件」取得することができます。
ソート順はデフォルトでは昇順になっているので、 ga:pageviews の前にマイナス記号(-)をつけることで降順にすることができます。
記事ごとに配列になっているので、foreachでループさせてランキングの形にします。
結果を見てみると…できとる!

PV数は伏せますが、TipsNoteのリアルランキングが出力されました。
なるほど、JavaScript関連の記事が人気ですね。次はJavaScriptの記事でPV上位狙おう。
というわけで、次回はこの結果を定期的にSlackに投げる仕組みを作ります!
1週間後くらいに公開予定ですので、
公開しました!後編では、Slackへの投稿とherokuで定期的に実行させる方法を書きました!
PHPでGoogle Analytics APIを利用して、アクセス解析のデータをSlackに投げる(後編)
参考サイトまとめ
アナリティクス Core Reporting API
初心者でも分かる!なGoogle Analytics APIの使い方


