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 google/apiclient:^2.0

でライブラリをインストールしてください。そもそも composer が入っていない人はググってください。

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 '<p>'.$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クエリ/日

となっています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です