Google Analytics APIをphpで使ってみる

GAのデータとデータベースのデータをかけ合わせて使いたかったので、APIの設定からphpの開発までのメモとして残します。

## やること

- Google Apisにプロジェクト作成
- Google Apisにアカウント作成
- APIの権限追加
- APIから参照する専用GAアカウント作成
- GA APIのライブラリダウンロード
- phpの開発


## Google Apisにプロジェクト作成

Google Apisにプロジェクト作成から行います。
https://console.developers.google.com/

初めての方はまだプロジェクトを作成したことが無いと思いますので、以下の画面が表示されますので、画面右にある「プロジェクトを作成」ボタンをクリックします。
![スクリーンショット 2018-08-31 11.02.57.png](https://qiita-image-store.s3.amazonaws.com/0/261561/74d36804-e900-be31-5c0a-18e0bd473ba3.png)

ポップアップが表示されますので、そのまま「作成」ボタンをクリックします。
![スクリーンショット 2018-08-31 11.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/261561/6893d507-d609-2d2d-0994-a183636dddfd.png)

プロジェクトの作成画面が表示されますので、任意のプロジェクト名を入力します。（とりあえず「test project」と入力しました。）
プロジェクト名を入力したら「作成」ボタンをクリックするとローディングの後、プロジェクトが作成されます。
![スクリーンショット 2018-08-31 11.04.15.png](https://qiita-image-store.s3.amazonaws.com/0/261561/fba02756-9f3b-1128-bb16-3cab3be1ba54.png)

これでGoogle Apisにプロジェクトが作成されました。
次にアカウント作成を行います。

## Google Apisにアカウント作成

プロジェクトを作成したら次にApisにアカウントを作成します。
左メニューの「認証情報」をクリックすると、下の画像のようにポップアップが表示されますので「認証情報を追加」ボタンをクリックすると認証パターンがいくつか出てきます。
今回必要になるのは「サービスアカウントキー」なので、それをクリックします。
![スクリーンショット 2018-08-31 11.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/261561/6ee51c75-5d5a-372d-f083-bd457a293ea2.png)

サービスアカウントキーの作成画面に遷移したら、まずサービスアカウントのプルダウンで「新しいサービスアカウント」だけあるので選択します。
![スクリーンショット 2018-08-31 11.07.21.png](https://qiita-image-store.s3.amazonaws.com/0/261561/55def15f-ad95-c64e-8532-7e6d9d4746b1.png)

「新しいサービスアカウント」を選択すると、サービスアカウント名、役割、サービスアカウントIDが表示されます。
ここで作成されるアカウントは、データ抽出したいGAに対して作成するアカウント情報となります。
サービスアカウント名には何のアカウントなのか分かる名前を入力します。
（ここでは「test project」としています。）

役割ですが特別な権限は不要なので、プルダウン内から「Project > 閲覧者」を選択します。
キーのタイプは「json」が選択されていますが、このままで良いです。

一通り設定したら「作成」ボタンをクリックします。
![スクリーンショット 2018-08-31 11.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/261561/424e965f-0bfc-c20a-57ac-e307a4b618fa.png)

作成が完了したら、ポップアップで下記画面が表示されると同時に、認証キーがjsonファイルでダウンロードされます。
![スクリーンショット 2018-08-31 11.08.13.png](https://qiita-image-store.s3.amazonaws.com/0/261561/3ac257fc-639b-b914-1300-60ccdb3a13a2.png)

<font color="Red"><b>【注意】</b>
認証キーとなるjsonファイルはこの場でしかダウンロードされないため、失くしてしまった場合は再度サービスアカウントキーの発行を行う必要があります。</font>

jsonファイルは以下のようなものになっています。
![スクリーンショット 2018-08-31 11.09.27.png](https://qiita-image-store.s3.amazonaws.com/0/261561/a980f05e-bada-f5f8-0902-4fe57b289715.png)

次に実際使用するAPIの権限追加を行います。

## APIの権限追加

プロジェクト作成が完了したら最初の画面に戻りますが、メッセージにも書いてある通りで、今使えるAPIがない状態です。
次にAPIを有効にしてみますので、画面左メニューの「ライブラリ」をクリックします。
![スクリーンショット 2018-08-31 11.04.47.png](https://qiita-image-store.s3.amazonaws.com/0/261561/c4009890-1c8b-d249-f2c2-c0b5fbceced0.png)

ライブラリ画面ではGoogleで使うことができるAPIのリストがたくさん表示されています。
今回の目的は、Google Analytics APIを使うことなので、検索窓に「Analytics API」と入力すると、下記画面のように候補が表示されます。
ここでは左上の「Analytics API」をクリックします。
![スクリーンショット 2018-08-31 11.05.11.png](https://qiita-image-store.s3.amazonaws.com/0/261561/098cd2d0-de65-42da-a782-2eda49a2785a.png)

「Analytics API」の詳細画面が表示されますので「有効にする」ボタンをクリックします。
ローディングが走り、「Analytics API」が使えるようになります。
![スクリーンショット 2018-08-31 11.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/261561/c9271b5b-2194-f85a-e2db-492b6df7a527.png)

APIが使えるようになったら最初に戻りますが、表示がガラッと変って、使えるようになったAPIのリストと、使用したAPIのトラフィック情報等が表示されます。
![スクリーンショット 2018-08-31 11.05.44.png](https://qiita-image-store.s3.amazonaws.com/0/261561/b7a6ea0c-2d37-8846-05dd-4e001372e8be.png)

これでApisでの設定が一通り完了となります。
次にデータ取得したいGAにアカウントを作成します。

## APIから参照する専用GAアカウント作成

GAからデータを取得するには、API実行するユーザーをGAに登録しておく必要があります。
![スクリーンショット 2018-08-31 11.09.27.png](https://qiita-image-store.s3.amazonaws.com/0/261561/2180a7d4-46d8-3c18-bd93-c61624e79a50.png)

GAにログイン後、設定のビューにある「ユーザー管理者」をクリックします。
![スクリーンショット 2018-08-31 15.37.00.png](https://qiita-image-store.s3.amazonaws.com/0/261561/d5c0ad11-c1ec-7541-09d3-c9e75fdb76a9.png)

作成するユーザーは、先に作成したサービスアカウントのjsonファイル内の「client_email」のアドレスを、メールアドレスに入力します。
権限は「表示と分析」にします。（閲覧ができれば問題ない）
設定できたら右上の「追加」ボタンをクリックすると作成ができます。
![スクリーンショット 2018-08-31 15.37.40.png](https://qiita-image-store.s3.amazonaws.com/0/261561/a86cd6e6-8f74-a372-2bd0-73432d7046ce.png)

これでGAアカウント追加が完了となります。

## GA APIのライブラリダウンロード

以下コマンドでライブラリをダウンロードできます。
作業スペースに移動してコマンドを実行してください。

```
composer require google/apiclient:^2.0
```

ダウンロードしたらvenderというディレクトリが作成されます。
phpの処理でvendor/autoload.phpをincludeします。

なお、サンプルソースは以下公式にも記載があります。
https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-php?hl=ja

## phpの開発

サンプルソースを参考に一部使いやすいように改変。

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

$records = [];
$analytics = initializeAnalytics();
$profileId = getFirstProfileId($analytics);
do {
    unset($rows);
    $rows = [];
    $results = getResults($analytics, $profileId, $count);
    if (count($results->getRows()) > 0) {
        $rows = array_merge($records, $results->getRows());
    }
    $count++;
}
while (!empty($rows));

function initializeAnalytics() {
  $KEY_FILE_LOCATION = "{ここに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_AnalyticsReporting($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, $count = 0) {
    $startIndex = ($count > 0) ? ($count * 10000) + 1 : 1;
    $res = $analytics->data_ga->get(
        'ga:' . $profileId,
        '7daysAgo',
        'today',
        'ga:users,ga:pageviews,ga:sessions',
        [
            'dimensions' => 'ga:date,ga:pagePath',
            'sort' => 'ga:date',
            'max-results' => 10000,
            'start-index' => $startIndex
        ]
    );
    return $res;
}

```

サンプルソースでは、7日前〜今日までの「ユーザー」「ページビュー数」「セッション」「日付」「ページ」を、日付昇順で取得する指定をしています。

MetricsやDimentionの値は以下マニュアルを参考にしてください。
https://developers.google.com/analytics/devguides/reporting/core/dimsmets

##### APIの実行回数について

> プロジェクトあたり 1日 50,000 件のリクエスト
> IP アドレスごとに、1秒あたりのクエリ数（QPS）は 10件まで。
> 1日あたりの割り当ては、太平洋標準時の午前0時に更新されます。

詳しくは以下公式をご確認ください。
https://developers.google.com/analytics/devguides/reporting/core/v3/limits-quotas?hl=ja