INDEXING TODAY

Googleのインデックスにお困りなら

Google Indexing APIを『まとめて』実行するプログラムのサンプル(PHP)

Indexing Todayを作るにあたってGoogleのIndexing APIのbatch実行の勉強したので、サンプルプログラムを残します。

はじめに

前回に引き続き、PHPでサンプル実装をします。

今回はバッチ実行という方法です。
前回は、URL1件ごとにAPIを実行するプログラムでした。前回のプログラム(高速化の工夫をしていない)状態で、1秒あたり3件~4件(1分あたり200件程度)の送信が可能です。

件数が少ないうちは1件ずつ送る方法で問題はありませんが、URLの総数が多いときには時間がかかってしまいます。

バッチ実行とは

1件1件丁寧に送ると時間がかかるのですが、これを高速化する方法がバッチ実行です。バッチ実行をすると最大100個のURLを1回の送信で実行できます。

ただし、バッチ実行をしても1日あたりのURL送信数の上限は変わりません。DefaultPublishRequestsPerDayPerProject の値で定義されていますが、batch実行でも送ったURLの数で数えます。つまりbatchでもシングルでも同じく200までということになります。

インストール

インストール先は前回と同じく以下のディレクトリに置きます。

C:\tmp\indexing-api-sample

前回の記事も参考にしてください。 blog.indexing.today

ソースコード

PHPのサンプルコードです。 エラー処理など手抜きしてあります。コメントが入っているので参考にご自身で作り変えてください。

<?php
require_once './vendor/autoload.php';

//https://developers.google.com/search/apis/indexing-api/v3/quota-pricing
//TODO:DefaultRequestsPerMinutePerProject=600 を超えないように実行速度を調整すること
//TODO:DefaultPublishRequestsPerDayPerProject=200 を超えたときのハンドリングをすること

// 1回の実行URL
const BATCH_SIZE = 100;

//認証用のファイル(jsonフォルダの下に置いて書き換える)
$credentialFile = './json/your-credeintial.json';

//indexing APIを投げるURL(自分のURLに書き換える)
$urlList = ['https://example.com/','https://example.com/1','https://example.com/2'];

// HTTPクライアント
// debug=trueにすると通信ログが確認できる。
$options = ['http_errors' => false, 'debug' => false, 'verify'=>false, ];
$guzzle = new GuzzleHttp\Client($options);

//Indexing APIの準備
$client = new Google_Client();
$client->addScope(Google_Service_Indexing::INDEXING);
$client->setHttpClient($guzzle);
$client->setAuthConfig($credentialFile);
$client->authorize();
$client->setUseBatch(true);

$service = new Google_Service_Indexing($client);

//URLの配列を1回のAPI送信量に分割(最大100)
$chunks = array_chunk($urlList, BATCH_SIZE);

foreach($chunks as $batchNo=>$batchUrls){

    //batchのインスタンスはURLのセットごとに作る
    //第二引数はboundaryの値。変える必要性はないのでfalseでよい
    // $batch = new Google_Http_Batch($client,false,'https://indexing.googleapis.com'); と同じ
    $batch = new Google_Http_Batch($client, false, $service->rootUrl);

    foreach($batchUrls as $n=>$url){
        $param = new Google_Service_Indexing_UrlNotification();
        $param->setType('URL_UPDATED');//登録・更新
        $param->setUrl($url);

        //setUseBatch(true)にしてあると、ここでリクエストが送られずrequestインスタンスが返ってくるのでbatchにaddする
        $request = $service->urlNotifications->publish($param);

        //第二引数のキーはresultsのキーになる(渡さなくてもOK)
        $batch->add($request, "api-{$batchNo}-{$n}");
    }

    //addしたリクエストを実行。batchをexecuteすると、結果が複数返ってくる
    $results = $batch->execute();

    foreach($results as $key=>$result){
        
        // 正常なら Google\Service\Indexing\UrlNotification
        // エラーなら Google\Service\Exception
        // クラスに違いがあるので注意
        echo "$key : " . get_class($result) .PHP_EOL;

        //batch実行でエラーが起きると、resultの中身がExceptionクラスになるので、エラーを見極めるにはinstanceofで実施 
        if($result instanceof Exception){
            echo "error code | {$result->getCode()}" . PHP_EOL;
            echo "resson | {$result->getErrors()[0]['reason']}" . PHP_EOL;
            echo "message | {$result->getErrors()[0]['message']}" .PHP_EOL;
            if($result->getCode()==429){
                //実行回数上限を超えたときは、ここでとらえる
            }
            break;
        }else{
            //resultsの中のresultから、notificationを取り出す
            $notification = $result->getUrlNotificationMetadata()->getLatestUpdate();
            //大したものはとれないけど、取るならこの形
            var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getUrl());
            var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getNotifyTime());
            var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getType());

            echo "$key | {$notification->getUrl()} | {$notification->getNotifyTime()}" . PHP_EOL;
        }
        
    }
}

ここからダウンロードもできます
https://github.com/kanaxx/indexing-api-sample/blob/main/batch_execution.php

修正するところ2つ

サンプルのプログラムは一部、環境ごとに変わる部分があるので編集します。

batch_execute.phpファイルを開き、2か所編集します。

//認証用のファイル(jsonフォルダの下に置いて書き換える)
$credentialFile = './json/your-credeintial.json';

//indexing APIを投げるURL(自分のURLに書き換える)
$urlList = ['https://example.com/','https://example.com/1','https://example.com/2'];
  • 12行目:GoogleのAPIの認証ファイル(JSON)のファイル名と一致するように書き換えます
  • 15行目:APIに投げ込むURLを自分用に書き換えます。配列形式で複数並べられます。

修正点はここだけです。

実行

準備ができたので実行します。以下のコマンドを実行すると動きます。

$ cd C:\tmp\indexing-api-sample
$ php batch_execution.php

たらたらとログが出てきて終了します。

実際に自分のAPIが実行できたのかは、GoogleのAPI Consoleの画面で確認できます。「現在の使用量」が増えていればOKです。(少し遅れてきます)

https://console.cloud.google.com/apis/api/indexing.googleapis.com/quotas

最後にまだわかってないこと

Indexing APIの制限事項の1つである DefaultRequestsPerMinutePerProject  がどうやって集計されるのか理解できていないです。 これは1分間に送れるリクエストの数の上限で、デフォルトで600件です。1バッチリクエストを1回と数えると思うので、1分間で600リクエストx100URLで6万まで行けるのだろうか。

ただ、過去30日の実績を見てもグラフに何も表示されていないので、もしかしたらIndexing APIではリクエスト数はカウントされないのかもしれない。

参考資料

インデックス登録の一括リクエストを送信する
https://developers.google.com/search/apis/indexing-api/v3/using-api#batching

[覚書] Indexing API バッチAPIでやってみる [PHP]
このブログが役に立ちました。
https://blog.tkouen.mydns.jp/wordpress/699