かさやぬすの日記

後で思い出したいことを書く

大学ポータルサイトに自動ログインするスクリプト作ってみた【Python】

大学の成績管理や講義の履修申告をするためには毎回パスワードや学生証のマトリックスコードを打ち込んでログインしなければいけません。

これがかなりめんどくさかったので今回、この認証を自動化するPythonスクリプトを作りました。

もちろんポータルサイトは大学ごとに異なるので、他の大学のポータルサイトでこのスクリプトを使うことはできませんが、アイディア自体は難しくないので、自分の大学用の自動ログインスクリプトも簡単に作れると思います。

今回は自分の大学のポータル自動ログインスクリプトを紹介します。



1. 大学ポータルサイトの認証の仕組み
自分の大学のポータルサイトへのログインの仕組みについて簡単に説明します。

まず、ポータルサイトのURLを開いたら同意(マトリクス/OTP認証)をクリックします。

f:id:kasayanus:20181027113214p:plain


次の画面で学籍番号とパスワードを入力して"OK"をクリックします

f:id:kasayanus:20181027113320p:plain


最後に学生証の裏にかかれているマトリックスコードからサイトで指定された要素を3つ入力して"OK"を押したら認証完了です

f:id:kasayanus:20181027120627p:plain




2. 自動ログインスクリプトの仕組み

使うのはseleniumというライブラリです。これは、ブラウザをプログラムで操作するための機能がまとめられたものです。

(seleniumは使いこなせればブラウザでの操作はすべて自動化することができるので夢が広がります。)

1. seleniumの関数を使ってブラウザオブジェクトを生成する。

2. ブラウザオブジェクトにサイトのURLを入力する。

3. サイトのソースコードを解析してパスワード入力部分やマトリックス認証で必要な文字(上の画像のA4,C7,D1)を含むDOM要素をCSSセレクターで見つける.

4. ブラウザオブジェクトにパスワードやマトリックスの要素を指定したDOM要素に入力するように指示したあと、"OK"ボタンをクリックさせる。

以下は実際のコードになります。


from selenium import webdriver
from selenium.webdriver.firefox.options import Options

USER="学籍番号"
PASS="パスワード"

matrix={'A':{},'B':{},'C':{},'D':{},'E':{},'F':{},'G':{},'H':{},'I':{},'J':{}}
'''
マトリックスコードの各要素はここで具体的に入力する
'''

def send_matrix_key(i):
	text=browser.find_element_by_css_selector("body > center:nth-child(5) > form > table > tbody > tr > td > table > tbody > tr:nth-child("+i+") > th:nth-child(1)").text
	key_alphabet=text[1]
	key_number=text[3]
	e=browser.find_element_by_css_selector("body > center:nth-child(5) > form > table > tbody > tr > td > table > tbody > tr:nth-child("+i+") > td > div > div > input")
	e.send_keys(matrix[key_alphabet][int(key_number)-1])


browser=webdriver.Chrome()#ブラウザオブジェクトを生成


url_login="https://portal.titech.ac.jp/"
browser.get(url_login)

e=browser.find_element_by_css_selector("input[value='同意(マトリクス/OTP認証)']")
e.click()

e=browser.find_element_by_css_selector("input[name='usr_name']")
e.send_keys(USER)

e=browser.find_element_by_css_selector("input[name='usr_password']")
e.send_keys(PASS)

e=browser.find_element_by_css_selector("input[name='OK']")
e.click()

#マトリックス認証を行う
send_matrix_key("5")
send_matrix_key("6")
send_matrix_key("7")

e=browser.find_element_by_css_selector("input[name='OK']")
e.click()