Site icon Tips Note by TAM

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を有効にします。

Google Developers Console

認証情報を作成してくださいと言われるので、認証情報の作成に進みます。

色々入力するところがありますが、ここは気にせずにサービスアカウントの作成に進みます。

「サービスアカウントを作成」のボタンを押すと、アカウント名の入力と秘密鍵の作成するためのモーダルが立ち上がりますので、
アカウント名は任意の名前で、秘密鍵のタイプは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の使い方