INDEXING TODAY

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

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