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の使い方