複数の翻訳サイトを連続使用
Web上には、多数の自動翻訳サイトがあります。
以前、仕事で英文を読む機会があり、その時に、ひとつの英文を複数の翻訳サイトに投げ、結果を一覧で表示するようなスクリプトを作りました。
その時作ったスクリプトですが、仕事で使うことはもうないと思いますが、勿体無いのでここに掲載します。
なお、今回掲載するスクリプトは、Webサーバ上でCGIスクリプトとして動作させることを想定しています。
動作イメージ
スクリプト本体
以下のスクリプトはWebサーバのcgiスクリプトとして動作するように作られています。
cgiスクリプトとして利用する場合、ファイル名を etoj.rb という名前で保存してください*2
Webサーバが用意出来ない等の理由で、ローカル環境で動作させたい場合、
原文をファイルから読むようにする、html出力を外す等、適宜改変してご使用ください。
do_transition メソッドはほぼ再利用可能だと思います。
#!/usr/bin/env ruby print "Content-type: text/html\n\n" require 'rubygems' require 'mechanize' require 'hpricot' require 'cgi' cgi = CGI.new SITE_NAME = 0 # [0] site name SITE_URL = 1 # [1] url INPUT_FORM = 2 # [2] name of form TEXT_FROM = 3 # [3] name of from_textarea TEXT_TO = 4 # [4] name of to_textarea TRNS_OPT_TYPE = 5 # [5] option type LIST, RADIO TRNS_OPT_NAME = 6 # [6] name of mode_select_option TRNS_OPT_VAL = 7 # [7] name of value_select_option def do_transition input return if input == "" begin arrayPage = Array.new arrayPage[0] = [ 'excite', 'http://www.excite.co.jp/world/', 'world', 'before', 'after', 'LIST', 'wb_lp', 'ENJA' ] #exciete arrayPage[1] = [ 'yahoo', 'http://honyaku.yahoo.co.jp/transtext', 'textFormEntry', 'text', 'trn_text', 'RADIO', 'eid', 0 ] # yahoo arrayPage[2] = [ 'infoseek', 'http://translation.infoseek.co.jp/?ac=Text&lng=en', 'text', 'original', 'converted', 'RADIO', 'selector', 0 ] # infoseek arrayPage[3] = [ 'so-net', 'http://www.so-net.ne.jp/translation/cgi-bin/text.cgi', 1, 'text', 'result', 'NONE', '', 0 ] # so-net agent = Mechanize.new # agent.gzip_enabled = false # debug(Mechanize > 1.0.0 ) arrayPage.each do |pageInfo| # get input page page = agent.get( pageInfo[SITE_URL] ) # get input form if pageInfo[INPUT_FORM].kind_of?(String) formTransition = page.form( pageInfo[INPUT_FORM] ) elsif (pageInfo[INPUT_FORM]).kind_of?(Integer) formTransition = page.forms[ pageInfo[INPUT_FORM] ] end # set input text formTransition[ pageInfo[TEXT_FROM] ] = input # select transition option if pageInfo[TRNS_OPT_TYPE] == 'COMBO' formTransition[ pageInfo[TRNS_OPT_NAME] ] = pageInfo[TRNS_OPT_VAL] elsif pageInfo[TRNS_OPT_TYPE] == 'RADIO' formTransition.radiobuttons_with( pageInfo[TRNS_OPT_NAME] ) [ pageInfo[TRNS_OPT_VAL] ].check end # submit result=formTransition.click_button # print site name print "[" + pageInfo[SITE_NAME] + "]<br />" # print transition result if pageInfo[INPUT_FORM].kind_of?(String) print result.form( pageInfo[INPUT_FORM] )[ pageInfo[TEXT_TO] ] elsif pageInfo[INPUT_FORM].kind_of?(Integer) print result.forms[ pageInfo[INPUT_FORM] ][ pageInfo[TEXT_TO] ] end print "<br /><br />" end rescue print "error.\n" end end strdata = cgi["input"] print <<EOM <html> <head> <title>transition</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> </head> <body> <form action="etoj.rb" method="post"> <textarea name="input" cols="80" rows="10">#{strdata}</textarea><br /> <input type="submit" value="EtoJ"> </form> #{do_transition( strdata )} </body> </html> EOM
スクリプト解説
今回は、RubyでWebサイトの入力操作を自動化する Mechanize というライブラリを使用しています。
Mechanize については、以下のサイトさまを参考にさせていただきました。感謝です。
http://route477.net/d/?date=20070205
http://d.hatena.ne.jp/kitamomonga/20100208/ruby_mechanize_1_0_0
*1:原文は、http://www.icrosoft.com内から適当に持ってきました