[はてブ] XML::TreePP&はてなブックマーク件数取得API
<<
作成日時 : 2006/02/26 04:54
>>
トラックバック 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 ができます、多分。
|