Google Analyticsから直近のページ閲覧数を取得する


環境

  • PHP 7.3
  • google/apiclient 2.4

参考

https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-php?hl=ja


商品ページにて「24時間以内に○○人が見ています」という販促メッセージを出す時に、乱数を使っているサービスもあるようですが、 それはさすがに嫌なのでGoogle Analyticsから閲覧実績を取得して表示してみます。
なお、Google Analyticsからは「昨日から今日まで」のように日付指定しかできないので、「10分以内に」のように厳密な時間を指定して閲覧者数を表示することはできません。

GCPのサービスアカウント作成

まず、以下ページにてサービスアカウントを作成します。
※もしGoogle CloudPlatform(GCP)のプロジェクトを作成していない場合は「プロジェクトを作成」をクリックしてGCPプロジェクトを作成してから実行します。
https://console.developers.google.com/iam-admin/serviceaccounts?hl=ja

「プロジェクトの選択」よりサービスアカウントを作成するプロジェクトを選択し、
「+サービスアカウントを作成」をクリックします。

サービスアカウントの作成画面が開くので以下の通り入力して「作成」をクリックしてください。

項目 入力内容
サービスアカウント名 独自の自分で判断できる名前
サービスアカウントID 独自のID(サービスアカウント名を入力したら勝手に入ります)
サービスアカウントの説明 自分が分かる説明

次にサービスアカウントの権限設定画面が開きますが、そのまま「続行」をクリックします。

その次の画面で「ユーザーにこのサービス アカウントへのアクセス権を付与」は特に何もしません。
「キーの作成」の中の「キーを作成」をクリックし、キーのタイプはJSONを選択して「作成」をクリックします。
JSONファイルがダウンロードされますので取っておいてください。

サービスアカウントの作成画面はそのまま「完了」をクリックして終わります。
サービスアカウント一覧に戻り、作成したサービスアカウントのメールアドレスが表示されるので記録しておきます。

Google Analytics APIの有効化

以下ページにアクセスし、Google Analytics APIを有効化してください。
https://console.developers.google.com/apis/api/analytics.googleapis.com/overview

Google Analyticsの設定

さきほど作成したサービスアカウントをGoogle Analyticsに追加します。
アカウントユーザーまたはプロパティユーザーにサービスアカウントのメールアドレスを追加します。
権限は「表示と分析」のみ(デフォルト)で大丈夫です。

スクリプトの作成

PHPとcomposerの環境は構築済みの前提とします。

まず、Google Analytics APIのパッケージを取得します。

composer require google/apiclient

次に以下のPHPスクリプトを作成します。

<?php
require_once __DIR__ . '/vendor/autoload.php';

$analytics = initializeAnalytics();
$profile = getFirstProfileId($analytics);
$results = getResults($analytics, $profile);
printResults($results);

/**
 * Google Clientを初期化する
 */
function initializeAnalytics()
{
  $KEY_FILE_LOCATION = {{GCPのサービスアカウント作成時に取得したjsonファイルへのパス}};
  // 例:$KEY_FILE_LOCATION = __DIR__ . '/config/hogehoge.json';

  $client = new Google_Client();
  $client->setApplicationName("Hello Analytics Reporting");    // 任意の名前に変更してよいです
  $client->setAuthConfig($KEY_FILE_LOCATION);
  $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']);
  $analytics = new Google_Service_Analytics($client);

  return $analytics;
}

/**
 * プロファイルを取得する
 */
function getFirstProfileId($analytics) {
  $accounts = $analytics->management_accounts->listManagementAccounts();

  if (count($accounts->getItems()) > 0) {
    $items = $accounts->getItems();
    $firstAccountId = $items[0]->getId();

    $properties = $analytics->management_webproperties
        ->listManagementWebproperties($firstAccountId);

    if (count($properties->getItems()) > 0) {
      $items = $properties->getItems();
      $firstPropertyId = $items[0]->getId();

      $profiles = $analytics->management_profiles
          ->listManagementProfiles($firstAccountId, $firstPropertyId);

      if (count($profiles->getItems()) > 0) {
        $items = $profiles->getItems();

        return $items[0]->getId();

      } else {
        throw new Exception('No views (profiles) found for this user.');
      }
    } else {
      throw new Exception('No properties found for this user.');
    }
  } else {
    throw new Exception('No accounts found for this user.');
  }
}

/**
 *  取得条件を設定して取得する
 */
function getResults($analytics, $profileId) {
  $from = '1daysAgo';                          // 昨日から
  $to    = 'today';                            // 今日までのデータを取得します
  $metrics = "ga:pageviews";                   // 閲覧者数を取得します
  $option = [
    "dimensions" => 'ga:pagepath',             // ページパス別に閲覧数を取得します
    "sort" => "-ga:pageviews",                 // 閲覧数でソートします。マイナスを付けているので降順になります
    // "filters" => "ga:pagepath%3D@/article",    // コメントアウトを外すと、ページパスに「/article」を含むものに絞ります
  ];

  return $analytics->data_ga->get(
        'ga:' . $profileId,
        $from,
        $to,
        $metrics,
        $option
  );
 }

/**
 * 取得結果を出力する
 */
function printResults($results) {
  echo 'page url,previews' . PHP_EOL;
  foreach ($results as $result){
    echo $result[0] . ',' . $result[1] . PHP_EOL;
  }
}

このPHPを実行すればページ別閲覧者数が取得できます。
取得した結果の中から該当ページの閲覧数を抜き出してページに表示すれば完了です。

上記ソース内のfiltersでページURLを細かく絞ってしまえば現在取得したいページの閲覧数だけ取れますが、
Google Analytics APIの応答は数秒かかるので各ページ個別に閲覧数を取るのは現実的ではありません。
なので、上記のように閲覧数の多いものから順に取ってキャッシュに入れておき、基本的にはキャッシュから取得するようにした方が良さそうです。
(キャッシュは1分間に1度更新するなど)

設定する値について

こちらのページでmetricsやdimensionに設定できる値がまとめられています。
閲覧者数以外を取得したい場合など、参考にしてください。
https://ga-dev-tools.appspot.com/dimensions-metrics-explorer/

その他解説はこちらの公式ページをご参照ください。
https://developers.google.com/analytics/devguides/reporting/core/v3/reference