AdSense Management API を使って PHP で収益レポートのデータを取得する方法(データ取得編)

AdSense Management API

AdSense Management API を使って PHP で収益レポートのデータを取得する方法(事前準備編)」の続きです。

PHPでgoogle/apiclientを使用し、実際に収益レポートのデータを取得します。実際にデータ取得を行ったサンプルコードも記載しています。

データの取得イメージ

Reports: generateAPI を使用し、当日分の収益・ページビュー・広告リクエスト・カバレッジ・クリック数・CTR・CPC・RPMを取得しました。

取得イメージは以下のとおりです。尚、実際の値を公開すると AdSense の規約違反になると思われるため、数字はすべてダミーです。
AdSense Management API 収益データをJSONで表示(値はダミー)

必要なもの

「クライアントIDの認証情報」と「承認済みのリダイレクトURI」は「AdSense Management API を使って PHP で収益レポートのデータを取得する方法(事前準備編)」で用意したものです。

  • PHP 5.4 以上が実行可能な環境(google-api-php-client の Requirements)
  • クライアントIDの認証情報
  • 承認済みのリダイレクトURI

ライブラリgoogle-api-php-clientおよび依存関係のインストールのため、composerも使用できる環境だとベターです。

参考になるドキュメント・ソースコード

APIドキュメントやサンプルコードなどが参考になりました。また公開されているサンプルが少ない都合上、テスト用ソースコードやライブラリの 1.0 から 2.0 へのアップグレードガイドも非常に役立ちました。

Google APIs Client Library for PHPのインストール

本題のはじまりです。今回はcomposerを使用しました。composer.jsonに下記の内容を記載します。

{
    "require": {
        "google/apiclient": "^2.0"
    }
}

composer installでライブラリをインストールします。

認証情報の準備

AdSense Management API を使って PHP で収益レポートのデータを取得する方法(事前準備編)」で用意したクライアントIDの認証情報jsonファイルを用意します。

ダウンロードされたjsonファイルはclient_secret_123456789012-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com.jsonのような名称になっています。後に PHP コードから指定する形になるため、ファイル名はそのままでも、変更してもどちらでもOKです。

プログラムの準備

1.0 と 2.0 における変更点を修正

PHPのソースコードは「サンプルとライブラリ | AdSense Management API | Google Developers」にサンプルへのリンクがあります。

しかしこのサンプルコードはphp-clientlib-1.xでの内容なのでgoogle/apiclient 2.0ではそのまま使うことができません。

1.0 のサンプルをベースにしつつ、 1.0 から 2.0 へのアップグレードガイドを参考に変更点を修正します。主な変更点として以下があります。

  • ライブラリをvendor/autoload.phpで読み込む
  • OAuth認証後のアクセストークンが JSON 文字列ではなく Array で返される

それぞれ 1.0 のサンプルを以下のように変更します。

ライブラリを vendor/autoload.php で読み込む

変更前

require_once 'Google/Client.php';
require_once 'Google/Service/AdSense.php';

変更後

require_once 'vendor/autoload.php';

OAuth認証後のアクセストークンが JSON 文字列ではなく Array で返される

変更前

file_put_contents(TOKEN_FILENAME, $_SESSION['access_token']);

変更後

file_put_contents(TOKEN_FILENAME, json_encode($_SESSION['access_token']));

またメソッドの呼び出し方も 1.0 のサンプルとは異なるため、テストコードを参考に変更します。

認証情報の指定と STORE_ON_DISK の設定変更

認証情報のjsonファイルは$client->setAuthConfig('client_secret.json');の形式で指定します。

また、OAuth 認証後に取得したアクセストークンをディスクに保存するため、define('STORE_ON_DISK', true, true);を指定します。

一度 OAuth 認証を行った後は、ディスクに保存されたアクセストークンを参照して引き続き認証することができます。

コード例

今回は自分用にレポートが取得できれば良い前提で作ったため、例外処理など実施しておりません。

きれいとは言えないソースコードですが、下記が実際に収益レポートのデータを取得するサンプルです。

<?php
// include your composer dependencies
require_once 'vendor/autoload.php';

define('STORE_ON_DISK', true, true);
define('TOKEN_FILENAME', 'tokens.dat', true);

// Set up authentication.
$client = new Google_Client();
$client->addScope('https://www.googleapis.com/auth/adsense.readonly');
$client->setAccessType('offline');
$client->setAuthConfig('client_secret.json');
$client->setApplicationName('Client_Library_Examples');
$service = new Google_Service_AdSense($client);

