静的サイトジェネレータで作ったブログのping送信を自動化する

2021年03月22日

静的サイトジェネレータとは Next.js, Gatsby, Hugo, Jekyll といった「マークダウンを元にブログを静的HTMLファイルとして生成するツール」のこと。 静的ファイルなのでコメント機能やトラックバック受付機能を実現することができないんですけど、代わりに動作が非常に高速だったり、セキュリティ面で安心だったり(プログラムが動いてないので攻撃しようがない)といった利点があります。

ブログの機能である「ping送信をして新着記事の更新を通知する機能」も静的サイトジェネレータには無い(もしかしたらプラグインであるのかも知れないけど見つけられない)ので、ping送信を自動化するシェルスクリプトを作成しました。 似たような状況の方向けにこの記事にメモしておきます。

ブログのping送信の仕組み

そもそもping送信の際に何が起こっているのかという話。 ping送信のタイミングでブログシステムがping送信サーバに次のXMLをPOSTします。

<?xml version="1.0"?>
<methodCall>
  <methodName>weblogUpdates.ping</methodName>
  <params>
    <param>
      <value>(ブログのタイトル)</value>
    </param>
    <param>
      <value>(ブログのトップページのURL)</value>
    </param>
  </params>
</methodCall>

POSTしてしばらくしたらpingを受信したシステムがクロールしてきてRSS auto discoveryでHTMLのlinkタグからRSSフィードのURLを発見して、フィードの内容を取得するっていう流れです(たぶん)。

2021年現在、ping送信の仕様の原文が見つけられず、正確性に欠けてしまって申し訳ないのですが、挙動みてる感じこの理解で間違いないと思います。

RSSフィードを作成する

ping送信の前提として、RSSフィードが作成されてる必要があります。 このあたりはブログ系の静的サイトジェネレータなら基本機能やプラグインで実現できるはずです。

ping送信シェルスクリプト

ping送信の仕組みを自前のスクリプトに実装してきます。

まず前述のXMLファイルをping.xmlというファイル名で手元のPCに保存します(※ブログのタイトルとURLは適切に自分のものに書き換えてください)。 XMLファイルの中身が「ブログタイトルとURLだけ」なので、記事の追加のたびにこのXMLファイルを編集する必要はありません。

つぎはXMLファイルのPOST。静的サイトジェネレータ使いの場合は「手元のPCやCI/CDから静的ファイルをアップロードする」みたいなことやってるはずなので、POSTの自動化もシェルスクリプトを叩く感じで大丈夫かと思います。 たとえば次のようなシェルスクリプトが正常に動作します。

#/bin/bash

function do_ping () {
  echo "=== $1"
  curl -H "Content-Type: text/xml" -d @ping.xml $2
}

do_ping "送信先の名前" "送信先URL"
# ... 他のping送信先

以上です。


事務用たんぽぽ漫画を読んだ感想を書いていくブログです。軽いネタバレあるかも。なるべく毎日更新できたらいいな〜。ツイッターもやってるので適当にからんでください。 Twitter About

© 2021 事務用たんぽぽ

PVアクセスランキング にほんブログ村