※当ブログではアフィリエイト広告を利用しています。
「AdSense Management API を使って PHP で収益レポートのデータを取得する方法(事前準備編)」の続きです。
PHPでgoogle/apiclient
を使用し、実際に収益レポートのデータを取得します。実際にデータ取得を行ったサンプルコードも記載しています。
データの取得イメージ
Reports: generate
API を使用し、当日分の収益・ページビュー・広告リクエスト・カバレッジ・クリック数・CTR・CPC・RPMを取得しました。
取得イメージは以下のとおりです。尚、実際の値を公開すると AdSense の規約違反になると思われるため、数字はすべてダミーです。
必要なもの
「クライアント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 へのアップグレードガイドも非常に役立ちました。
- スタートガイド | AdSense Management API | Google Developers
- Reports: generate | AdSense Management API | Google Developers
- Using OAuth 2.0 for Web Server Applications | Google Identity Platform | Google Developers
- GitHub – googleapis/google-api-php-client: A PHP client library for accessing Google APIs
- google-api-php-client/UPGRADING.md at master · googleapis/google-api-php-client · GitHub
- googleads-adsense-examples/php-clientlib-1.x/v1.x at master · googleads/googleads-adsense-examples · GitHub ※1.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 データを参照可能なアカウントを選択し、アプリケーションを許可します。
認証が完了すると承認済みのリダイレクトURIにリダイレクトされます。認証後はアクセストークンがある場合の分岐if ($client->getAccessToken())
に入り、AdSenseレポートデータが表示されます。
tokens.dat
に、取得したアクセストークンが保存されています。
$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部分の理解に少し時間がかかりました。
しかし、今までは画面やアプリで逐一確認していた収益が簡単に自動化して可視化できるようになり、とても便利になりました。