Kawanet Blog II

アクセスカウンタ

zoom RSS [はてブ] XML::TreePP&はてなブックマーク件数取得API

<<   作成日時 : 2006/02/26 04:54   >>

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

XML::TreePP モジュール を使って はてなブックマーク件数取得API にアクセスし、
指定したURLの被ブックマーク件数を取り出すサンプルプログラムを書いてみた。
XML ソースを1行も書いてないのに、XML-RPC ができてしまいます。

use strict;
use XML::TreePP;

# ブックマーク件数を取得したいURL
my $urllist = [
  "http://www.kawa.net/works/perl/feedpp/feedpp.html",
  "http://www.kawa.net/works/perl/treepp/treepp.html",
];
# XML-RPC リクエストのハッシュツリーを作成する
my $reqtree = {
  methodCall => {
    methodName => "bookmark.getCount",
    params => {
      param => [ map { {value=>{string =>$_}}; } @$urllist ]
    }
  }
};
# XML::TreePP のインスタンスを作成する
my $tpp = XML::TreePP->new( force_array => [qw( member )] );
# XML-RPC リクエストの XML ソースを生成する
my $reqxml = $tpp->write( $reqtree );
# はてなに XML-RPC リクエストを送信する
my $restree = $tpp->parsehttp( POST => "http://b.hatena.ne.jp/xmlrpc", $reqxml );
# XML-RPC レスポンスの値を取り出す(member要素は配列)
my $member = $restree->{methodResponse}->{params}->{param}->{value}->{struct}->{member};
# 被ブックマーク件数とURLを表示するループ
foreach my $hash ( @$member ) {
  printf( "%5d\t%s\n", $hash->{value}->{int}, $hash->{name} );
}

その実行結果。↓

 75 http://www.kawa.net/works/perl/feedpp/feedpp.html
  8 http://www.kawa.net/works/perl/treepp/treepp.html

以下は参考情報です。
ちなみに、リクエスト用に作成したハッシュツリーの内容。

$reqtree = {
 'methodCall' => {
  'params' => {
   'param' => [
    {
     'value' => {
      'string' => 'http://www.kawa.net/works/perl/feedpp/feedpp.html'
     }
    },
    {
     'value' => {
      'string' => 'http://www.kawa.net/works/perl/treepp/treepp.html'
     }
    }
   ]
  },
  'methodName' => 'bookmark.getCount'
 }
};

生成された XML-RPC リクエスト用のソース。
これを http://b.hatena.ne.jp/xmlrpc への POST のリクエストボディとして送信する。

<?xml version="1.0" encoding="UTF-8" ?>
<methodCall>
 <methodName>bookmark.getCount</methodName>
 <params>
  <param>
   <value>
   <string>http://www.kawa.net/works/perl/feedpp/feedpp.html </string>
   </value>
  </param>
  <param>
   <value>
   <string>http://www.kawa.net/works/perl/treepp/treepp.html </string>
   </value>
  </param>
 </params>
</methodCall>

http://b.hatena.ne.jp/xmlrpc から返ってきた XML ソース。(改行位置変更)

<?xml version="1.0" encoding="UTF-8" ?>
<methodResponse>
 <params>
  <param>
   <value>
    <struct>
     <member>
      <name>http://www.kawa.net/works/perl/feedpp/feedpp.html </name>
      <value>
       <int>75</int>
      </value>
     </member>
     <member>
      <name>http://www.kawa.net/works/perl/treepp/treepp.html </name>
      <value>
       <int>8</int>
      </value>
     </member>
    </struct>
   </value>
  </param>
 </params>
</methodResponse>

parsehttp() メソッドの返値の時点で、既にハッシュツリー化されている。

$restree = {
 'methodResponse' => {
  'params' => {
   'param' => {
    'value' => {
     'struct' => {
      'member' => [
       {
        'value' => {
         'int' => 75
        },
        'name' => 'http://www.kawa.net/works/perl/feedpp/feedpp.html'
       },
       {
        'value' => {
         'int' => 8
        },
        'name' => 'http://www.kawa.net/works/perl/treepp/treepp.html'
       }
      ]
     }
    }
   }
  }
 }
};


PS)
はてな純正のサンプルの通り、SOAP::Lite モジュールについてくる XMLRPC::Lite モジュールを使っても、Pure Perl の構成で同様の XML-RPC ができます、多分。
 

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
XML、RDF処理関係のPerlモジュール、JavaScriptモジュールなど
いつも参考にさせていただいております。

XML::TreePP で質問なのですが
xml_to_flat() の365行目の属性を配列に展開するときの xml_unescape と、
hash_to_xml() の478行目のXMLに展開するときの xml_unescape は必要なのでしょうか?
&<> がタグ内に展開される可能性がないでしょうか。
suVene
2006/03/02 00:15
ご指摘ありがとうございます。

XML 展開結果のハッシュツリーはエスケープを解いた状態としたいので、
xml_to_flat() 中にある xml_unescape は正しいと思いますが、
hash_to_xml() 中の xml_unescape は xml_escape の誤りですね。(逆だ)
scalar_to_xml() と同様に xml_escape を使用する必要があります。

バグです。次バージョンにて修正・テスト項目に追加させていただきます!!
ゆうすけ
2006/03/02 02:45
というわけで、バグ修正して 0.06 に更新しました。
http://www.kawa.net/works/perl/treepp/treepp.html
CPAN 経由でも数時間で利用可能になるかと。
ゆうすけ
2006/03/02 04:55

コメントする help

ニックネーム
本 文
[はてブ] XML::TreePP&はてなブックマーク件数取得API Kawanet Blog II/BIGLOBEウェブリブログ
文字サイズ:       閉じる