下記記事で書いた更新通知用の Ping サーバのメモ。
前回は Perl の XMLRPC::Transport::HTTP モジュールを使って簡単なサーバを書いてみたけど、実際に稼働させたいサーバを覗いたらこのモジュールが無かった。別途インストールすれば良いんだろうけど Ping を受けるだけなら何でも良いんじゃなかという事で書き直し。
XML::XPath が使えるのでこれに置き換えてみた。
#!/usr/bin/perl
use strict;
use warnings;
use XML::XPath;
my $method = 'weblogUpdates';
my $query = '';
my $xpath = '';
my $nodeset = '';
my $msg = {};
$msg = {
0 => 'Thanks for the ping',
1 => 'Bad Request',
};
## POST かつ XML 以外のリクエストはエラーを出力し終了
if ($ENV{'REQUEST_METHOD'} !~ /^POST$/i ||
$ENV{'CONTENT_TYPE'} !~ /^(text|application)\/xml$/) { &print_xml(1); }
read (STDIN, $query, $ENV{'CONTENT_LENGTH'});
## 受けたリクエスト内容をデバッグ用のログに記録
open(OUT, "> debug.log");
print OUT "----- req -----\n";
print OUT "$query\n";
print OUT "----- req -----\n";
close(OUT);
## メソッド名を取得
$xpath = XML::XPath->new(xml => $query);
$nodeset = $xpath->find('//methodName/text()');
## 未知のメソッド名であればエラーを出力し終了
if ($nodeset !~ /^$method/) { &print_xml(1); }
## テキストノードの抜き出してデバッグ用のログに記録
$nodeset = $xpath->find('//params/param/value/string');
open(OUT, ">> debug.log");
foreach ($nodeset->get_nodelist) {
print OUT $xpath->getNodeText($_), "\n";
}
close(OUT);
## レスポンスを返して終了
&print_xml(0);
sub print_xml {
my $flag = shift;
print "Content-type: text/xml\n";
print "\n";
print "<?xml version='1.0'?>\n";
print "<methodResponse><params>\n";
print "<param><value><struct>\n";
print "<member>\n";
print "<name>flerror</name><value><boolean>$flag</boolean></value>\n";
print "</member>\n";
print "<member>\n";
print "<name>message</name><value><string>$msg->{$flag}</string></value>\n";
print "</member>\n";
print "</struct></value></param>\n";
print "</params></methodResponse>\n";
exit;
}
exit;
これを適当な名前で htdocs に配置して、WordPress の Ping 通知先にセットしてみる。
適当な記事を更新するとこんなリクエストが飛ぶ。
<?xml version="1.0"?> <methodCall> <methodName>weblogUpdates.extendedPing</methodName> <params> <param><value><string>work.log</string></value></param> <param><value><string>https://worklog.be/</string></value></param> <param><value><string>https://worklog.be/feed</string></value></param> </params></methodCall>
取得したデバッグ用のログはこんな感じ。
# cat debug.log ----- req ----- <?xml version="1.0"?> <methodCall> <methodName>weblogUpdates.extendedPing</methodName> <params> <param><value><string>work.log</string></value></param> <param><value><string>https://worklog.be/</string></value></param> <param><value><string>https://worklog.be/feed</string></value></param> </params></methodCall> ----- req ----- work.log https://worklog.be/ https://worklog.be/feed
適当に書いちゃってるけど Ping 受けるだけならこんな感じで OK でしょ多分。
ちょっと気になったのは前回書いた時はメソッド名が「weblogUpdates.ping」だったけど、今回やったら「weblogUpdates.extendedPing」になってた。
weblogUpdates.ping の拡張版らしく下記を含めた PIng らしい。
- サイトの名前
- サイトの URL
- 変更したページの URL
- フィードの URL
どう見ても「変更したページの URL」が入ってないけどどういう事だろ。
とりあえず今日はここまで!