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なので、画面出力時はNKFでEUCに変換。
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%
ん〜、素晴らしかとですー。