=begin [概要] Mextractrサービス(http://api.emetadata.net/)をrubyから使うためのラッパークラス [作成] 2008-08-27 古川大輔(mogya at mogya.com) [用法] http://api.emetadata.net/からAPIキーを取得しておく必要があります。 #取得したAPIキーをつかってMextractrAPIクラスを生成 api = MextractrAPI.new('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') #解析したいテキストを渡す result = api.parse(text) 結果がどのように格納されているかは、 pp result して見てください。 おおよそ、普通の人が期待する形で格納したつもり。 =end require 'rexml/document' require 'kconv' require 'uri' require 'net/http' require 'cgi' class MextractrAPI Mextractr_api_url = 'http://api.emetadata.net/mextractr?text=[[text]]&out=[[out]]&apikey=[[apikey]]' @apikey = nil @log = nil @result=nil attr_reader :apikey,:result #デバッグ用のメソッドたち。new(APIKEY,log)のlog部分にloggerオブジェクトを渡すと出力されます。 def debug_out(text) if (@log) @log.debug(text.to_s) end end def debug_obj(obj,msg=nil) if (@log) @log.debug(msg.to_s+"\n"+PP.pp(obj,"")) end end def initialize(myapikey,mylog=nil) @apikey = myapikey @log = mylog if (@log) require 'pp' end end def parse(text) text_encoded = CGI.escape( CGI.escapeHTML(text.toutf8) ) #Mextractr APIを呼び出す uri = URI.parse( Mextractr_api_url.gsub('[[text]]',text_encoded).gsub('[[out]]','atom').gsub('[[apikey]]',@apikey) ) debug_out("uri:"+uri.to_s) response = nil Net::HTTP.start(uri.host,uri.port){|http| #getじゃなくてpostする。 # response = http.get(uri.request_uri) response = http.post(uri.path,uri.query) } debug_out "response(atom):\n"+response.body.toutf8 #得られた結果を解析 doc= REXML::Document.new(response.body.toutf8) @result = {} @result['response'] = response.body.toutf8 @result['id'] = doc.elements['feed/entry/id'].text @result['updated'] = doc.elements['feed/entry/updated'].text @result['content'] = doc.elements['feed/entry/content'].text doc.elements.each("feed/entry/gd:who"){|elem| @result['who'] = [] if(!@result['who']) item = {} item['valueString'] = elem.attributes['valueString'] @result['who'] << item } doc.elements.each("feed/entry/gd:when"){|elem| @result['when'] = [] if(!@result['when']) item = {} item['valueString'] = elem.attributes['valueString'] item['startTime'] = elem.attributes['startTime'] @result['when'] << item } doc.elements.each("feed/entry/gd:where"){|elem| @result['where'] = [] if(!@result['where']) item = {} item['valueString'] = elem.attributes['valueString'] item['georss:point'] = elem.elements['georss:point'].text rescue nil @result['where'] << item } doc.elements.each("feed/entry/gd:extendedProperty"){|elem| @result[elem.attributes['name']] = [] if(!@result[elem.attributes['name']]) item = {} item['valueString'] = elem.attributes['value'] if ('how-much'==elem.attributes['name']) item['currencyID'] = elem.elements['cbc:Amount'].attributes['currencyID'] item['value'] = elem.elements['cbc:Amount'].text end @result[elem.attributes['name']] << item } debug_obj(@result,"result:") return @result end end =begin [更新履歴] 2008-08-27 D.Furukawa とりあえず作ってみた。帰り値、これでいいかなぁ? =end