TRY AND ERROR

気になったこと、勉強したこと、その他雑記など色々メモしていきます。。Sometimes these posts will be written in English.,

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日前くらいのものしか
とれないというのは改善されないのかなあ。。。