無いなら作ろうシリーズ 第5弾
はてなブログだとサイトマップファイルをばらばらに登録したほうが効果がありそうなので、サイトマップの登録・更新通知を自動化してみます。
2024年9月にIndexing APIに変更がありました。使い方を間違えるとスパム扱いするとGoogleのドキュメントに明記されましたのでお気をつけください。この記事はルール変更前に書かれたものです。
困っていること
はてなブログの個別サイトマップを登録する作業が面倒なことです!
背景
はてなブログは、サイトマップインデックスを登録してもGoogleがサイトマップの読み込みをしてくれないですね。これはもう有名な話です。
そして、本来不要な作業ですが、個別のサイトマップをバラバラに登録するほうが効果がありそうでした。
そうなると、、、
はてなブログのサイトマップは月ごとに増えるので、毎月毎月、サイトマップを個別登録する作業が発生するわけですね。はぁ~面倒
ということで、この作業をAPIを使って自動化してみます
使ったもの
GoogleのSearch Console APIを使います。Sitemaps
のsubmit
メソッドを使うと、サイトマップの登録ができます。
https://developers.google.com/webmaster-tools/search-console-api-original/v3/sitemaps/submit
まず準備
Google Indexing APIの認証と途中まで同じです。
APIのプロジェクトを作り、サービスアカウントを登録しておくところまでは済ませておいてください。
Search Console APIを有効にする
まずはSearch Console APIを有効にします。
Google API Consoleで、プロジェクトを開き、「APIとサービスの有効化」を押す
Search Console APIを探して、有効にする
Search Consoleのアカウント設定の変更
Search Consoleでアカウントを操作してAPIを使えるようにします。
サーチコンソールの設定画面のユーザ一覧を開きます
ユーザの一覧が表示されます。前回が終わった状態だと、全員がオーナーになっているはずです。
権限の変更
オーナーから別の権限に変更するには、右上のユーザ追加ボタンから実行です。
ダイアログが開きます。APIで使うサービスアカウントのメールアドレス(一覧に出ていたものと同じでよい)と、変更後の権限を入力してOKを押します。権限はフルにしないとAPIでエラーがでます。
このようになれば完了です
プログラム仕様
こんな感じでプログラムをつくりました。
- コマンドラインパラメータからサイトマップの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日のままのサイトマップ
プログラム実行
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
送信日時が変わった!
このプログラムでできることは、「サイトマップを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に変わりました!
7/5に調べたら、オールグリーン全部取り込み済みになりました。自動化って大事ですね。
トラブルシューティング
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」として登録したほうにユーザを追加登録してください。
まとめ
今回は、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