無線ルータAtermを再起動するPythonスクリプト

自宅のルータ兼無線アクセスポイントが、勝手に再起動することがこの夏から二度ほど発生しました。当日の室温が高かったせいかもしれないが、たとえば在宅勤務中に不意に再起動したら業務に支障も出るので、予防的に週に2度、インターネットをほぼ使用していない時間帯に、定期的に再起動をかけることにしました。
我が家で使用している機種は、NEC Aterm WG2600HP3 (PA-WG2600HP3)。このAtermの管理画面には再起動をスケジューリングするような機能は無く、定期的な再起動の仕掛けは自ら用意する必要があります。そこで、管理画面をSeleniumで操作して再起動まで自動で行うPythonスクリプトを用意し、これを、24時間稼働しているサーバにてcron実行するようにしました。
0 7 * * mon,thu timeout 5m /home/USERNAME/script/reboot_aterm.py
ちなみに、cron設定時刻の月曜・木曜の朝 (07:00) というのは家庭ごみを出すタイミングと同じで、これだと、自宅回線のインターネットがいつ途絶えるかを家族も覚えやすいためです。
Atermを再起動するスクリプトreboot_aterm.py
は次のように簡単な内容ですが、もし参考になればと思いご紹介です。
#!/usr/bin/env python3 # reboot_aterm.py (Ver.20220118) import sys import time from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.alert import Alert username = 'admin' password = 'Atermの管理者パスワード' url = 'http://'+username+':'+password+'@192.168.10.1/index.cgi/reboot_main.html' timeout = 10 options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=options) def wait_element(attribute, target): try: if attribute == 'ID': element_present = EC.presence_of_element_located((By.ID, target)) elif attribute == 'CLASS_NAME': element_present = EC.presence_of_element_located((By.CLASS_NAME, target)) elif attribute == 'XPATH': element_present = EC.presence_of_element_located((By.XPATH, target)) elif attribute == 'CSS_SELECTOR': element_present = EC.presence_of_element_located((By.CSS_SELECTOR, target)) WebDriverWait(driver, timeout).until(element_present) except TimeoutException: print('ERROR: Timed out waiting for page to load. %s = %s' % (attribute, target), file=sys.stderr) driver.quit() sys.exit(1) else: return True driver.get(url) wait_element('CSS_SELECTOR', '.btn.blue') # 「再起動」ボタン driver.find_element_by_css_selector('.btn.blue').click() time.sleep(2) Alert(driver).accept() time.sleep(5) driver.quit()
P.S. 小物スクリプトを私はこれまで手慣れたPerlで書くことが多かったが、最近は勉強のため、とりあえずPythonで書いてみるようにしています。Pythonは、ウェブ上の知見も多いし、比較的少ないコード量で思った以上のことを実現できるような感覚があり、触ってて楽しいです。