1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Link-UAdvent Calendar 2020

Day 21

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

Last updated at Posted at 2020-12-25

こんにちは。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
から確認できます

参考
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等で定期的にコードを実行してやることでデータベースとの連携は完成です。

##参照

公式ドキュメント
AdMob

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?