【PHP】Google Analytics APIでレポートデータを取得したい！

最近めっきりAPIからは遠ざかっていたのですが、
久しぶりに運用担当さんから連絡が来ました。
曰く「**Google Analyticsのレポートを自動化したい**」とのこと。

ヤッホーーーイ！！

最近バージョンアップとかしかなくて退屈してたんだよね！（違う）

ということで、今回挑むのはGoogle Analytics APIです。
例によって「（意地でも）**サンプルを使わずにデータを取る！**」方式により
頑張っていきたいと思います。

毎度の繰り返しになりますが、
Googleは「サンプルプログラムを使ってやってね！」を推奨しているので
なにかあっても自己責任でお願いします！

**っていうかアナリティクスってなに！？**
正直あまり馴染みがないのですが･･･まあなんとかなるか。なるか･･･？

# Google Analytics APIとは

Google Analyticsとは、天下のGoogleさんが提供しているアクセス解析ツールです。
当然のことながら無料。さすがぐーぐるさんですね。

Analyticsを利用すると、サイトにどのくらいアクセスが来ているか、
リアルタイムの訪問数や、ユーザーのページ滞在時間、直帰率など
**サイトを訪れた人が、どのページをどのくらい見ているかがわかります。**

こうやって私たちは常に監視されているわけですね。
なんかこわい。

