こんにちは。Link-U入社2年目のたくやんです。
今年1年何をやったかなぁと思い返すと、そういや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
から確認できます
##売上データの取得
まずは先程導入した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等で定期的にコードを実行してやることでデータベースとの連携は完成です。
##参照