『7回目の出直し🌻』

好きなことを自分のペースで、のんびり更新

GoogleのIndexing APIを使って、ブログの更新を通知する(2)プログラム作成から実行まで

無いなら作ろうシリーズ 第4弾
サイトマップのURLをIndex APIに投げ込むスクリプトです。前回は、前準備としてGoogleのAPIの設定までやりました。今日は実際のプログラムを作ります。

注意
2024年9月にIndexing APIに変更がありました。使い方を間違えるとスパム扱いするとGoogleのドキュメントに明記されましたのでお気をつけください。この記事はルール変更前に書かれたものです。

Google Indexing APIを実行するとGoogleのクローラーを呼び込むことができ、記事の最新の内容をGoogleのキャッシュに載せやすくすることができます。

使ったもの

プログラム作成に使ったものはこちらです

Windowsでやってます。
バージョンアップが面倒なのでPHPが7.2系で動かしています。もしかしたらPHPの5.x系でも8.x系でも動くかもしれません。

APIを使うときに気を付けること

APIに実行制限があるので、制限内に収まるようにコントロールする必要があります。一応、コード上はなんとなく制限をしています。厳密ではないのでエラーが出ることもありますが、まぁ無防備よりいいレベルです。

DefaultPublishRequestsPerDayPerProject

1日あたりのAPIの実行数は200回

  • バッチ実行あたりで200回にしているので、1日1回しか動かない前提です。
`DefaultRequestsPerMinutePerProject`

1分間あたりのAPIの実行数は60回 600回

  • 1コールあたり2秒スリープして30回/分程度になるようにしています。
  • 間違えてました。1分あたり60回ではなく600回が上限です。1秒あたり10回なので普通にプログラムを作ったら超えないと思います。

参照
https://developers.google.com/search/apis/indexing-api/v3/quota-pricing

プログラムの仕様

こんな感じで作ります

  • サイトマップインデックスのURLを指定する
  • サイトマップインデックスファイルを読み、サイトマップのURLを全部集める
  • サイトマップURLを見に行き、サイトマップ内にあるページのURLを集める
  • 全部集め終わったらlastmodの逆順(更新があった順)に並び替える
  • 新しい順に200個のURLまで、Google Indexing APIを実行する
  • 結果をまとめる

やらなかったこと

以下のことは未実装です。

アーカイブページ(カテゴリページ、日付ごとのページ)の対応

APIに投げ込むURLをサイトマップ(XML)から取り出しているので、サイトマップ(XML)に載ってないものは対象外です。
頑張って改良すれば、できそうではあるがいったん保留。

記事が200以上ある場合のケア

APIの実行上限が1日で200件。サイトマップ(XML)から全件取り出すと200件以上になった場合には全件実行できません。このプログラムでは更新日の新しい順で並べているので、更新のない201番目以降の記事は出番が回ってこないです。
記事自体を何かしら変更をするとサイトマップのlastmod(最終更新日)が新しくなるので、処理対象になります。現段階では大きな問題にはならないので、気にしないでおきます。

どうしても気になる場合は、プログラムを改良してたまに逆順で並べて実行するとか、ですかね。

プログラム

プログラムは、ここに置きました。
https://github.com/kanaxx/hatenablog-indexing/

PHPファイル1枚だけで書いたので、動かすのはそんなに難しくないと思いますが、簡単に説明を書いておきます。

クライアントライブラリをインストール
C:\
λ mkdir hatena_indexing

C:\
λ cd hatena_indexing\

C:\hatena_indexing
λ composer require google/apiclient:"^2.0"
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 16 installs, 0 updates, 0 removals
  - Installing ralouphie/getallheaders (3.0.3): Loading from cache
  - Installing psr/http-message (1.0.1): Downloading (100%)
(省略)

Writing lock file
Generating autoload files

C:\hatena_indexing
λ ls
composer.json  composer.lock  vendor/

composer.json, composer.lock, vendorディレクトリができてればOK

認証ファイルを置く

前回作った認証用のjsonファイルをC:\hatena_indexingにコピーします。 ファイルの名前はなんでもよいですが、変更した場合はプログラム側と合わせてください。credential.jsonとして置くならPHPのプログラムの修正は不要です。

//ここに置く
C:\hatena_indexing\credential.json

PHPファイルを置く

次はPHPファイルです。Githubからファイルを持ってきて、C:\hatena_indexing\に置いてください。

publish_sitemap_to_indexing_api.phpの最初の変数は、認証ファイルを置いた場所に合わせる。

<?php
//認証用のファイル
$credentialFile = './credential.json';
//サイトマップ
$sitemapOrIndexUrls = [];

実行

phpコマンドで実行します。
引数に、<サイトマップURL><サイトマップインデックスURL>を指定して実行します。

こんな感じです。
>php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_common.xml"
>php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_index.xml"

コマンドのパラメータに&が入るときはダブルクオートで囲む必要があります。月別のサイトマップを指定するときは気を付けてください。

