さらに赤面ソースコードをリファクタリングしてみた
前回のソースコードにアドバイスをもらったのでさらにリファクタリングしてみました。
このリファクタリングする前にスクリプト走らせる前のyes/noのチェッカやら付けてクラスが肥大化してたのでMechanizeの部分だけをクラス抽出してます。
#encoding:utf-8 require 'rubygems' require 'mechanize' require 'kconv' class IntentLotteryUnit INTENT_URL = 'http://www.hyogo-park.or.jp/yoyaku/intention/auth.asp?ch=0' LOGOUT_URL = "http://www.hyogo-park.or.jp/yoyaku/kaiin/logout.asp" def initialize @agent = Mechanize.new end def check_unit(id, pass, name, date, range_time, out_file) access login(id, pass) write_down_already_verified(id, pass, name, out_file) verify_intent(id, pass, name, date, range_time, out_file) logout end private def access @agent.get(INTENT_URL) end def login(id, pass) @agent.page.form_with(:name => 'form1') do |f| f.field_with(:name => 'mem_number').value = id f.field_with(:name => 'mem_password').value = pass f.click_button(f.button_with(:value => ' 次 へ ')) end end def write_down_already_verified(id, pass, name, out_file) @agent.page.search('tr/td/table[@width="400"]')[0..50].each do |p| if /予約は承認されました/ =~ p.inner_text date_time = capture_date_time(p) write_down(date_time, id, pass, name, "予約済み\n", out_file) end end end def verify_intent(id, pass, name, date, range_time, out_file) approvals = @agent.page.links_with(:text => '予約承認確認') approvals.each do |apr| apr.click date_time = capture_date_time_in_aprove write_down(date_time, id, pass, name, "\n", out_file) if date == date_time[0] && range_time == date_time[1] @agent.page.form_with(:name => 'form1') do |f| f.submit(f.button_with(:name => 'submi2')) end end end end def logout @agent.page.link_with(:href => LOGOUT_URL).click end def capture_date_time_in_aprove p = @agent.page.at('form/table[@width="400"]/tr/td/table[@width="400"]') capture_date_time(p) end def capture_date_time(p) date_time = [] date_time << $1 if /([0-9]*年[0-9]*月[0-9]*日)/ =~ p.inner_text date_time << $1 if /([0-9]*時〜[0-9]*時)/ =~ p.inner_text end def write_down(date_time, id, pass, name, eol, out_file) line = [date_time, id, pass, name, eol].join(',') puts(line) out_file.print(line) end end
友人にコード見てもらってすごいコードがすっきりしてうれしかったけど、少しくやしい。
verify_intent()と言いつつも意思確認をまだ行っていない日付を書き下す処理も入ってるのでここらへんもどげんかせんといかん。
追記:RubyのMechanizeはkitamomongaさんの記事
RubyのMechanizeを解説 for 1.0.0で学びました。そろそろお礼をせんといかん。