PHPでSearch Console API (Webmaster Tools API)を叩く

新しくウェブサイトを作るたびにSearch Consoleでhttp/httpsとwwwあり/wwwなしのURLを登録するのが面倒になってきたので、APIを叩いて一気にできないものかと思ってSearch Console APIを使ってみることにしました。ということでGoogle APIs Client Library for PHPを使ってSearch Console APIを叩く手順をまとめました。

Google APIsで認証情報の作成

Googleが提供するAPIを利用する最初の手順として必須な認証情報の作成をします。手順は以下の通りです:

  • Google APIsに飛んで、左上のロゴの右にある「Project」から「プロジェクト作成」をクリックして新しいプロジェクトを作成
  • サイドメニューの「ライブラリ」を選んで検索窓に「Search Console API」と入力して「Google Search Console API」を選択
  • 「有効にする」をクリックして、切り替わった画面で「認証情報に進む」をクリック
  • APIを呼び出す場所を「ウェブサーバ」、アクセスするデータの種類で「ユーザデータ」を選択して「必要な認証情報」をクリック
  • 「OAuth 2.0 クライアント ID を作成する」で名前を適当に入れて、「承認済みのJavaScript生成元」にはhttp://localhost:8000、「承認済みのリダイレクトURI」にはhttp://localhost:8000/oauth2callback.phpと入力して、「クライアントIDの作成」をクリック
  • 「OAuth 2.0 同意画面を設定する」での「ユーザーに表示するサービス名」を適当に入力して「次へ」をクリック
  • 「認証情報をダウンロードする」の「ダウンロード」をクリックしてJSONファイルをダウンロードしたら、「完了」をクリック

これで認証情報の入ったJSONファイルが手に入ります。これを適当なディレクトリに入れておきましょう。

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

JSONファイルを入れたディレクトリに移動してcomposer requireしてください。そもそもcomposerが入っていない人はググってください。

composer require google/apiclient:^2.0

vendor以下に色々とインストールされます。この中でSearch Console APIを使う場合にみるべき場所は

vendor/google/apiclient-services/src/Google/Service/Webmasters.php
vendor/google/apiclient-services/src/Google/Service/Webmasters/Resource/*

です。Resourceディレクトリ内のファイルには利用可能なメソッドが定義されているので、公式リファレンスと一緒に見ていくとおよそやりたいことができるようになります。

index.phpとoauth2callback.phpを用意

vendorと同階層にindex.phpとoauth2callback.phpを用意します。まずはindex.phpから。

<?php
require_once __DIR__.'/vendor/autoload.php';
 
session_start();
 
$client = new Google_Client();
// 認証情報の読み込み
$client->setAuthConfig('client_id.json');
// スコープの設定
$client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY);
 
// アクセストークンが未取得、もしくはアクセストークンの有効期限を過ぎていたらoauth2callback.phpへリダイレクト
if (isset($_SESSION['access_token']) && $_SESSION['access_token']):
    $client->setAccessToken($_SESSION['access_token']);
    if ($client->isAccessTokenExpired()):
        redirectToCallback();
    endif;
else:
    redirectToCallback();
endif;
 
// Google_Service_Webmastersを呼び出してSearch Consoleに登録済みのサイトをリストする
$service = new Google_Service_Webmasters($client);
foreach($service->sites->listSites() as $site):
    echo '<h2>'.$site->siteUrl.'</h2>';
    echo ''.$site->permissionLevel.'</p>';
endforeach;
 
function redirectToCallback()
{
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
    exit();
}

簡単に説明も加えてあります。次にoauth2callback.phpはこんな感じ。

<?php
require_once __DIR__.'/vendor/autoload.php';
 
session_start();
 
$client = new Google_Client();
$client->setAuthConfigFile('client_id.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Webmasters::WEBMASTERS_READONLY);
 
// 認可コードが未取得ならGoogleの認証画面を表示
if (! isset($_GET['code'])) {
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
// 認証コードが未取得の場合、認証画面から認可コード付きでリダイレクトされてくるので認可コードを取得してアクセストークンを取得、その後index.phpへリダイレクト
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

ソースコードにもコメントしていますが、流れとしては

  1. index.phpで認証情報をセットしてoauth2callback.phpへリダイレクト
  2. Googleの認証画面を表示
  3. 認証されるとoauth2callback.phpへ認可コードとともにリダイレクトされてくる
  4. 認可コードを元にアクセストークンを取得してindex.phpへリダイレクト
  5. 取得したアクセストークンを元にSearch Console APIを呼び出す

になっています。ここでは簡単のため認証情報を破棄するコードを書いていませんが、実際にウェブサービスに組み込む場合はもっと色々必要になります。

ローカルホストにアクセスして結果を表示

php -S localhost:8000 -t ./

でローカルホストを起動してhttp://localhost:8000へアクセスすると、認証画面が表示されて、認証後にSearch Consoleに登録されているサイト一覧が表示されます。

利用制限

Search Console APIは利用制限が設けられています。Search Analytics(検索アナリティクス)リソースについては

  • 1サイトあたりに5クエリ/秒、200クエリ/分
  • 1ユーザに5クエリ/秒、200クエリ/分
  • プロジェクトあたり100,000,000クエリ/日

その他のリソースについては

  • 1ユーザに20クエリ/秒、200クエリ/分
  • プロジェクトあたり100,000,000クエリ/日

となっています。