それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ゆうちょ銀行のスクレーパー

ゆうちょ銀行にログインして、データ取り出すruby スクリプト。



require 'rubygems'
require 'kconv'
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
require 'mechanize'

class YuchoBank
  attr_accessor :password, :passphrase_list, :id, :password,:m
  def initialize()
    self.password = ""
    self.passphrase_list = {} #合言葉の質問と回答ペア
    self.id = ""
    self.password = ""
    @is_login
  end
  def login()
    self.start
    self.send_id
    self.send_aikotoba1 # first_time
    self.send_aikotoba2 # second_time
    self.send_password # パスワードを送る。
    @is_login = true
  end
  def start() @m = Mechanize.new end
  def send_id
    id= self.id.split('-')
    @m.get START_URL
    #お客様番号を入れる。
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou1"}).first.value = id[0]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou2"}).first.value = id[1]
    @m.page.forms[0].fields_with({:name=>"okyakusamaBangou3"}).first.value = id[2]
    self.send_request("次")
  end
  alias send_aikotoba1 send_aikotoba
  alias send_aikotoba2 send_aikotoba
  def send_aikotoba()
    return :skip unless @m.page.title =~ /合言葉/
    q_text = @m.page.search('div.loginbox table td span.bold').first.text #合言葉の質問を探す。
    #合言葉の回答入力エリア
    e = @m.page.forms[0].field_with(:name=>"aikotoba")
    #合言葉の入力
    e.value = passphrase_list[q_text]
    #合言葉の送信
    self.send_request("次")
  end
  def send_password()
    #パスワードを入力
    e = @m.page.forms[0].field_with(:type=>"password")
    e.value = password
    self.send_request("ログイン")
  end
  def send_request(button_name)
    #JavaScriptのsend_requestをFakeする。
    button = @m.page.search('//input[contains(@value,"'+button_name+'")]').first
    #ボタンを押した時に遷移する。URLを指定する。
    action = button.attr('onclick').split(',')[1].gsub(%r"'", "") #=> ex "https://direct3.jp-bank.japanpost.jp/tp1web/U010701BLC.do"
    @m.page.forms[0].action = action
    # event のフィールドに値を入れる。
    event_value = button.attr('onclick').match(/new Array\('([^']+)'\),false/)[1]
    @m.page.forms[0].fields.select{|e| e.name == "event"}.first.value = event_value
    @m.page.forms[0].submit
  end
  ####ログイン後に使う。
  #ホーム
  def go_home()
    self.send_request("ホームヘ") if @is_login
  end
  #残高照会
  def zandaka_shokai()
    self.send_request("現在高照会") if @is_login
  end
  def go_page(button_name)
    self.send_request(button_name) if @is_login
  end
  def current_page
    @m.page
  end
  def current_page_body
    @m.page.body.toutf8
  end
end



view raw
yucho_bank.rb
This Gist brought to you by GitHub.