Python + Seleniumを使用して大学のオンライン講義の出席登録を自動化する

COVID-19感染防止のため2020年度前期の講義がオンライン形式で行われたため、その時に使用していたプログラムを公開します。 2020年度後期は対面形式へ戻る予定ですが、COVID-19の感染状況によって2020年度後期も講義がオンライン形式で行われることが確定しましたらこの記事は非公開にします。

1. 作成経緯

今回のプログラムを作成するきっかけとなった水曜日の2コマの講義の形式がこのようなものでした。

  1. 資料配布するから次の講義までに課題を解いて提出する
  2. 10:30~10:50の時間帯にWebClass1へログインして出席登録をする

資料をもとに課題をやるのはわかるのですがなぜわざわざ指定時刻帯にWebClassで出席登録を行わなければならないのか? 課題提出をもって出席とみなしても良いのでは? という点がこの講義の不満要素でした。 配布資料の内容はとてもわかりやすく、課題の難易度もそこまで高くなかったためこの不満要素が顕著に感じました。

ある日に、YouTubeこの動画を見てもしかしたら出席登録を自動化できるのでは?という考えました。 この動画をではプログラミングによってブラウザの操作を自動化していました。 この動画のようにブラウザの操作を自動化することによって出席登録を自動化できると考え実際に挑戦しました。

2. 作成したコードと解説

今回のプログラムはPythonSeleniumを使用しました。 コードの公開にあたって一部編集しています。

from selenium import webdriver
import time
from datetime import datetime
import sched

def Attend():
    driver = webdriver.Chrome()
    driver.maxmize_window()
    driver.implicitly_wait(3)

    url_login = '学内サービス'
    driver.get(url_login)
    time.sleep(3)

    USER = 'userid'#ログイン名
    element = driver.find_element_by_id('userid')
    element.clear()
    element.send_keys(USER)

    PASS = 'password'#パスワード
    element = driver.find_element_by_id('js-password')
    element.clear()
    element.send_keys(PASS)

    loginBtn = driver.find_element_by_name('login1')
    loginBtn.click()
    time.sleep(3)

    element = driver.find_element_by_id('myjikanwari-tab')
    element.click()
    time.sleep(3)
    
    period = 2 #時限
    week = 3 #曜日
    element = driver.find_element_by_xpath('/html/body/main/div[1]/div/div[2]/div/table/tbody/tr[' + str(period) + ']/td[' + str(week) + ']/form')
    element.click()
    time.sleep(3)

    driver.switch_to.windows(driver.window_handles[-1])

    element = driver.find_element_xpath('/html/body/header/nav/div[2]/div/ul[3]/li[4]/a')
    element.click()
    time.sleep(3)

    n = 10 #講義回数
    element = driver.find_element_xpath('/html/body/main/div/div/table/tbody/tr[' + str(n) + ']/td[1]/a')
    element.click()
    time.sleep(3)

    driver.switch_to.frame('contentsInfo')

    button = driver.find_element_by_name('next')
    button.click()
    time.sleep(3)

    driver.switch_to.frame('answer')

    radio = driver.find_element_by_id('1_1')
    radio.click()
    time.sleep(3)

    button = driver.find_element_by_id('GradeBtn')
    button.click()
    time.sleep(3)

    element = driver.find_element_by_name('grade')
    element.click()
    time.sleep(3)

    element = driver.find_element_by_xpath('/html/body/header/nav/div[2]/div/ul[1]/li[1]/a')
    element.click()
    time.sleep(3)

    driver.quit()

#実行時刻
hour = 10
minute = 35

now = datetime.now()
now = datetime(now.year, now.month, mow.day, now.hour, now.minute, 0)
comp = datetime(now.year, now.month, now.day, hour, minute, 0)
diff = comp - now

if int(diff.days) >= 0:
    scheduler = sched.scheduler(time.time, time.sleep)
    scheduler.enter(diff.seconds, 1, Attend)
    scheduler.run()

プログラムの設計はこのようになっています。

  1. 指定の時刻まで待機し、指定の時刻なったらブラウザを起動、学内サービスにログインする。
  2. 受講している科目のWebClassのページにアクセスして出席の登録を行う。

指定の時刻まで動作を待機するプログラムは以下の投稿を参考にしました。
指定の時間まで待機するpythonプログラム

Seleniumを使用してブラウザを操作するプログラムは以下の動画を参考にしました。
Pythonで面倒な「ブラウザ操作」や「データ収集」の作業を自動化しよう|Webスクレイピングのやり方をわかりやすく解説

3. 感想

Pythonプログラミング言語の中でもとくに人気がある言語であるためインターネット上に日本語の解説記事が多くあり、コードの記述はそこまで難しくなかったと思います。 100行にも満たない記述のコードでわざわざ出席の登録をするためだけに起きるというストレスが改善され、また、オンライン講義に出席したのにもかかわらず、WebClassでの出席の登録を忘れるというミスを無くすことができたのはとても素晴らしいことだと思いました。


  1. 日本の大学向けに開発された国産のLMS。弊学のみならず全国の多くの大学で導入されている模様。