if (isset($_REQUEST['logout'])) {
	unset($_SESSION['access_token']);
}

$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$client->setRedirectUri($redirect_uri);

// If we have a code back from the OAuth 2.0 flow, we need to exchange that
// with the authenticate() function. We store the resultant access token
// bundle in the session (and disk, if enabled), and redirect to this page.
if (isset($_GET['code'])) {
	$client->authenticate($_GET['code']);

	// Note that "getAccessToken" actually retrieves both the access and refresh
	// tokens, assuming both are available.

	$_SESSION['access_token'] = $client->getAccessToken();
	if (STORE_ON_DISK) {
		file_put_contents(TOKEN_FILENAME, json_encode($_SESSION['access_token']));
	}

	$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
	header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
	exit;
}

// If we have an access token, we can make requests, else we generate an
// authentication URL.
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
	$client->setAccessToken($_SESSION['access_token']);
}
elseif (STORE_ON_DISK && file_exists(TOKEN_FILENAME) && filesize(TOKEN_FILENAME) > 0) {

	// Note that "setAccessToken" actually sets both the access and refresh token,
	// assuming both were saved.

	$client->setAccessToken(file_get_contents(TOKEN_FILENAME));
	$_SESSION['access_token'] = $client->getAccessToken();
}
else {

	// If we're doing disk storage, generate a URL that forces user approval.
	// This is the only way to guarantee we get back a refresh token.

	if (STORE_ON_DISK) {
		$client->setApprovalPrompt('force');
	}

	$authUrl = $client->createAuthUrl();
}

if (isset($authUrl)) {
	echo '<a class="login" href="' . $authUrl . '">Connect Me!</a>';
}
else {
	// echo '<a class="logout" href="?logout">Logout</a>';
};


if ($client->getAccessToken()) {

	$accounts = $service->accounts->listAccounts();
	$metric = array(
		'PAGE_VIEWS',
		'AD_REQUESTS',
		'AD_REQUESTS_COVERAGE',
		'CLICKS',
		'AD_REQUESTS_CTR',
		'COST_PER_CLICK',
		'AD_REQUESTS_RPM',
		'EARNINGS',
	);
	$earningsReport = generateEarningsReport($service, $accounts['items'][0]['id'], 'today', 'today', $metric);

	array_shift($earningsReport); //first element of earningsReport is date. delete it
	$earningsResult = [];
	foreach(array_map(null, $metric, $earningsReport) as [$key, $val]) {
		if ($key == 'AD_REQUESTS_COVERAGE' || $key == 'AD_REQUESTS_CTR') {
			$val = (string)round((double)$val * 100, 2) . '%';
		}

		$earningsResult[$key] = $val;
	}

	header('content-type: application/json; charset=utf-8');
	echo json_encode($earningsResult);
	$_SESSION['access_token'] = $client->getAccessToken();
}

function generateEarningsReport($service, $accountId, $startDate, $endDate, $metric)
{
	$optParams = array(
		'metric' => $metric,
		'dimension' => 'DATE',
		'sort' => '+DATE',
		'useTimezoneReporting' => true,
	);
	$report = $service->accounts_reports->generate($accountId, $startDate, $endDate, $optParams);
	return $report['rows'][0];
}

初回 OAuth 認証

初回はブラウザで OAuth 認証が必要です。

アクセストークンがディスクに保存されていない状態で初回アクセスすると「Connect Me!」のリンクが出るのでクリックします。
AdSense Management API 認証URLへの遷移

認証用の画面に遷移します。AdSense データを参照可能なアカウントを選択し、アプリケーションを許可します。
AdSense Management API アプリケーションを許可

認証が完了すると承認済みのリダイレクトURIにリダイレクトされます。認証後はアクセストークンがある場合の分岐if ($client->getAccessToken())に入り、AdSenseレポートデータが表示されます。
AdSense Management API 収益データをJSONで表示(値はダミー)

tokens.datに、取得したアクセストークンが保存されています。
AdSense Management API アクセストークンのディスクへの保存

$client->setAccessType("offline");でオフラインアクセスを指定しているため、アクセストークンが期限切れになってもリフレッシュトークンで新しいアクセストークンを取得可能です。

このあたりはドキュメントの下記部分が参考になりました。

Access tokens periodically expire. You can refresh an access token without prompting the user for permission (including when the user is not present) if you requested offline access to the scopes associated with the token.

おわりに

OAuth部分の理解に少し時間がかかりました。

しかし、今までは画面やアプリで逐一確認していた収益が簡単に自動化して可視化できるようになり、とても便利になりました。