• このエントリーをはてなブックマークに追加

更新PINGを調べてみた

 ブログを更新したら、更新PINGというものがPINGサーバに対して送られる。じゃぁ一体何を送ってるんですか?ってところに興味が行くわけで。

 何を送っているかを調べるには、PINGサーバを作って、自分のブログから送信してみればいい。というわけで、やってみたら、こんなのでした。

<?xml version="1.0" encoding="UTF-8"?>
<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を作ってみました。

#!/usr/bin/perl

use strict;

my $savefile="ping.txt";
my $rdata;

if ($ENV{'REQUEST_METHOD'} eq 'POST'){
  my $len = $ENV{'CONTENT_LENGTH'};
  read(STDIN, $rdata, $len);
  open(F,">$savefile");
  binmode(F);
  print F $rdata;
  close(F);
};
print "content-type:text/plain\n\n";
print "OK.\n";

 いい加減なソースなんであまり人様にお見せできるものではありませんが(しかも"OK."しか返さないし)・・・。

 これをCGIが実行可能なサーバにぽいっと置いて、そのURLをブログの更新PINGのURLとして追加して、ブログを更新してみたというわけです。

 すると、ソースどおり、"ping.txt"というファイル名で受信データを保存できました。それが冒頭のXMLソースです。ちなみに、生データは改行コードが入ってないので、適当に改行・インデントを追加してあります。


 では次。先ほどのいい加減PINGサーバはOK.しか返しませんでしたけど、実際のPINGサーバは何を返してくるんでしょうか?ってことに興味が移ります。では、せっかくPINGで送信するデータも手に入ったことですし、このデータを実際のPINGサーバにPOSTさせてもらいましょう。

#!/usr/bin/perl

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サーバからの応答を次のように取得することができました。

<?xml version="1.0"?>
<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を送ってみましょう。またまた次のようなショボイプログラムを作ってみました。

#!/usr/bin/perl

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というそうで、このプロトコルを使うライブラリも既に用意されているので、それで作り直してみました。

#!/usr/bin/perl

##
## 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"に保存されましたので見てみますと次のようになります。

PING TO http://blogsearch.google.co.jp/ping/RPC2
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を使ってみましたけど、これはなかなか面白いかも。もうちょっと触ってみたいと思います。

  • このエントリーをはてなブックマークに追加

コメント

  1. けんと(^。^)y-。oO より:

    昔…HPってタグで作れるんだって知ったとき、夢中になっていろいろ調べて…タグ辞典なんか買ったりして作ったものです。
    それが今じゃ~眠くなります(T^T)クゥー

    そそ わたしのブログのスタイルシートって、人が作ったものを借りてるみたいなもので…、画像とか変えても良いみたいなんです。
    ソースももち後悔されてるんですけど…、ここを変えれば良いの?って迷ってたんで~分からなかったら聞こうっとσ(^^)
    何より面倒で手をつけてません(^^;

    三日坊主の典型のような奴…。
    興味があるときは寝る間を惜しんでって感じなんですけどね~(^^;

  2. quickturn. より:

    >昔…HPってタグで
    タダで、って見えました :pikapika:

    基本はフツウの平文に「こっからここまでが一段落」
    「ここは章のタイトル」「ここは強調」ってマークする
    だけのものですもんね。

    >そそ わたしのブログのスタイルシートって
    ここもご覧のとおり原型がわからないほど弄り回して
    しまいました。
    だいたいできてしまえば、あとはたまに画像とか色を入れ替える
    だけで雰囲気がらっと変わりますので、一度やってしまうと
    いいですよ~

    >興味があるときは
    なんか、車もカヤックも自転車もホームページも、
    みんな同じですね。

WordPress/Twitter/Facebookのアカウントも使えるようになりました。