AdMobの売上データをデータベース連携する 

こんにちは。Link-U入社２年目のたくやんです。
今年１年何をやったかなぁと思い返すと、そういやAdMobの売上データを取得するのにそこそこ苦労したなぁと思い、
備忘録も兼ねて書き残したいと思います。

##AdMobとは
>AdMob - Wikipedia
>https://en.wikipedia.org/wiki/AdMob

Googleが提供するアプリ内広告です。審査が厳し目とかいう噂を聞いたり聞かなかったり。


##前準備

#### credentials.jsonの取得

https://console.developers.google.com/apis/credentials
から認証情報を登録すると、credentials_jsonファイルをダウンロードすることができる。


#### oauth2のインストール

```
curl https://storage.googleapis.com/oauth2l/latest/linux_amd64.tgz | tar zx -C /usr/local/bin --strip-components 1
cp credentials.json /var/www/google_oauth/credentials.json
```

#### AdMobのパブリッシャーIDを確認する

https://admob.googleapis.com/v1/accounts
から確認できます

>参考
>https://support.google.com/admob/answer/2784578?hl=ja


##売上データの取得

まずは先程導入したoauth2を使用し、headerを取得します。

```
$header = system("/usr/local/bin/oauth2l header --json /var/www/google_oauth/credentials.json https://www.googleapis.com/auth/admob.report --refresh);
if ($header === false) {
    throw new \Exception('ヘッダの取得に失敗しました');
}
```


※初めてアクセスする場合はurlからverification codeを取得し、入力する必要があります。

```
Go to the following link in your browser:

   https://accounts.google.com/o/oauth2/auth?hogehoge

Enter verification code: 
```


headerを取得できたら、APIを叩いてレポートを取得します。
レポートで取得できるパラメータについて詳しくは
https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.networkReport/generate?hl=ja
を参照。フィルタにも対応しています。

```
$headers = ["Content-Type: application/json", $header];
$start = "YYYY-mm-dd"; //広告の取得対象となる日時の左端
$end = "YYYY-mm-dd"; //広告の取得対象となる日時の右端
$publisher_id = "hogehoge"; //前準備で取得したpublisherIdを記入

$s = explode('-', $start);
$e = explode('-', $end);

$post_data = json_encode(["report_spec" => [
    "date_range" => [
        "start_date" => ["year" => (int)$s[0], "month" => (int)$s[1], "day" => (int)$s[2]],
        "end_date" => ["year" => (int)$e[0], "month" => (int)$e[1], "day" => (int)$e[2]],
    ], // 取得対象とする日時を指定
    "dimensions" => [
        "DATE", //日時
        "APP", // アプリ名
        "AD_UNIT", // 広告の表示箇所
        "PLATFORM", // プラットフォーム名
    ],
    "metrics" => [
        "CLICKS", // 広告のクリック数
        "IMPRESSIONS", // 広告の表示回数
        "ESTIMATED_EARNINGS" // 広告収益(※単位は100万分の1円)
    ],
    "localization_settings" => [
        "currency_code" => "JPY",
        "language_code" => "ja-JP",
    ],
]]);

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_URL => "https://admob.googleapis.com/v1/accounts/{$publisher_id}/networkReport:generate",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $post_data,
]);
$json_data = curl_exec($ch);
$error_no = curl_errno($ch);
if ($error_no !== CURLE_OK) {
    throw new Exception(get_class($this) . 'レポート取得失敗');
}
```

##売上データの展開

得られたjsonデータから、
https://developers.google.com/admob/api/v1/reference/rest/v1/accounts.networkReport/generate?hl=ja
を参照しながら展開し、パラメータを取得します。

```
$data = json_decode($json_data, true);
if (!$data) {
    throw new Exception(get_class($this) . 'レポート取得失敗');
}

if (array_key_exists('error', $data[0])) {
    $err_code = $data[0]['error']['code'];
    $err_message = $data[0]['error']['message'];
    throw new Exception(get_class($this) . "レポート取得失敗(認証エラー) エラーコード: {$err_code} エラー内容: {$err_message}");
}

foreach ($data as $r) {
    if (!isset($r['row'])) {
    continue; // header, footerをスキップ
    }
    $value = $r['row'];
    $d = str_split($value['dimensionValues']['DATE']['value'], 2);
    $report = new Report(); // データベースに連携するために一旦インスタンス化する。クラス内部のコードは省略。
    $report->date = $d[0] . $d[1] . '-' . $d[2] . '-' . $d[3]; // 日時
    $report->app_name = (string)$value['dimensionValues']['APP']['value']; // アプリ名
    $report->location_name = (string)$value['dimensionValues']['AD_UNIT']['displayLabel']; // 広告の表示箇所
    $report->platform = (string)$value['dimensionValues']['PLATFORM']['value']; // プラットフォーム名
    $report->sales = (int)($value['metricValues']['ESTIMATED_EARNINGS']['microsValue'] / 10 ** 6); // 広告収益(円)
    $report->impression = (int)$value['metricValues']['IMPRESSIONS']['integerValue']; // 広告の表示回数
    $report->click = (int)$value['metricValues']['CLICK']['integerValue']; // 広告のクリック数
    $result[] = $report;
}
```

最後に`$result`をデータベースに挿入するコードも書いて、crontab等で定期的にコードを実行してやることでデータベースとの連携は完成です。

##参照

[公式ドキュメント](https://developers.google.com/admob/api/v1/getting-started?hl=ja)
[AdMob](https://admob.google.com/intl/ja/home/)