TECH-MICCHON.jar

Scalaを中心に技術的な話題を書きます。

東工大ポータルにSeleniumでブラウザから自動ログイン

東工大ポータルにSeleniumで自動ログイン

自分の大学のポータルサイトには二段階認証が付いており、それは一時的にtokenを発行するようなものではなく、よくネットバンキングで使われるようなマトリックス認証である。

セキュリティ的には幾分強くなるのだが、ちょっと使い勝手は悪い(Google二段階認証を使わせてくれないだろうか…)。

そこで、ちょっと不便な現状を打破すべく自動ログインツールを作ろうと思った。

一方、「東工大ポータル 自動ログイン」でぐぐってみると結構な数の「ログインツールつくってみた」系の記事がヒットする。 じゃあこれでは二番煎じなのじゃ…と思ったけど、既存のツールはだいたい

の二種類しかなさそうというのが、ちょっと調べてみて分かった。

そこで今回作ったのはブラウザを操作して自動ログインするツールである。

github.com

追記

より安全な方法に実装を変更し、それにともなって使い方の章を修正しました。

使い方

拙い英語で README.md に記したのだが、大事なことなのでここでもまた説明する。

準備

以下のフローでこのスクリプトを動かす環境ができる。

  • firefox を用意する
  • $ make
  • $ make build.<your os>
    • your os というのは macox, linux64, win64 である。

ログイン(追記)

以前の方法ではリポジトリに直にパスワードを置くためセキュリティに問題があった。 ここで、pitというライブラリを使い、設定ファイルを外に置くことにした。 設定の方法は、make したあとに

$ vi ~/.pit/default.yaml
titech:
  usr_name: YOUR_USER_NAME
  usr_password: YOUR_PASSWORD
  usr_matrix: ['xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx', 'xxxxxxx']

default.yaml を編集すればOK。 usr_matrix はAからJまでの列にあるアルファベットを配列でflfejfewみたいに記入する。

ログインする

  • $ make login

これでOK。

実装

Selenium-webdriverを使って簡単なスクリプトRuby で書いてみた。簡単に説明していく。

@driver = Selenium::WebDriver.for :firefox

これでブラウザを操作するドライバーインスタンスを作っている。これがSeleniumスクレイピングするときのすべての始まり。

以下は、細々とした実装になってしまった。

@driver.get 'https://portal.nap.gsic.titech.ac.jp/GetAccess/Login?Template=userpass_key&AUTHMETHOD=UserPassword'
usr_name = @driver.find_element(:name, 'usr_name')
usr_name.send_keys(@usr_name)
usr_pass = @driver.find_element(:name, 'usr_password')
usr_pass.send_keys(@usr_password)
@driver.find_element(:name, 'OK').click

sleep 3

ここで Basic 認証を突破している。

@driver.find_element(:name, 'usr_name') でIDを入力するelementを見つけてきて、そこにusr_nameを入力。

passwordの部分も同じである。

sleep 3 は認証してレスポンスが返ってくるまで時間がかかってしまい、waitしないとエラーになるため入れいている。

def get_password_value_from_message(message)
  @usr_matrix[message[0]][message[1] - 1]
end

def get_message_value_from_xpath(element)
  [element.text[1], element.text[3].to_i]
end

xpath_list = [
  '/html/body/center[3]/form/table/tbody/tr/td/table/tbody/tr[5]/th[1]',
  '/html/body/center[3]/form/table/tbody/tr/td/table/tbody/tr[6]/th[1]',
  '/html/body/center[3]/form/table/tbody/tr/td/table/tbody/tr[7]/th[1]'
]

pass_list = [
  @driver.find_element(:name, 'message3'),
  @driver.find_element(:name, 'message4'),
  @driver.find_element(:name, 'message5')
]

message_value = xpath_list.map { |e|
  get_message_value_from_xpath(@driver.find_element(:xpath, e))
}

pass_list.zip(message_value).map { |pass, message|
  pass.send_keys(get_password_value_from_message(message))
}

@driver.find_element(:name, 'OK').click

これは、xpathマトリックス認証に必要な要素を見つけて来て、そこから必要なアルファベットを取得している。 この部分が一番実装していて面倒だった。

最後に

東工大ポータルのログインツールは色々調べてみたので、あとでまとめてみても面白そうな気がした。