のらぬこの日常を描く

ノージャンルのお役立ち情報やアニメとゲームの話、ソフトウェア開発に関する話などを中心としたブログです。

複数の翻訳サイトを連続使用

Web上には、多数の自動翻訳サイトがあります。

以前、仕事で英文を読む機会があり、その時に、ひとつの英文を複数の翻訳サイトに投げ、結果を一覧で表示するようなスクリプトを作りました。

その時作ったスクリプトですが、仕事で使うことはもうないと思いますが、勿体無いのでここに掲載します。

なお、今回掲載するスクリプトは、Webサーバ上でCGIスクリプトとして動作させることを想定しています。

動作イメージ

f:id:mikenekoDX:20100224130442p:image

*1

スクリプト本体

以下のスクリプトは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

http://route477.net/rubyscraping/?Mechanize

*1:原文は、http://www.icrosoft.com内から適当に持ってきました

*2:どうしても名前を変えたい場合、スクリプト内の『

』に記載されたファイル名も適宜書き換えてください。