【Laravel】Google Analytics Data APIを使ってGA4からアクセス情報を取得する(続き)

以前試作した Google Analytics Data APIを使ってGA4からアクセス情報を取得する プログラムを、毎月投稿しているアクセス解析ページの自動生成プログラムに投入してみました






こちらの記事で使用しています

【Access Report】 2023年9月



APIを通じて取得している情報は次の4つです。


  1. ページビュー
  2. アクセスユーザー数
  3. 記事アクセスTOP20
  4. 直近2ヶ月間に書いた記事アクセスTOP10


どれも大して凝ったことはしていないですが、一部コードを抜粋して紹介します。



ページビュー/アクセスユーザー数

サービス層に実装した情報取得のためのメソッドがこちらです。


public function getMonthlyData(CarbonImmutable $target_month)
{
   return $this->client->runReport([
       'property'        => $this->property,
       'dateRanges'      => [
           new DateRange([
               'start_date' => $target_month->startOfMonth()->toDateString(),
               'end_date'   => $target_month->endOfMonth()->toDateString(),
           ]),
       ],
       'metrics'         => [
           new Metric([
               'name' => 'screenPageViews', // ページビュー
           ]),
           new Metric([
               'name' => 'activeUsers', // アクティブユーザー数
           ])
       ]
   ])->getRows()->offsetGet(0)->getMetricValues();
}


特定の月のページビューとアクティブユーザー数を取得しています。Metricに設定すればそれ以外の要素ももちろん取得可能です。



記事アクセスTOP20

こちらも実装したメソッドから一部抜粋します。


$response = $this->client->runReport([
   'property'        => $this->property,
   'dateRanges'      => [
       new DateRange([
           'start_date' => $target_month->startOfMonth()->toDateString(),
           'end_date'   => $target_month->endOfMonth()->toDateString(),
       ]),
   ],
   'dimensions'      => [
       new Dimension([
           'name' => 'pagePath',
       ]),
       new Dimension([
           'name' => 'pageTitle',
       ]),
   ],
   'dimensionFilter' => new FilterExpression([
           'filter' => new Filter([
               'field_name'    => 'pagePath',
               'string_filter' => new Filter\StringFilter([
                   'match_type' => MatchType::PARTIAL_REGEXP,
                   'value'      => '^/20',
               ]),
           ]),
       ]),
   'metrics'         => [
       new Metric([
           'name' => 'screenPageViews', // ページビュー
       ])
   ],
   'orderBys'        => [
       new OrderBy([
           'metric' => new OrderBy\MetricOrderBy([
               'metric_name' => 'screenPageViews',
           ]),
           'desc'   => true,
       ]),
   ],
   'limit' => $limit
]);


dimensionで記事のパスを取得し、その記事パスが「/20」で始まるものだけを対象にしています。これはトップページなど記事以外のページが対象になるのを防ぐためです。あとはorderBysで並べ替えを指定すればランキング情報が完成します。



直近2ヶ月間に書いた記事アクセスTOP10

$last_month = $target_month->subMonth();
$regexp = sprintf(
   '^/(%s|%s)',
   $last_month->format('Y/m'),
   $target_month->format('Y/m')
);

$response = $this->client->runReport([
   'property'        => $this->property,
   'dateRanges'      => [
       new DateRange([
           'start_date' => $target_month->startOfMonth()->toDateString(),
           'end_date'   => $target_month->endOfMonth()->toDateString(),
       ]),
   ],
   'dimensions'      => [
       new Dimension([
           'name' => 'pagePath',
       ]),
       new Dimension([
           'name' => 'pageTitle',
       ]),
   ],
   'dimensionFilter' => new FilterExpression([
           'filter' => new Filter([
               'field_name'    => 'pagePath',
               'string_filter' => new Filter\StringFilter([
                   'match_type' => MatchType::PARTIAL_REGEXP,
                   'value'      => $regexp,
               ]),
           ]),
       ]),
   'metrics'         => [
       new Metric([
           'name' => 'screenPageViews', // ページビュー
       ])
   ],
   'orderBys'        => [
       new OrderBy([
           'metric' => new OrderBy\MetricOrderBy([
               'metric_name' => 'screenPageViews',
           ]),
           'desc'   => true,
       ]),
   ],
   'limit' => $limit
]);


基本的には「記事アクセスTOP20」と同じですが、記事パスの絞り込み方が若干変わっています。例えば2023年10月のアクセス情報として直近2ヶ月の記事を集計したい場合、記事パスが「/2023/09」または「/2023/10」で始まる記事を集計しています。

その他は特に変更ありません。シンプルですね。



まとめ

コードを書いてみた感想としては、以前に比べて非常に見やすいコードが書けるようになったなあという印象です。なんというか、プログラマブルなSQLって感じ。Google公式のライブラリを使って取得出来るのもいいですね。僕の場合はこれ以上複雑なことはしませんが、BIツールを内製したいなんていうときでもドキュメントで欲しい情報がどんなキーワードで取得出来るかさえ発見出来れば、あとはすんなり実装出来るかなと。


ちなみにキーワードはこちらのページで見られるんですが、


API のディメンションと指標 bookmark_border Analytics Data API クエリでサポートされているディメンションと指標。

API のディメンションと指標  |  Google Analytics Data API  |  Google for Developers


日本語翻訳されたページを見ると見事にAPI名も日本語訳されて表示されてしまって(「adFormat」→「広告フォーマット」「activeUsers」→「アクティブ ユーザー」)ドキュメントとして役に立たないので、英語表記で見るのをオススメします。


API Dimensions & Metrics bookmark_border The dimensions and metrics supported in the Analytics Data API queries.

API Dimensions & Metrics  |  Google Analytics Data API  |  Google for Developers


自動翻訳は翻訳しない場所を設定出来るようにしないとダメですねー。

それかドキュメントは英語で読めってことかな。