東工大ポータルにログイン
WWW::Mechanize及びHpricotを利用して東工大ポータルにログインしてみるテスト。アカウントIDとパスワード及びマトリックスコードを平文で保存することになるので,そのセキュリティリスクを理解した方のみご利用ください。
最初にgetするURIを適当な外部のサイトにすれば,東工大無線LANのログインに利用できる予感。
login_titech_portal.rb
#!ruby -Ks require 'rubygems' require 'mechanize' require 'hpricot' # author: # -- tondol (http://d.hatena.ne.jp/tondol/) # environment: # -- Ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] # -- RubyGems (1.3.2) # -- Hpricot (0.8.1) # -- WWW::Mechanize (0.9.2) user_name = "your_name" user_password = "your_password" matrix_code = { 'A' => "XXXXXXX", 'B' => "XXXXXXX", 'C' => "XXXXXXX", 'D' => "XXXXXXX", 'E' => "XXXXXXX", 'F' => "XXXXXXX", 'G' => "XXXXXXX", 'H' => "XXXXXXX", 'I' => "XXXXXXX", 'J' => "XXXXXXX", } # パーサーをHpricotにしてインスタンス化 WWW::Mechanize.html_parser = Hpricot agent = WWW::Mechanize.new # タグや属性が大文字だとパース失敗するので適当に小文字に変換 agent.post_connect_hooks << lambda {|params| params[:response_body] = params[:response_body].gsub("INPUT", "input").gsub("NAME", "name") } # ポータルトップからマトリックス認証へ agent.get('http://portal.titech.ac.jp/') agent.page.form_with(:name => "login2") {|f| f.submit } # アカウントIDとパスワードを入力 agent.page.form_with(:name => "login") {|f| f.field_with(:name => "usr_name").value = user_name f.field_with(:name => "usr_password").value = user_password f.submit } # マトリックスコードを入力 agent.page.form_with(:name => "login") {|f| messages = agent.page.body.scan(/\[([A-J]),([1-7])\]/) messages.size.times {|i| col = messages[i][0] row = messages[i][1].to_i - 1 code = matrix_code[col][row].chr f.field_with(:name => "message#{i+2}").value = code; } f.submit } # タイトルだけ表示してログイン確認 puts agent.page.title