読者です 読者をやめる 読者になる 読者になる

FLYING

〈全日本・紀文豆乳飲料シリーズ「麦芽コーヒー」の500ミリリットルパックを扱う小売店が少ないことに遺憾の意を表明する会〉活動記録

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

ruby

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