FLYING

/* TODO: 気の利いた説明を書く */

東工大ポータルにログイン

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