PHPでGoogle Search ConsoleのAPI使ってみた
題名の通り、使ってみたのでめもします。。
やったこと
・PHPのサーバアプリでGoogleSearchConsoleの検索アナリティクスのデータを取得。
・google-api-php-clientを利用
・複数アカウントのGoogleSearchConsoleに登録されている全てのURLの
データを取得
・アクセストークンとリフレッシュトークンをサーバに保存
・認証(アプリ使用許可)は初回のみ
スニペット
getData.php(検索アナリティクスデータ取得、表示)
これが実行ファイル。
初回認証画面で保存したアカウント毎にGoogleSearchConsoleのデータを
取得して表示する。
<?php set_include_path(get_include_path() . PATH_SEPARATOR . "/path/to/google-api-php-client/src"); require_once __DIR__ ."/google-api-php-client/src/Google/autoload.php"; require(__DIR__ ."/Auth.php"); //3日前くらいのデータじゃないと反映されていないため $targetDate = date("Y-m-d",strtotime("-3 day")); try { $redirect_uri = "XXXX"; $client = new Google_Client(); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); $client->setClientId('XXXX'); $client->setClientSecret('XXXX'); $client->setApplicationName("XXXX"); $client->setDeveloperKey("XXXX"); //server key $client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY); //権限の許容範囲("webmasters.readonly") $googleUsers = array_filter(scandir(__DIR__ ."/auth"), function($file){ return !in_array($file, array(".", "..", ".json")); }); foreach ($googleUsers as $filename) { $auth = new AuthInfo($filename); $client->setAccessToken($auth->getAccessToken()); //アクセストークンが有効期限切れの場合 if($client->isAccessTokenExpired()) { $NewAccessToken = json_decode($auth->getAccessToken()); //アクセストークンをデコード $client->refreshToken($NewAccessToken->refresh_token); //リフレッシュトークンを使ってアクセストークンの取り直し $auth->saveAccessToken($client->getAccessToken()); //外部ファイルに保存 } //search anaryticsデータ取得 if ($client->getAccessToken()) { getSearchAnalytics($client); } } } catch (Google_Service_Exception $e) { echo "【Google_Service_Exception】”; var_dump($e); } catch (Google_Exception $e) { echo "【Google_Exception】"; var_dump($e); } function getSearchAnalytics($client) { global $targetDate; $service = new Google_Service_Webmasters($client); $searchAnalytics = $service->searchanalytics; $targetSites = $service->sites->listSites()->siteEntry; $analyticsDatas = array(); foreach ($targetSites as $targetSite) { $request = new Google_Service_Webmasters_SearchAnalyticsQueryRequest; $request->setStartDate($targetDate); //yyyy-mm-dd $request->setEndDate($targetDate); //yyyy-mm-dd $request->setDimensions(array("query")); $request->setRowLimit(5000); $q = $searchAnalytics->query($targetSite->siteUrl, $request); $rowData = $q->getRows(); output(getTodaysFile($targetSite->siteUrl), $rowData); } } function output($rowData) { $cnt = 1; //kw,click数、impression数 foreach ($rowData as $row) { echo $cnt ." | " .$row['keys'][0] ." | " .$row['clicks'] ." | " .$row['impressions'] ."<br>"; $cnt++; } } ?>
Auth.php(認証情報クラス)
アクセストークンやリフレッシュトークンなどの認証情報を扱うクラス
<?php class Auth { private $filename; private $accessToken; private $security; public function __construct($fnm) { $this->security = new Security(); $this->accessToken = ""; $this->filename = __DIR__ ."/auth/{$fnm}"; if(file_exists($this->filename)){ $this->accessToken = file_get_contents($this->filename); } } public function saveAccessToken($token) { if(file_exists($this->filename)){ unlink($this->filename); } touch($this->filename); file_put_contents($this->filename, $token); $this->accessToken = $token; } public function getAccessToken() { return $this->accessToken; } }
regist.php(初回認証画面)
初回のアカウント認証(アプリ使用許可)を行うGUI
認証情報をサーバにjsonで保存する。
<?php set_include_path(get_include_path() . PATH_SEPARATOR . "/path/to/google-api-php-client/src"); require_once __DIR__ ."/google-api-php-client/src/Google/autoload.php"; require(__DIR__ ."/Auth.php"); session_start(); try { $users = getUsers(); $redirect_uri = "XXXX"; $client = new Google_Client(); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); $client->setClientId('XXXX'); $client->setClientSecret('XXXX'); $client->setApplicationName("XXXX"); $client->setRedirectUri($redirect_uri); $client->setDeveloperKey("XXXX"); //server key $client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY); //権限の許容範囲("webmasters.readonly") $isAuthenticated = false; if (isset($_POST['userID'])) { //初回認証の場合 $_SESSION['userID'] = $_POST['userID']; header('Location: ' . $client->createAuthUrl()); } else { //アプリ使用許可からリダイレクトされてきた場合、認証コードがリクエストパラメータにセットされている if (isset($_GET['code'])) { $client->authenticate($_GET['code']); //アクセストークンと交換する $auth = new AuthInfo($_SESSION['userID']); $auth->saveAccessToken($client->getAccessToken()); //アクセストークンをファイルに保存 $isAuthenticated = true; unset($_SESSION['userID']); } } } catch (Google_Service_Exception $e) { echo "【Google_Service_Exception】”; var_dump($e); } catch (Google_Exception $e) { echo "【Google_Exception】"; var_dump($e); } function getUsers() { $googleUsers = array_filter(scandir(__DIR__ ."/auth"), function($file){ return !in_array($file, array(".", "..", ".json")); }); return $googleUsers; } ?> <html> <head> </head> <body> <div> <div> <?php if (!$isAuthenticated) { echo "<form id='fm' action='./' method='POST'>"; echo "<input type='text' id='userID' name='userID'>"; echo "<input type='submit' id='btn' value='認証'>"; echo "</form>"; } ?> </div> </div> </body> </html>
↑はスニペットなのでざっくりとしか書いていませんが、
本来は認証情報を可逆暗号化して保存したりデータを日次で取得してCSVに
はきだしたりといったことをやりました。
というか検索アナリティクスのデータは2〜3日前くらいのものしか
とれないというのは改善されないのかなあ。。。