『7回目の出直し🌻』

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

GoogleのSearch Console APIを使って、サイトマップの登録を自動化する

無いなら作ろうシリーズ 第5弾
はてなブログだとサイトマップファイルをばらばらに登録したほうが効果がありそうなので、サイトマップの登録・更新通知を自動化してみます。

困っていること

はてなブログの個別サイトマップを登録する作業が面倒なことです!

背景

はてなブログは、サイトマップインデックスを登録してもGoogleがサイトマップの読み込みをしてくれないですね。これはもう有名な話です。
そして、本来不要な作業ですが、個別のサイトマップをバラバラに登録するほうが効果がありそうでした。

そうなると、、、
はてなブログのサイトマップは月ごとに増えるので、毎月毎月、サイトマップを個別登録する作業が発生するわけですね。はぁ~面倒

ということで、この作業をAPIを使って自動化してみます

使ったもの

GoogleのSearch Console APIを使います。Sitemapssubmitメソッドを使うと、サイトマップの登録ができます。
https://developers.google.com/webmaster-tools/search-console-api-original/v3/sitemaps/submit

まず準備

Google Indexing APIの認証と途中まで同じです。
APIのプロジェクトを作り、サービスアカウントを登録しておくところまでは済ませておいてください。

kanaxx.hatenablog.jp

Search Console APIを有効にする

まずはSearch Console APIを有効にします。

Google API Consoleで、プロジェクトを開き、「APIとサービスの有効化」を押す
f:id:kanaxx43:20200627091040p:plain

Search Console APIを探して、有効にする
f:id:kanaxx43:20200627091245p:plain

Search Consoleのアカウント設定の変更

Search Consoleでアカウントを操作してAPIを使えるようにします。

サーチコンソールの設定画面のユーザ一覧を開きます

f:id:kanaxx43:20200626215351p:plain
f:id:kanaxx43:20200626220047p:plain

ユーザの一覧が表示されます。前回が終わった状態だと、全員がオーナーになっているはずです。

権限の変更

オーナーから別の権限に変更するには、右上のユーザ追加ボタンから実行です。

ダイアログが開きます。APIで使うサービスアカウントのメールアドレス(一覧に出ていたものと同じでよい)と、変更後の権限を入力してOKを押します。権限はフルにしないとAPIでエラーがでます。 f:id:kanaxx43:20200626224013p:plain

このようになれば完了です
f:id:kanaxx43:20200626223935p:plain

プログラム仕様

こんな感じでプログラムをつくりました。

  • コマンドラインパラメータからサイトマップのURL(インデックスでもよい)を受け取る
  • サイトマップインデックスの場合は、再帰的にサイトマップURLまでほぐす
  • 集めたサイトマップのURLを、Search Console APIのsubmitに投げ込む

という作業です。簡単ですね。

プログラム

作ったプログラムは、ここに置いてあります。
https://github.com/kanaxx/hatenablog-indexing/blob/master/submit_sitemap.php

前回のフォルダはGoogle Client Libraryがセットアップ済みなので、前回と同じところに置きます。

C:\hatena_indexing\submit_sitemap.php

PHPファイルの先頭にある$siteURL$credentialFileは各自の設定に変えて下さい。

<?php
//ドメイン
$siteUrl = 'https://kanaxx.hatenablog.jp/';
//認証用のファイル
$credentialFile = './credential.json';

実行

プログラムを実行してみます。
サイトマップインデックスを指定すると再帰的にサイトマップを送り込めますが、違いが分かるように2020年3月のサイトマップだけ送ってみます。

実行前のサイトマップの読み込み状況

送信日時も受信日時も6月3日のままのサイトマップ
f:id:kanaxx43:20200627093200p:plain

プログラム実行
 php submit_sitemap.php "https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3"
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3
 got 33 entries.
=== Sitemap URL ====
1
====================
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3
=== Result ===
204:1
==============

実行完了。
Console APIは上手くいったときに204が返ってきます。

プログラム実行後のSearch Console

f:id:kanaxx43:20200627093229p:plain 送信日時が変わった!

このプログラムでできることは、「サイトマップをGoogleに通知するところまで」です。
通知したあとに、Googleが取りに来てちゃんと読み込んでくれるのかは、別の話です。はてなブログに限っては後半の部分の望みが薄いです。

最後に一括で登録を実行

サイトマップインデックスを指定すれば、すべてのサイトマップを登録できます。

 php submit_sitemap.php "https://kanaxx.hatenablog.jp/sitemap_index.xml"
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_index.xml
 got 7 entries.
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_common.xml
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=6
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=5
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=2
 sitemap URL :https://kanaxx.hatenablog.jp/sitemap_page.xml
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_common.xml
 got 2 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=6
 got 17 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=5
 got 25 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4
 got 12 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3
 got 33 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=2
 got 2 entries.
-getting XML >> https://kanaxx.hatenablog.jp/sitemap_page.xml
 got 5 entries.
=== Sitemap URL ====
7
====================
204:No Content|https://kanaxx.hatenablog.jp/sitemap_common.xml
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=6
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=5
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=4
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=3
204:No Content|https://kanaxx.hatenablog.jp/sitemap_periodical.xml?year=2020&month=2
204:No Content|https://kanaxx.hatenablog.jp/sitemap_page.xml
=== Result ===
204:7
==============

実行直後、全部のサイトマップの送信日が6/27に変わりました!
f:id:kanaxx43:20200627102603p:plain

7/5に調べたら、オールグリーン全部取り込み済みになりました。自動化って大事ですね。 f:id:kanaxx43:20200705102735p:plain

トラブルシューティング

APIで使って「403 user does not have sufficient permission for site」がメッセージが出るときは、Search Console側のアカウント登録がうまくいってないときです。

こんなメッセージが返ってきます。

403 "User does not have sufficient permission for site 'https://kanaxx.hatenablog.jp/'. See also: https://support.google.com/webmasters/answer/2451999 ."

オーナーに追加するだけではダメなので、サーチコンソールでユーザの権限の追加をしてください。

あと、サーチコンソールに「ドメインプロパティ」として登録するとうまくいかない場合があるので、「URL」として登録したほうにユーザを追加登録してください。
f:id:kanaxx43:20211019231246p:plain

まとめ

今回は、Google Console APIを使って、サイトマップ登録を自動化するプログラムを作りました。
認証がハマりどころですが、API自体は簡単なので何かの参考になればよいです。

ブログレベルの記事の更新頻度でここまで実装する必要があるかといえば、無いです。サイトマップインデックスの更新だけで全てがうまくいく状態になれば、こんなこといらないのに。

参考資料

Search Console API Reference
https://developers.google.com/webmaster-tools/search-console-api-original/v3/sitemaps

GoogleのIndexing APIを使って、サイトの更新情報を通知する(1)準備まで
https://kanaxx.hatenablog.jp/entry/google-indexing-api