XML-RPC

Hiki 0.8でXML-RPCが実装されてきてるので試してみる。標準ではHikiFarmに対応してないのでHikifarmでもXML/RPCインタフェースを使うを参考に/home/httpd/hiki08/public/xmlrpc.cgiを作る。

#!/usr/bin/ruby
hiki=''
eval( open( '../hikifarm.conf' ){|f|f.read.untaint} )
$:.unshift "#{hiki}"
load "#{hiki}/misc/xmlrpc/xmlrpc.cgi"

クライアントはこんな感じ。

#!/usr/bin/env ruby
# hiki-getpage.rb
#
require 'xmlrpc/client'

xmlrpc_uri = 'http://pegandgiff.dyndns.org/hiki/public/xmlrpc.cgi'
hiki_page = '猫絵日記'

begin
server = XMLRPC::Client.new2( xmlrpc_uri )
puts server.call('wiki.getPage', hiki_page)
rescue XMLRPC::FaultException => e
puts "Error: #{e.faultCode} #{e.faultString}", $@.join("\n")
end

実行すると、

hao@obs% ./hiki-getpage.rb
2歳の誕生日を記念して生い立ちをふりかえってみようかと。

写真が全部見たいぞという暇な人、お前のコメントなんかいらんのじゃ、
写真だけみせろや、
という人は[http://www.asahi-net.or.jp/~ad6h-ootk/cat/:title=こちら]へどうぞ。

* ご対面、そして引越し (2003/6/28 〜 2003/7/13)
* 我が家の家族に (2003/7/14 〜 2003/8/2)
* いたずらっ子になってきました (2003/8/5 〜 2003/9/26)
* 父子家庭 (2003/10/19 〜 2004/1/18)
* 満1歳 (2004/4/11 〜 2004/6/11)
* 最近写真撮ってもらえないの (2004/6/27 〜 2005/3/27)
hao@obs%

指定したページの本文が直接取れる。何故か入出力はEUCなので日本語もin/outともそのまま。
Hikiだといまいち嬉しさがわからんので調べてみると、郵便番号DBをXML-RPCで公開してるサイトがあったので、ここにアクセスしてみる。まずはイントロスペクションから。さっきのHikiのサンプルをもとにクライアントを作る。

hao@obs% cat yubin-introspection.rb
#!/usr/bin/env ruby
# yubin-introspection.rb
#
require 'xmlrpc/client'

xmlrpc_uri = 'http://yubin.senmon.net/service/xmlrpc/'

begin
server = XMLRPC::Client.new2( xmlrpc_uri )
puts server.call('system.listMethods')
rescue XMLRPC::FaultException => e
puts "Error: #{e.faultCode} #{e.faultString}", $@.join("\n")
end

実行するとあっさり答えが取れる。こんな簡単でいいのか?

hao@obs% ./yubin-introspection.rb
yubin.getVersion
yubin.getMaxFetchCount
yubin.getPrefName
yubin.postcodeExists
yubin.getFetchCountByPostcode
yubin.fetchAddressByPostcode
system.listMethods
system.methodHelp
system.methodSignature
system.multicall
hao@obs%

この中の"yubin.fetchAddressByPostcode"というメソッドを使ってみる。

hao@obs% cat yubin-getaddr.rb
#!/usr/bin/env ruby
# yubin-getaddr.rb
#
require 'xmlrpc/client'
require 'nkf'

xmlrpc_uri = 'http://yubin.senmon.net/service/xmlrpc/'

begin
server = XMLRPC::Client.new2( xmlrpc_uri )
addr_array = server.call('yubin.fetchAddressByPostcode', '2610013')
a = addr_array[0]
print %(pref:#{NKF.nkf('-e',a['pref'])}\n)
print %(city:#{NKF.nkf('-e',a['city'])}\n)
print %(town:#{NKF.nkf('-e',a['town'])}\n)
rescue XMLRPC::FaultException => e
puts "Error: #{e.faultCode} #{e.faultString}", $@.join("\n")
end

XML-RPCでは"struct"として定義されているpref,city,townなどが、xmlrpc.rbではハッシュとして表現されている。入出力は全てUTF8なので、画面出力時はNKFEUCに変換。

hao@obs% ./yubin-getaddr.rb
pref:千葉県
city:千葉市美浜区
town:打瀬

問い合わせる郵便番号に"%"を使うと、該当する住所リストが配列で返る。

hao@obs% cat yubin-getaddr-array.rb
#!/usr/bin/env ruby
# yubin-getaddr.rb
#
require 'xmlrpc/client'
require 'nkf'

xmlrpc_uri = 'http://yubin.senmon.net/service/xmlrpc/'

begin
server = XMLRPC::Client.new2( xmlrpc_uri )
addr_array = server.call('yubin.fetchAddressByPostcode', '26100%')
addr_array.each do |a|
print %(#{NKF.nkf('-e',a['pref'])})
print %(#{NKF.nkf('-e',a['city'])})
print %(#{NKF.nkf('-e',a['town'])}\n)
end
rescue XMLRPC::FaultException => e
puts "Error: #{e.faultCode} #{e.faultString}", $@.join("\n")
end
hao@obs% ./yubin-getaddr-array.rb
千葉県千葉市美浜区以下に掲載がない場合
千葉県千葉市美浜区幸町
千葉県千葉市美浜区新港
千葉県千葉市美浜区高浜
千葉県千葉市美浜区高洲
千葉県千葉市美浜区稲毛海岸
千葉県千葉市美浜区真砂
千葉県千葉市美浜区磯辺
千葉県千葉市美浜区打瀬
千葉県千葉市美浜区若葉
千葉県千葉市美浜区ひび野
千葉県千葉市美浜区美浜
千葉県千葉市美浜区中瀬(次のビルを除く)
千葉県千葉市美浜区豊砂
千葉県千葉市美浜区浜田
千葉県千葉市美浜区幕張西
hao@obs%

ん〜、素晴らしかとですー。