INDEXING TODAY

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

Bing Submission APIの上限をアップさせる

BingのSubmission APIのクオータ(上限値)をあげる方法

BingのSubmission APIは、1日で実行できる回数が制限されています。それをアップしてもらう方法を説明します。

クオータの確認方法

ウェブマスターツールの「URL送信」の最下部に、ドメインごとに上限値が表示されています。

おそらく初期値は10です。

Microsoftにリクエストを出してみました。さくっと2000まで増えました。

リクエストを出す方法

ちょっとわかりにくいですが、ここにリンクがあります。

Bing Webmaster Tools

入力フォームが開くので必要事項を入力します。

2:ウェブマスターツールに登録したサイトを選択
3:Bing Web マスターツール関連を選択
3:APIの を選択
4:Still have a questionを右にスイッチ
5:問題の説明に入力

最後に送信ボタンを押して完了です。基本的には英語で入力したほうがよいです。

ダメ元で日本語で入力したら、サポートの担当から「よくわからん」という返事がきました。だめでした。

I have reviewed your query, but I am unable to reproduce the issue. Could you please explain the issue more briefly or with screenshots/screen video for further investigation.
お問い合わせの内容を確認しましたが、問題を再現することができません。詳細な調査のために、問題をより簡単に説明するか、スクリーンショットまたはスクリーンビデオを添付してください。

来たメールに英語で要件を書いて返信をしたら、15分くらいで返信がきて、クオータの数が増えました。

フォームにリクエストを入力してから24時間以内でした。

Bing Submission APIのサンプルをPHPで実装する

GoogleのIndexing APIと同じく、Bing検索にもドメインのコンテンツURLを伝えるAPIがあります。

はじめに

Bing Submission APIとは

Microsoftのやっている検索エンジンのBing 自分のサイトのコンテンツどこにあるのかをBingに伝えるAPIです。

APIを実行するとBingがURLを把握します。把握したからといってもクローラーが来てくれる保証があるわけでもなく、Bingで検索可能になるわけでもありません。この辺はレギュレーションはGoogleのIndexingAPIと同じです

必要な準備

BingのAPIを使う場合、Bing Webmaster ツールのアカウントAPIのキーが必要です。

www.bing.com

Webmasterツールのアカウントを作ったうえで、APIキーを発行する必要があります。

プログラム

Bing APIを実行するプログラムのサンプルです。今回もPHPです。

BingはSDK(専用のライブラリ)が無いので、PHPでHTTPアクセスをするプログラムを書けば実行できます。 PHPのHTTPクライアントであるGuzzleを使っていますが、必須ではありません。純PHPだけで書き換えることはできます。

コード

コメント含みで40行程度です。

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

// 1回の実行URL
const BATCH_SIZE = 2;//500;
const END_POINT_PUBLISH = 'https://ssl.bing.com/webmaster/api.svc/json/SubmitUrlbatch';

// Submission APIのAPIキー
$apiKey = '';
// Submission APIのサイトのドメイン
$siteUrl = 'https://example.com';
// 対象のURL
$urlList = ['https://example.com/','https://example.com/1','https://example.com/2'];

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

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

foreach($chunks as $batchNo=>$batchUrls){
    echo "--- batch no {$batchNo} / size = " . count($batchUrls) .PHP_EOL;

    $parameter = [];
    $parameter["siteUrl"] = $siteUrl;
    // URLの配列をそのままパラメータにセットする
    $parameter["urlList"] = $batchUrls;
    
    // Bing API は post で送信
    $bingApi = END_POINT_PUBLISH . '?' . "apikey=$apiKey";
    $response = $guzzle->post($bingApi, ['json'=>$parameter]);

    $code = $response->getStatusCode();
    $body = $response->getBody()->getContents();

    echo "response code = $code " . PHP_EOL;
    echo "response body = $body " . PHP_EOL;
}

Gitにも置いてあります。
https://github.com/kanaxx/indexing-api-sample/blob/main/bing_batch_execution.php

よくあるエラー

Submission APIを実行すると発生するエラーです。

InvalidApiKey

APIキーが誤っているときに発生します。プログラム側に記載したAPIキーが誤っていないか確認してください。

HTTP/1.1 400 Error

{"ErrorCode":3,"Message":"ERROR!!! InvalidApiKey"}

Quota remaining for today: 1, Submitted: 2

リクエストの1日の上限を超えてしまったときに発生します。