実行サンプル

サイトマップインデックスだとログの量が多くなるので、4月分のサイトマップを指定して実行しています。

php publish_sitemap_to_indexing_api.php "https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4"
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4
 got 12 entries.
 page :2020-06-10 20:05:03 https://kanaxx.hatenablog.jp/entry/screenpresso-timer
 page :2020-06-10 20:05:18 https://kanaxx.hatenablog.jp/entry/screenpresso-image-resizing
 page :2020-06-10 20:05:31 https://kanaxx.hatenablog.jp/entry/screenpresso-image-composite
 page :2020-06-10 20:05:58 https://kanaxx.hatenablog.jp/entry/chrome-ext-localization
 page :2020-05-09 20:51:15 https://kanaxx.hatenablog.jp/entry/windows10-taskbar
 page :2020-06-10 20:06:51 https://kanaxx.hatenablog.jp/entry/image-compress
 page :2020-06-17 20:09:02 https://kanaxx.hatenablog.jp/entry/google-adsense-approved
 page :2020-06-13 19:35:47 https://kanaxx.hatenablog.jp/entry/screenpresso-gif-animation
 page :2020-06-15 12:33:51 https://kanaxx.hatenablog.jp/entry/hatenablog-sitemap
 page :2020-04-05 20:38:04 https://kanaxx.hatenablog.jp/entry/try-google-adsense-6
 page :2020-06-10 20:07:33 https://kanaxx.hatenablog.jp/entry/screenpresso-scanning-qrcode
 page :2020-06-10 20:07:45 https://kanaxx.hatenablog.jp/entry/screenpresso-chrome-extension
=== URL ====
12
============
200:OK|https://kanaxx.hatenablog.jp/entry/google-adsense-approved|2020-06-21 19:55:37
200:OK|https://kanaxx.hatenablog.jp/entry/hatenablog-sitemap|2020-06-21 19:55:39
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-gif-animation|2020-06-21 19:55:42
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-chrome-extension|2020-06-21 19:55:44
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-scanning-qrcode|2020-06-21 19:55:46
200:OK|https://kanaxx.hatenablog.jp/entry/image-compress|2020-06-21 19:55:48
200:OK|https://kanaxx.hatenablog.jp/entry/chrome-ext-localization|2020-06-21 19:55:51
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-image-composite|2020-06-21 19:55:53
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-image-resizing|2020-06-21 19:55:55
200:OK|https://kanaxx.hatenablog.jp/entry/screenpresso-timer|2020-06-21 19:55:57
200:OK|https://kanaxx.hatenablog.jp/entry/windows10-taskbar|2020-06-21 19:56:00
200:OK|https://kanaxx.hatenablog.jp/entry/try-google-adsense-6|2020-06-21 19:56:02
=== Result ===
200:12
==============

たらたらとログが出れば終わりです。最後にステータスコードごとの集計が出ます。200は成功、200以外は何かしら失敗してるということです。
例だとサイトマップファイルから、12個のURLが見つかり12個のAPIを投げて12個とも成功したということです。

実行した結果

クローラーが来ていないページを一つ見つけたので、スクリプトの実行前と後の比較用のスクショを残しておきます。

実行前のサーチコンソール
クローリングが2020年4月30日で止まってるページ

API実行のログ
12:58にAPIを投げました。

200:OK
https://kanaxx.hatenablog.jp/entry/chrome-ext-localization
2020-06-21 12:58:58

(▲記事の横幅の関係で改行してます)

実行後のサーチコンソール
2020年6月21日13時16分に来て、日付が更新されました!

まとめ

定期的にクローラーがやってきて最新データを持って行ってくれるはずですが、結構古いものが残っていたので、APIでまとめて処理してみました。 インデックス数が足りていないわけではないので、このブログにとっては効果は限定的かなと思います。新しい記事を作ったときにインデックスされるまでの時間が短くなる程度ですかね。

サイトマップ登録が上手くいってなかったり、記事インデックス数が足りてない場合には、やってみると効果があるかもしれません(ないかもしれません)

という感じで、お休みの内職が終わりました。1日1回、定期的に実行するサーバーを確保しないといけないですね。Herokuかなぁ。

気が向いたらやること

  • ローカルディスクに置いたサイトマップxmlから、URLを拾うようにする。カテゴリページなどのURLを効率よくインデックスさせるため
  • 200回の制限を上手に緩和する策
  • どこかの環境にデプロイ

参考資料

割り当てと料金
https://developers.google.com/search/apis/indexing-api/v3/quota-pricing

Google API Client Library
https://github.com/googleapis/google-api-php-client

追記

サンプルを追加

PHPのサンプルの別のバージョンを作りました。よかったらこちらを参考に。

blog.indexing.today

blog.indexing.today

個別の開発実績

IndexingAPIを使ったプログラム開発を有償で受けています。

少ないながら実績はありますので、ご相談ください。

blog.indexing.today

売れてるランキング

ランキング更新日: