以下のつづきです。
それ以前にJavascriptでジョブカンコントローラ(←公式ではなくただの自作品です、ご注意を)のボタン押下からジョブカンページを制御してというプログラムを作成して個人的に活用してきましたが、ブラウザはセキュリティが厳しいのでシリアル通信を開始するときに必ずユーザのアクションが必要という問題を回避するためブラウザ外のスクリプトでシリアル通信を受け取ってブラウザをSeleniumで制御すれば少しは問題を減らせるかな?ということで試行したのが上記の記事でした。
で、上記はSeleniumの部分だけ試したのでpyserialを使ってシリアル通信(ジョブカンコントローラがArduinoのため)を受け取って制御する部分や、あとユーザのアクションをシステムが受理したのか通知するため音を鳴らすようにしてみました。以下がソースになります。色々とググったもののツギハギです。
import sys import time import subprocess import serial from selenium import webdriver import chromedriver_binary from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By def check_status(): try: #ジョブカンページのステータスを読み取る status = driver.find_element(By.ID, "working_status") print(status.text) except: print("2段階認証を通してから再度実行してください") subprocess.call(["afplay", "warn.mp3"]) sys.exit(1) if status.text == "勤務中": subprocess.call(["afplay", "on.mp3"]) ser.write(bytes('I','utf-8')) else: subprocess.call(["afplay", "off.mp3"]) ser.write(bytes('O','utf-8')) # オプションの設定 options = Options() options.add_argument("--user-data-dir=/Users/ユーザ名/Library/Application Support/Google/Chrome") options.add_argument("--profile-directory=Default") # Selenium実行後もChromeを開いたままにする options.add_experimental_option('detach', True) # Chromeブラウザを開く try: driver = webdriver.Chrome(options=options) except: subprocess.call(["afplay", "warn.mp3"]) print("Chromeインスタンスをすべて終了してください") sys.exit(1) # 現在のタブでページを開く driver.get("ジョブカンページのURL") time.sleep(2) # 大学の認証(省略します) # シリアル通信開始 ser = serial.Serial('/dev/cu.usbserial-1410', 9600) check_status() while True: val_arduino = repr(ser.readline().decode()[0]) # ジョブカン画面のPUSHボタンを押す driver.find_element(By.ID, "adit-button-push").click() time.sleep(1) check_status()
とりあえず、最初にジョブカンに認証を通して、あとはシリアル通信の受信待ちになる感じです。ジョブカンコントローラのボタンが押されたらジョブカンページのPUSHボタンを押す感じになります。
まだ、1日以上の運用はしていないのでこのままの状態でChromeがどうなるかわかっていません。連続して押下して反応すること(ブラウザは最初に起動したあとずーっと起動しっぱなしになる)、二段階認証を通したあとは二段階認証の有効期限が切れたらタグの取得とかで例外が発生するはずなのでその辺もまだ調整が必要というところです。
シリアル通信(の許可を人がする問題)はPython化することで回避できるようになったのですが、二段階認証についてはどうにも解決できていません。手動でやるしかないという感じです。調べると、それも自動化できるという話もあるようですが。。。そこまでしたいわけではないので。。。
どうしたものかな。。。というところです。
要は「出勤したとき」「退勤するとき」に学内ネットの範囲にいる間に自分が忘れていることに気づかせる仕組みがあればいいわけで。。。研究室のWifiを検知したり圏外になったら通知する仕組みとか調べましたが完全にはならないように思います。
結局はドア前に「ジョブカン押したか?」とかポスター貼ればいいじゃん。。。という感じもしてくるんですね。。。
HCI(Human Computer Interaction)というのはそういうバランスの上に成り立っているところが面白いと思います。
とりあえず、もうしばらく考えてみます。