更新PINGを調べてみた
ブログを更新したら、更新PINGというものがPINGサーバに対して送られる。じゃぁ一体何を送ってるんですか?ってところに興味が行くわけで。
何を送っているかを調べるには、PINGサーバを作って、自分のブログから送信してみればいい。というわけで、やってみたら、こんなのでした。
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value>
<string>52回の週末</string>
</value>
</param>
<param>
<value>
<string>http://quickturn.jp/</string>
</value>
</param>
</params>
</methodCall>
ほうほう。ブログ名とURLが、XMLに載せられて送信されるわけですね。
ではどうやって受信したかってことですが、httpでPOSTされるに違いないと推定して、POSTされたデータを単純に保存するだけのCGIを作ってみました。
いい加減なソースなんであまり人様にお見せできるものではありませんが(しかも"OK."しか返さないし)・・・。
これをCGIが実行可能なサーバにぽいっと置いて、そのURLをブログの更新PINGのURLとして追加して、ブログを更新してみたというわけです。
すると、ソースどおり、"ping.txt"というファイル名で受信データを保存できました。それが冒頭のXMLソースです。ちなみに、生データは改行コードが入ってないので、適当に改行・インデントを追加してあります。
では次。先ほどのいい加減PINGサーバはOK.しか返しませんでしたけど、実際のPINGサーバは何を返してくるんでしょうか?ってことに興味が移ります。では、せっかくPINGで送信するデータも手に入ったことですし、このデータを実際のPINGサーバにPOSTさせてもらいましょう。
use strict;
use LWP::UserAgent;
#送信するXMLデータを置いたファイル
my $filename = "ping.txt";
#livedoor Reader用更新PING URL
my $url='http://rpc.reader.livedoor.com/ping';
my $ua = new LWP::UserAgent;
my $pingdata;
open(F,"<$filename");
binmode(F);
read(F, $pingdata, -s($filename));
close(F);
my $req = new HTTP::Request POST => $url;
$req->content($pingdata);
my $res = $ua->request($req);
print $res->content;
print "\n";
またまたこのいい加減な更新PINGクライアント(?)を実行してみると、無事にPINGサーバからの応答を次のように取得することができました。
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>flerror</name>
<value>
<boolean>0</boolean>
</value>
</member>
<member>
<name>message</name>
<value>Thanks for the ping.</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
とりあえず、先ほどの擬似サーバの返答はこれにしておいた方がいいでしょうね。
さて、せっかくなので様々なPINGサーバへPINGを送ってみましょう。またまた次のようなショボイプログラムを作ってみました。
use strict;
use LWP::UserAgent;
#送信するXMLデータを置いたファイル
my $filename = "ping.txt";
#受信したデータを置くファイル
my $logname = "pinglog.txt";
#更新PING URL
my @urls=(
"http://blogsearch.google.co.jp/ping/RPC2",
"http://www.blogpeople.net/servlet/weblogUpdates",
"http://rpc.weblogs.com/RPC2",
"http://blog.goo.ne.jp/XMLRPC",
"http://rpc.reader.livedoor.com/ping",
"http://ping.fc2.com",
"http://api.my.yahoo.co.jp/RPC2",
"http://rpc.technorati.com/rpc/ping",
"http://ping.ask.jp/xmlrpc.m",
"http://ping.namaan.net/rpc/",
"http://blog-search.net/up.php",
"http://ping.bloggers.jp/rpc/",
"http://r.hatena.ne.jp/rpc",
"http://blogstyle.jp/xmlrpc/",
"http://ping.rss.drecom.jp"
);
my $ua = new LWP::UserAgent;
my $pingdata;
open(F,"<$filename");
binmode(F);
read(F, $pingdata, -s($filename));
close(F);
open (F,">$logname");
foreach my $url(@urls){
print F "PING TO $url\n";
my $req = new HTTP::Request POST => $url;
$req->content($pingdata);
my $res = $ua->request($req);
print F "Content-Type:";
print F $res->header('Content-Type')."\n\n";
my $result=$res->content;
chomp($result);
print F $result;
print F "\n\n";
};
close(F);
結果は長くなるので載せませんが、text/htmlなもの、Shift_JISなもの、インデントがタブだったりスペース1文字だったり2文字だったり、各サーバそれぞれ違って面白いです。
technoratiなどは、更新がないとflerror=1、message="You just sent a ping, please only ping when you update"、などと怒られます。テストとはいえ、やりすぎには注意しましょう。
PINGサーバリストはいろいろ探して持ってきたのですが、世の中に出回っているPINGサーバリストは古いものが多いようで、既に運営されていないPINGサーバがたくさんリストされていたりします。安易なコピペはやめましょう。
で、こういう風にXMLをHTTPを通してやりとりするのをXML-RPCというそうで、このプロトコルを使うライブラリも既に用意されているので、それで作り直してみました。
##
## UTF-8で保存する
##
use strict;
use XMLRPC::Lite;
#更新PING URL
my @urls=(
"http://blogsearch.google.co.jp/ping/RPC2",
"http://www.blogpeople.net/servlet/weblogUpdates",
"http://rpc.weblogs.com/RPC2",
"http://blog.goo.ne.jp/XMLRPC",
"http://rpc.reader.livedoor.com/ping",
"http://ping.fc2.com",
"http://api.my.yahoo.co.jp/RPC2",
"http://rpc.technorati.com/rpc/ping",
"http://ping.ask.jp/xmlrpc.m",
"http://ping.namaan.net/rpc/",
"http://ping.bloggers.jp/rpc/",
"http://r.hatena.ne.jp/rpc",
"http://blogstyle.jp/xmlrpc/",
"http://ping.rss.drecom.jp",
);
#ブログ名
my $blogname = '52回の週末';
#ブログURL
my $blogurl = 'http://quickturn.jp/';
#受信したデータを置くファイル
my $logname = "pinglog.txt";
#データ保存
open (F,">$logname");
foreach my $url(@urls){
print F "PING TO $url\n";
my $res=eval{
XMLRPC::Lite
-> proxy($url)
-> call('weblogUpdates.ping',
XMLRPC::Data->type(string => $blogname ),
$blogurl)
-> result;
};
unless($@){
print F "flerror:".$res->{'flerror'}."\n";
print F "message:".$res->{'message'},"\n";
}else{
print F $@;
};
print F "\n";
};
close(F);
この実行結果が"pinglog.txt"に保存されましたので見てみますと次のようになります。
flerror:0
message:Thanks for the ping.
PING TO http://www.blogpeople.net/servlet/weblogUpdates
flerror:0
message:Thanks for the ping.
(以下略)
この時点でXMLは一切確認する必要がなくなりました。
日本語ブログ名と文字コードやPINGサーバのエラー対策がちょっと面倒でした。
今回初めてXML-RPCを使ってみましたけど、これはなかなか面白いかも。もうちょっと触ってみたいと思います。
コメント
昔…HPってタグで作れるんだって知ったとき、夢中になっていろいろ調べて…タグ辞典なんか買ったりして作ったものです。
それが今じゃ~眠くなります(T^T)クゥー
そそ わたしのブログのスタイルシートって、人が作ったものを借りてるみたいなもので…、画像とか変えても良いみたいなんです。
ソースももち後悔されてるんですけど…、ここを変えれば良いの?って迷ってたんで~分からなかったら聞こうっとσ(^^)
何より面倒で手をつけてません(^^;
三日坊主の典型のような奴…。
興味があるときは寝る間を惜しんでって感じなんですけどね~(^^;
>昔…HPってタグで
タダで、って見えました
基本はフツウの平文に「こっからここまでが一段落」
「ここは章のタイトル」「ここは強調」ってマークする
だけのものですもんね。
>そそ わたしのブログのスタイルシートって
ここもご覧のとおり原型がわからないほど弄り回して
しまいました。
だいたいできてしまえば、あとはたまに画像とか色を入れ替える
だけで雰囲気がらっと変わりますので、一度やってしまうと
いいですよ~
>興味があるときは
なんか、車もカヤックも自転車もホームページも、
みんな同じですね。