((7回目の出直し🌼))

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

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

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

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回

  • 1コールあたり2秒スリープして30回/分程度になるようにしています。

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

プログラムの仕様

こんな感じで作ります

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

やらなかったこと

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

  • アーカイブページ(カテゴリページ、日付ごとのページ)の対応
  • 記事が200以上ある場合のケア

過去のAPIを呼び出した履歴を保存しておけば、もっと上手にコントロールできるような気もしますが、時間の関係で今回はやってないです。
なので、記事数が200個以上あると、ずーっと順番が回ってこないページが出てきます。記事自体を何かしら変更をするとサイトマップのlastmod(最終更新日)が新しくなるので、処理対象になります。現段階では大きな問題にはならないので、気にしないでおきます。

どうしても気になる場合は、sitemap_indexではなくて、sitemapファイルを指定して実行することもできるので、たまに処理対象を変えるといいかも。

プログラム

プログラムは、ここに置きました。
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に置きます。 credentical.jsonとして置くなら、PHPのプログラムの修正は不要です。ファイル名を変えたならそれに合わせてPHPも書き換えて下さい。

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

PHPファイルを置く

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

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

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

実行

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

こんな感じです。
>php publish_sitemap_to_indexing_api.php "<サイトマップ>"
>php publish_sitemap_to_indexing_api.php "<サイトマップインデックス>"

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

実行サンプル

サイトマップインデックスだとログの量が多くなるので、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日で止まってるページ
f:id:kanaxx43:20200621132340p:plain

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分に来て、日付が更新されました! f:id:kanaxx43:20200621132401p:plain

まとめ

定期的にクローラーがやってきて最新データを持って行ってくれるはずですが、結構古いものが残っていたので、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