HTTP/1.1 400 Error

 {"ErrorCode":2,"Message":"ERROR!!! Quota remaining for today: 1, Submitted: 2"}

エラーメッセージを読むと、「本日の残りが1、送信したURLが2」という意味ですね。 やれることはないので、カウンターがリセットされるまで待ちましょう。

リクエスト数のリセットのタイミングは、UTCの0時です。日本時間のAM9時です。

関連URL

https://www.bing.com/webmasters/url-submission-api#APIs

https://www.bing.com/webmasters/help/url-submission-62f2860b

https://learn.microsoft.com/en-us/dotnet/api/microsoft.bing.webmaster.api.interfaces.iwebmasterapi.submiturlbatch?view=bing-webmaster-dotnet

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

実績紹介:求人情報をGoogleのインデックスに登録する(ページ数:約30000)

Indexing APIのカスタマイズ開発の実績報告です。

件数が30000件と大量だったため、Indexing Todayのシステムに載せることができずAPI送信部分をカスタマイズして提供しました。

実施内容

サイト種類

求人サイト

JobPosting構造化データ対応済み*1

依頼いただいた背景

  • 求人量が増え、Googleにインデックスされていない情報が増えていて、インデックス数を増やし自社サイトへの流入を増やしたい。
  • Googleのインデックスにリアルタイムに求人情報を掲載させたい。

具体的な作業内容

依頼を受けて実施した作業です。

  • プログラムのカスタマイズ実施
  • 私の動作環境にてInexingAPIの実行の代行(約1週間継続的に実行)

  • 大量データをAPIを実行できるようにプログラムの追加修正

  • お客様サーバーへの設置作業、動作確認
  • 引継ぎ

作業時間

10時間
10月9日に相談を受け、10月20日に引き渡し完了

Indexing Todayのロジックの一部を切り出して再構成したため、開発時間は短くできました。

実施結果

実施前
  • インデックス数:約2000件
  • 検索表示回数:20000回
  • クリック数:60回
実施後 (全件送信を実現後、1週間の結果)
  • インデックス数:約30000件
  • 検索表示回数:37000回
  • クリック数:180回

インデックス数が増え、表示回数が約2倍、クリック数が約3倍になりました。 日々数値が増えているので、今後はもっと増加する可能性があります。

サーチコンソールの結果

お客様からグラフの提供をいただきました。
赤枠の部分がIndexing APIを実行開始した時期です。グラフが急激に右上に向いてます。まだ1週間なので今後に期待です。

コメント

お客様からコメントいただきました

いただいたコメント(そのまま)

他の求人メディアと連携した事により、求人件数が多くなり、またGoogleしごと検索や検索エンジン等に可能な範囲でリアルタイムでのインデックスを促したく依頼することを考えました。
以前はSearch Consoleにサイトマップを読み込ませていたのですが、ページ数が多いからなのかインデックスまでに結構な時間がかかっていた事も依頼した理由でもあります。

あと、イチから開発も検討してみたのですが、Google Indexing APIについて書かれている情報が少なく、実際に開発も出来るのか良くわからない状況だったため、それであればGoogle Indexing APIについて一番詳しく記事を書かれており、なおかつ実際に運用されているKanaxxさんに依頼した方が早いし確実だと思い相談しました。

最初はダメ元で相談したのですが、私のメールを見て詳しくアドバイスまで頂き、アドバイスも具体的で分かりやすかったのですぐに依頼することを決めました。 依頼後もとても丁寧かつ迅速な対応で、とてもスムーズに作業を進めて頂いて、自社で開発した場合と比べるとかなりお得に完了しました。

本当に依頼してよかったです。 ありがとうございます。

お仕事、受け付けております

Googleのインデックス量、反映速度にお悩みの方、IndexingAPIで解決できる可能性があります。Indexing APIの代行、プログラムのカスタマイズなど、ご要望に応じて相談に乗ることはできます。

また、Indexing APIを実行するサンプルコードも公開していますので、ご自身でできる場合はトライしてみてください。プログラム改修のアドバイス、サポートも受け付けております。

Google Indexing APIを実行するプログラムのサンプルを作る(PHP)

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

はじめに

GoogleのIndexing APIを実行可能な形でソースコードを提示します。
いろんな要素を取り除きシンプルにIndexing APIを実行するコードにします。送信するURLを揃えたり、エラーになったときの処理は省いていますので、実際に作るときには周辺を固めるロジックを組み立ててください。

まずは、実績のあるPHPでプログラムです。

https://github.com/kanaxx/indexing-api-sample

使うもの

今回使うのはこれです。

  • PHP8
  • Composer
  • Google API ライブラリ
  • Guzzle(HTTPクライアント)

PHPを使っていれば普通に使っているようなもので、特に珍しいものはないですね。 GuzzleはGoogleのAPIライブラリをインストールすると自動的に入ってくるので、存在を気にしなくてもよいかもです。

PHPのバージョンは8.0.17で試しています。

PHP 8.0.17 (cli) (built: Mar 15 2022 09:57:42) ( ZTS Visual C++ 2019 x64 ) Copyright (c) The PHP Group Zend Engine v4.0.17, Copyright (c) Zend Technologies

インストール先はここにしますが、適当にかえてよいです。

C:\tmp\indexing-api-sample

準備

Composer の確認

Composerが使えるか確認しておきます。インストール方法は省略します。使える状態にしておいてください。

バージョン番号が出ればOKです。

$ composer -V
Composer version 2.4.3 2022-10-14 16:56:41

ソースコードを持ってくる

git が使えれば、gitコマンドで持ってきます

$ cd \
$ mkdir tmp
$ cd  C:\tmp
$ git clone https://github.com/kanaxx/indexing-api-sample.git

gitが使えなければ、zipファイルでダウンロードして C:\tmp\indexing-api-sample になるように展開します。

ライブラリをインストール

$ cd C:\tmp\indexing-api-sample
$ composer update

./composer.json has been created

  - Locking google/apiclient (v2.12.6)
  - Locking google/apiclient-services (v0.271.0)
  - Locking google/auth (v1.23.0)
  - Locking guzzlehttp/guzzle (7.5.0)
  - Locking guzzlehttp/promises (1.5.2)
(省略)

GoogleのクライアントライブラリとGuzzleのライブラリがインストールされます。 カレントディレクトリにvendorフォルダができています。

認証ファイルを置く

インストールしたフォルダにjsonフォルダを作り、その中に自分で作ったAPIの認証ファイルを置きます。ファイル名はそのままでもいいですし、わかりやすいものに変えても大丈夫です。

PHPファイルを編集

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

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

  • 5行目:GoogleのAPIの認証ファイル(JSON)のファイル名と一致するように書き換えます
  • 8行目:APIに投げ込むURLを自分用に書き換えます。配列形式で複数並べられます。

これだけです。

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

//認証用のファイル(jsonフォルダの下に置いて書き換える)
$credentialFile = './json/your_credential.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();

$service = new Google_Service_Indexing($client);

foreach($urlList as $n=>$url){
    $param = new Google_Service_Indexing_UrlNotification();
    $param->setType('URL_UPDATED');//登録・更新
    $param->setUrl($url);
    try{
        $response = $service->urlNotifications->publish($param);
        
        //responseから情報取るならこの形
        // https://developers.google.com/search/apis/indexing-api/v3/reference/indexing/rest/v3/urlNotifications#UrlNotification
        var_dump($response->getUrlNotificationMetadata()->getLatestUpdate());
        var_dump($response->getUrlNotificationMetadata()->getLatestUpdate()->getUrl());
        var_dump($response->getUrlNotificationMetadata()->getLatestUpdate()->getNotifyTime());
        var_dump($response->getUrlNotificationMetadata()->getLatestUpdate()->getType());
    }catch(Exception $e){
        //正常に終わらなかったら
        // var_dump($e);
        echo $e->getCode() . PHP_EOL;
        echo $e->getMessage() . PHP_EOL;
        //Exceptionのエラーメッセージは、JSON文字列になっているので、エラーメッセージだけ抜き出す。
        var_dump(json_decode($e->getMessage(), true)['error']['message']);
        var_dump(json_decode($e->getMessage(), true)['error']['status']);

        //エラーが起きたらループは抜けておく
        break;
    }
}

実行

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

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

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

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

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

上手くいかないとき

よくあるエラーは、認証ファイルの置き場所とプログラムで指定している場所が間違えているときです。置いた場所と読む場所があっているか確認しましょう。

APIの呼び出しができてエラーが起きる場合は、次のページに原因と対策を書いておいたので参考にしてください。

blog.indexing.today

Google Indexing APIでよく発生するエラーと対応方法

GoogleのIndexing APIを使って開発中によく遭遇するエラーの説明と、発生したときの対処方法をまとめておきます。 リクエスト数オーバーはページ数が多いとどうしても発生してしまうので、上手にキャッチする必要があります。

続きを読む