そんな恐ろしくも便利なGoogle Analyticsには、APIが用意されています。
その名も**Google Analytics Data API**！（そのままや）
リファレンスは[こちら](https://developers.google.com/analytics/devguides/reporting/data/v1)をどうぞ。

ではさっそくAPI導入する手順をご説明しましょう。

# Analytics APIを有効にする

すでにさまざまなGoogleAPIを導入してきたので

[【PHP】Google Ads APIをサンプルプログラム無しで使いたい！！](https://qiita.com/azasaz/items/9a64c7c8d56d6692788b)
[【PHP】Google Sheets APIをサンプルプログラム無しで使いたい！！](https://qiita.com/azasaz/items/051f2cc1646fe13a8710)
[【PHP】Google Ads APIで入札情報を更新したい！](https://qiita.com/azasaz/items/80175f180b4bbfd8315e)
[【PHP】GoogleAPIで操作履歴を取りたい！](https://qiita.com/azasaz/items/fcbbe9101efad2ffeda7)
[【PHP】Google広告APIでオフラインコンバージョンを自動アップロードしたい！](https://qiita.com/azasaz/items/26d5cc399158bf4cec8c)

どれか一つでも導入済みの方には説明不要かと思いますが、
GoogleでAPIを利用するためには「[API コンソール](https://console.developers.google.com/)」というところで
「プロジェクト」を設定する必要があります。

そこらへんの解説は、検索したらたくさん出てくると思いますので、
わかりやすいものを参考にしながら作成してください。
たとえば[こことか](https://homework.hatenablog.jp/entry/2016/11/24/122643)

プロジェクトを作成したら、「有効なAPIとサービス」⇒「＋APIとサービスの有効化」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566860/dc5d3194-5bad-c110-fe18-2a89a83e14c7.png)

「analytics」とかで検索すると「Google Analytics Reporting API」が出てくるので、
それをクリックして有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566860/8ac10623-7231-1082-5134-857bd8b5af53.png)

「Google Analytics API」というのもありますが、
こちらはアカウントの管理をしたりユーザーの制御をしたりするためのものなので
レポートを取るだけなら必要ありません。

# サービスアカウントでoAuth認証を行う

ここからはプログラミングに入っていきます。

といっても、基本的に
今までやっていたことの焼き直しで行けたので、詳しい説明は省きます。

認証は「サービスアカウント」と呼ばれるメールアドレスのようなもので行います。

[SheetsAPIについての「Google API を使うための認証情報」を参照](https://qiita.com/azasaz/items/051f2cc1646fe13a8710#google-api-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1)してください。

「サービスアカウント」を設定すると、秘密鍵のJSONファイルがダウンロードされます。
じぇいすん。**そういえば今日は13日の金曜日**でした。

続いて、[「サービスアカウントで認証を行う」](https://qiita.com/azasaz/items/051f2cc1646fe13a8710#google-api-%E3%82%92%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%81%AE%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1)に沿って認証を行います。

この際に注意しなければならないのが、**scope**です。

scopeは「私このAPI使いますんで！」って宣言になるもの。
SheetsAPIでは「https://www.googleapis.com/auth/spreadsheets」という
SheetsAPIのためのscopeを指定しています。

今回使うのはAnalyticsのAPIなので、そのように指定してやる必要があります。

```
//認証のペイロード
$_payload = [
    "iss" => $_jsonauth["client_email"], //認証のclient_email
    "scope" => "https://www.googleapis.com/auth/analytics.readonly", //Analytics用のscope
    "aud" => $_jsonauth["token_uri"],  //認証のtoken_uri
    "exp" => $_time_end,
    "iat" => $_time,
];
```
Analyticsのscopeは読み取り専用しかないみたいです。まあそりゃそうか。。

処理に問題がなければ、アクセストークンが取れるはず。
これが時間制限付きの認証キーになります。

# ビューIDと期間を渡してAPIデータを取得する

認証さえ取れればこっちのものです。
あとは必要な情報を渡してAPIからデータをいただいちゃいましょう。

アナリティクスのレポートデータは、必ず「ビューID」というID情報があります。
管理画面の「管理」⇒「ビューの設定」で確認ができます。

リクエストを渡すメソッドは、**reports:batchGet**。
渡してやるパラメータは、**ビューIDと期間情報**です。

リクエストとして渡す値はJSONで、入れ子状態がややこしいので注意してください。
仕様は[こちら](https://developers.google.cn/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet?hl=ja)で確認できます。

```
//viewidをstring型に変換
//※PHPだと型の判別が曖昧なんですが、APIに渡すのは明確に文字列型である必要があります
//※数値型だとデータが取れません
$_viewid = strval($_viewid);

//URLを生成 ※バージョンは利用するものを指定してください
$_url = "https://analyticsreporting.googleapis.com/v4/reports:batchGet";

//取得するデータを設定
$input = [
    "reportRequests" => [[
        "viewId" => $_viewid, 
        "dateRanges" => [["startDate" => "2022-03-01" , "endDate" => "2022-03-31"]],
        "dimensions" => [
            ["name" => "ga:date"], 
            ["name" => "ga:pageTitle"], 
            ["name" => "ga:PagePath"]
        ],
        "metrics" => [
            ["expression" => "ga:uniquePageviews"], 
            ["expression" => "ga:avgTimeOnPage"],
            ["expression" => "ga:bounces"],
            ["expression" => "ga:bounceRate"],
        ],
        "pageSize" => "100000",	//MAX
        "filtersExpression" => "ga:pagePath==/",
    ]]
];

//curl START
$_curl = curl_init();

//OPTIONをセット[GET]
curl_setopt_array($_curl, [
    CURLOPT_URL => $_url,
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => json_encode($input),
]);

//curl EXEC(文字列で取得)
$_resp =  curl_exec($_curl);

//エラーハンドリング用
$_errno = curl_errno($_curl);

//curl END
curl_close($_curl);

//エラーハンドリング
if ($_errno !== CURLE_OK) {
    //エラー処理
}

```

データのまとまりを表すのが「ディメンション」（dimensions）
取りたい数字データが「メトリクス」（metrics）です。

上記の例では、**年月日、ページタイトル、ページパスごとに集計された
ページビュー、平均滞在時間、直帰数、直帰率を取得**しています。

ディメンションに関しては、わかりやすくまとめてくださっている方がいるので
そちらを参考にするとわかりやすいです。私も助かりました。
参考：[【最新＆完全版】Google Analytics指標＆ディメンションチートシート](https://www.lifedesignedit.com/google_analytics_metrics_and_dimension_cheat_sheet)

また、フィルター（filtersExpression）は除外条件です。
こちらも書き方がややこしいのですが、まとめてくださっている方のサイトを参考に。
参考：[フィルタを指定して特定のページのPVを Google Analytics から取得する (C#プログラミング)](https://www.ipentec.com/document/csharp-google-analytics-data-export-api-get-pv-use-filter)

# おわりに

鬼門だと思い続けてきたGoogleのAPIも、
慣れてくると「たぶんこうだろ」と推測できるようになるんだから
続けるって大事だなあと思います。

序盤であんなに苦しんだのは無駄ではなかったんだなと。
懐に入れてもらえたら、Googleさんは優しかった。

APIを使いたいと思いながら「どうすれば！？」と困っている人が
少しでも前進する足がかりになれたらいいなと思います。

みなさんがんばりましょう。

Analyticsと一緒にSearch Consoleについても調べたので、
次回はサチコさんAPIについて書きます。