TL;DR
keio.jpに自動でログインする簡単な方法についてのメモ
自動ログイン
1. Webサイトの調査
keio.jp(正式名称は"Keio Single Sign-On System")にログインするとき,次のようなページ遷移(HTTP Request)を辿っています。
-
http://www.keio.jp
(Top page) -
https://auth.keio.jp
(SSO login page) -
https://gslbs.adst.keio.ac.jp/student/index.html
(Syllabus page) -
https://www.edu.keio.jp/ess2/login?
(Class support page)
このように、閲覧までにページ遷移(サーバ側との情報の受け渡し)が発生するウェブサイトを動的サイトと呼び、URLに飛べばすぐに閲覧可能なブログなどの静的サイトと区別されます。
なお、現代的なウェブサイトは、フロントエンドにはJavaScript(リクエスト毎にHTMLを生成する)、バックエンドにはRDBとそれを処理するスクリプト(リクエスト毎にデータを処理する)が仕込まれていることがほとんどですから、多くが動的サイトになります。
2. ツール選定
Web上のURLにアクセスする処理をコーディングするときに,BeautifulSoupのようなWebスクレイピングライブラリでは、Javascriptやページリダイレクションを含む動的なWebサイト(例:keio.jp)には対応できないため不十分です。そこで今回は、Pythonの動的なWebスクレイピングライブラリSeleniumと,Google Chromeをコマンドラインで制御するためのブラウザ専用のドライバとしてChromeDriverを使うことにします.
-
Seleniumのインストール方法については,公式リファレンスを読んでください(大抵の場合,
pip install selenium
でOKです). - ChromeDriverのインストール方法についても,Seleniumのドキュメントページを参考にしてください(Win/Mac環境のちがいに注意!).
ChromeDriverを用いて、仮想的なブラウザ環境を作ることで、ユーザがサイト内でページ遷移する動作を、スクリプト上で再現できます。
3. スクリプト実装
K大の学生であれば、以下のスクリプトを使ってkeio.jpに自動ログインすることができます.あなたの学内メールアドレスとパスワードを入力し,Pythonの実行環境が整ったマシンに対してコマンドラインから命令を実行してください.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
ID = "*****" # Please fill in your e-mail address at keio.jp (yukichi.fukuzawa@keio.jp)
PW = "*****" # Please fill in your password in keio.jp
# Optional settings of chrome driver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
# Boot chrome driver
driver = webdriver.Chrome("/usr/local/bin/chromedriver", options=options)
driver.set_page_load_timeout(15) # Time out 15 sec
# GET (HTML Page)
driver.get("https://auth.keio.jp")
# Find elements and POST (send keys to the input tag)
id_element = driver.find_element_by_name("j_username")
id_element.send_keys(ID)
pw_element = driver.find_element_by_name("j_password")
pw_element.send_keys(PW)
# Click login button
login_button = driver.find_element_by_name("_eventId_proceed")
login_button.click()
# GET (HTML Page)
driver.get("https://gslbs.adst.keio.ac.jp/student/index.html")
# GET (HTML Page)
driver.get("https://www.edu.keio.jp/ess2/login?")
# Close chrome driver
driver.quit()
SSO認証が終われば,HTTPリクエストによってHTMLファイルを取得し,好きなように必要な情報を取り出すことができます.