[Perl] XML::TreePPを使ってweblogUpdates.pingしてみる
<<
作成日時 : 2006/03/13 05:54
>>
トラックバック 0 / コメント 4
XML::TreePP モジュールを使うと XML-RPC もお手軽になるので、
weblogUpdates.ping を打つ Perl スクリプトを書いてみた。
ping の仕様については↓を参照。
http://www.xmlrpc.com/discuss/msgReader$2014
ping を打つ先のホストについては↓を参考にさせていただきました。
http://hail2u.net/blog/blog/weblogupdates_ping_servers.html http://ping.cocolog-nifty.com/xmlrpc
http://www.blogpeople.net/servlet/weblogUpdates
http://ping.bloggers.jp/rpc/
http://bulkfeeds.net/rpc
http://blog.goo.ne.jp/XMLRPC
http://rpc.technorati.com/rpc/ping
http://ping.blogmura.jp/rpc/
http://rpc.blogrolling.com/pinger/
http://api.my.yahoo.com/RPC2 をリストアップした。
プログラム本体。$WEBLOGNAME と $WEBLOGURL を書き換えて使う。
#!/usr/bin/perl
use strict;
use XML::TreePP;
# 自サイト名とURL
my $WEBLOGNAME = 'Kawa.net xp';
my $WEBLOGURL = 'http://www.kawa.net/xp/index-j.html';
# WEBLOGUPDATES.ping を飛ばす先
my $WEBLOGUPDATES = [qw(
http://ping.cocolog-nifty.com/xmlrpc
http://www.blogpeople.net/servlet/weblogUpdates
http://ping.bloggers.jp/rpc/
http://bulkfeeds.net/rpc
http://blog.goo.ne.jp/XMLRPC
http://rpc.technorati.com/rpc/ping
http://ping.blogmura.jp/rpc/
http://rpc.blogrolling.com/pinger/
http://api.my.yahoo.com/RPC2
)];
# XML-RPC のリクエストをハッシュで作成する
my $reqtree = {
methodCall => {
methodName => 'weblogUpdates.ping',
params => {
param => [
{ value => $WEBLOGNAME },
{ value => $WEBLOGURL },
]
}
}
};
# XML-RPC のリクエスト用の XML コードを生成する
my $TREEPP_OPTIONS = { force_array => [qw( member )] };
my $treepp = XML::TreePP->new( %$TREEPP_OPTIONS );
my $reqxml = $treepp->write( $reqtree );
# 各ホストを順に ping して結果を表示していく
foreach my $host ( @$WEBLOGUPDATES ) {
print $host, "\n";
my( $restree, $resxml ) = $treepp->parsehttp( POST => $host, $reqxml );
my $reshash = &parse_xmlrpc_response( $restree );
if ( ref $reshash ) {
foreach my $key ( keys %$reshash ) {
print $key, "=", $reshash->{$key}, "\n";
}
} else {
print $resxml, "\n"; # XML-RPCのレスポンスではない場合
}
}
# XML-RPC のレスポンスを解析してmemberのみをハッシュに展開する関数
sub parse_xmlrpc_response {
my $tree = shift;
return unless ref $tree;
return unless ref $tree->{methodResponse};
return unless ref $tree->{methodResponse}->{params};
return unless ref $tree->{methodResponse}->{params}->{param};
return unless ref $tree->{methodResponse}->{params}->{param}->{value};
return unless ref $tree->{methodResponse}->{params}->{param}->{value}->{struct};
my $array = $tree->{methodResponse}->{params}->{param}->{value}->{struct}->{member};
return unless ref $array;
my $hash = {};
foreach my $member ( @$array ) {
my $val = $member->{value};
if ( ref $val ) {
my $type = ( keys %$val )[0];
$val = $val->{$type};
}
$hash->{$member->{name}}= $val;
}
$hash;
}
$treepp->write( $reqtree );がリクエスト用のXMLを生成しているところ。
$treepp->parsehttp( POST => $host, $reqxml ); がサーバと通信して
レスポンスのXMLを取得して、ハッシュツリーに展開しているところ。
ちなみに、weblogUpdates.ping でエラーがあったときの仕様って決まってないのかな?
flerror=1 で返してくるホストと、faultCode で返してくるホストがあった。
flerror=1 を返してくる例:<?xml version="1.0" encoding="UTF-8" ?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>flerror</name>
<value><boolean>1</boolean></value>
</member>
<member>
<name>message</name>
<value><string>エラーメッセージ</string></value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
faultCode を返してくる例:<?xml version="1.0" encoding="UTF-8" ?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>1</int></value>
</member>
<member>
<name>faultString</name>
<value><string>エラーメッセージ</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
どっちでもいいから、統一してくれればいいのに。
flerror eq "0" でなければエラーとみなすしかない。
しっかし、ホント XML-RPC って冗長ですね。
マルチ用途で柔軟かつ型定義で厳密ということ?
|