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

Google Analytics V3の廃止とGA4への移行はずいぶん前から予告されていて、データ蓄積という点では対応していたのですけど、データ集計用バッチの対応をめんどくさがって後回しにしていたせいで先日のアクセスレポートで上手くデータが集計出来ないということになってしまいました。反省






Laravel上に作成したサンプルプログラムでGA4からデータを取得してみました

まだ実用化はしてないんですが動くことは確認出来ました。こんな感じのレスポンスが返ってきてます。


Google\Analytics\Data\V1beta\RunReportResponse {#1875 ▼
 -dimension_headers: Google\Protobuf\Internal\RepeatedField {#1865 ▶}
 -metric_headers: Google\Protobuf\Internal\RepeatedField {#1876 ▶}
 -rows: Google\Protobuf\Internal\RepeatedField {#1877 ▶}
 -totals: Google\Protobuf\Internal\RepeatedField {#1872 ▶}
 -maximums: Google\Protobuf\Internal\RepeatedField {#1862 ▶}
 -minimums: Google\Protobuf\Internal\RepeatedField {#1863 ▶}
 -row_count: 701
 -metadata: Google\Analytics\Data\V1beta\ResponseMetaData {#7279 ▶}
 -property_quota: null
 -kind: "analyticsData#runReport"
 -desc: Google\Protobuf\Internal\Descriptor {#1789 ▶}
 -unknown: ""
}


例えば8月のPVを取得するコードはこんな感じで、


$client = new BetaAnalyticsDataClient([
   'credentials' => config('google.analytics.credentials')
]);
$response = $client->runReport([
   'property'        => 'properties/' . config('google.analytics.propertyId'),
   'dateRanges'      => [
       new DateRange([
           'start_date' => '2023-08-01',
           'end_date'   => '2023-08-31',
       ]),
   ],
   'metrics'         => [
       new Metric([
           'name' => 'screenPageViews', // PV数
       ])
   ]
]);
dump($response->getRows()->offsetGet(0)->getMetricValues()[0]->getValue());


結果はこう。


"20641"



基本的にはこの記事を参考にすれば間違いありません

GA4からデータを取得するには工程が多いため、迷子になることや注意点が多かったです。 本記事では写真と共にクリックする場所を丁寧に解説していきますので、参考になるかと思います。

PHP(Laravel)でGA4のPV数を取得してみた | FOURIER TECH BLOG 〜 IT技術ブログ 〜


Google Cloudの設定とGoogle Analyticsの設定がめちゃくちゃ丁寧に書かれていて、これさえ読めばほとんど大丈夫です。特に最新に近いLaravelであれば問題なくいけると思います。

ただ僕が使っているLaravel 5.8ではいくつか罠があったのでそれについてはちょっと補足。



400 Bad Request





実際のエラーメッセージはこちら。


Client:error `POST https://oauth2.googleapis.com/token` resulted in a
`400 Bad Request` response: {"error":"invalid_scope",
"error_description":"Invalid OAUth scope or ID token audience provided."}


これものすごく苦戦しました。credentialsが読み込めてないのかなとか色んなことをたくさん考慮しましたけど最終的な結論は、

どうやらサーバにインストールされているGoogle関連ライブラリが古い


であって、以下のコマンドで解決しました。

composer update


実際に上手く動いていないライブラリは一部なわけですから、それを特定した上でそれだけをアップデートする方が安全だろうとは思います。念のため。


補足:認証情報を設定するやり方はいくつかある

詳しくはドキュメントのここに書かれています。


In general, the Google Cloud PHP library uses Service Account credentials to connect to Google Cloud services. When running on Compute Engine the credentials will be discovered automatically. When running on other environments, the Service Account credentials can be specified by providing the path to the JSON keyfile for the account (or the JSON itself) in environment variables.

google-cloud-php/AUTHENTICATION.md at main · googleapis/google-cloud-php


具体的には次のどれだけであれば大丈夫らしい。


putenv("GOOGLE_APPLICATION_CREDENTIALS=" . __DIR__ . '/your-service-account-credentials.json');

// Authenticating with keyfile data.
$video = new VideoIntelligenceServiceClient([
   'credentials' => json_decode(file_get_contents('/path/to/keyfile.json'), true)
]);

// Authenticating with a keyfile path.
$video = new VideoIntelligenceServiceClient([
   'credentials' => '/path/to/keyfile.json'
]);


サーバの環境変数に設定してしまうということも出来るみたいです。


Here are the environment variables that Google Cloud PHP checks for credentials:

GOOGLE_APPLICATION_CREDENTIALS – Path to JSON file

google-cloud-php/AUTHENTICATION.md at main · googleapis/google-cloud-php



Call to undefined function Google\Protobuf\Internal\bnccomp()

これはbcmathというライブラリが入っていないと起こるエラーのようです。


これはbcmathが入っていないのが原因。

GA4 APIをPHPで叩こうとしたら undefined function とか言われた – Qiita


インストールコマンドはOSによっていろいろ変わるだろうと思いますが、Amazon Linuxの場合はこんな感じでした。


sudo yum install php72-bcmath


PHPのバージョンによって変わるので、正しいバージョンをインストールしてください。



あとはドキュメントを見ながら欲しいデータを取得するようにコードを書くだけ

Google アナリティクスのレポートデータにアクセスします。警告: 複数のお客様アプリケーション、アカウント、プロジェクトを 1 つ作成し、単一のお客様アプリケーション、アカウント、プロジェクトとして動作させたり、サービス固有の使用制限や割り当てを回避したりすると、Google Cloud Platform の利用規約および Google API の利用規約に直接違反します。この操作を行うと、警告が表示されずに GCP プロジェクトが直ちに終了する可能性があります。

Google Analytics Data API  |  Google for Developers


特別複雑というわけではないんですけど、多種多様なデータが取得出来るから色んなオプションがあるんですよね。欲しいデータはごく限られてるのでそれだけ知りたいんですけどドキュメントが長い……適切な設定を気長に探して組み込んでいくしかないかなー



来月のアクセスレポートまでにはなんとかしたいですね。なるかなあ。
(難易度よりモチベーションの問題)