Kawanet Blog II

アクセスカウンタ

zoom RSS [Perl] XML::TreePPを使ってweblogUpdates.pingしてみる

<<   作成日時 : 2006/03/13 05:54   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

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 って冗長ですね。
マルチ用途で柔軟かつ型定義で厳密ということ?

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
[Perl] XML::TreePPを使ってweblogUpdates.pingしてみる Kawanet Blog II/BIGLOBEウェブリブログ
文字サイズ:       閉じる