memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ジョブカンコントローラ+Seleniumで出退勤してみる

以下のつづきです。

memorandums.hatenablog.com

それ以前に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化することで回避できるようになったのですが、二段階認証についてはどうにも解決できていません。手動でやるしかないという感じです。調べると、それも自動化できるという話もあるようですが。。。そこまでしたいわけではないので。。。

tanuhack.com

どうしたものかな。。。というところです。

要は「出勤したとき」「退勤するとき」に学内ネットの範囲にいる間に自分が忘れていることに気づかせる仕組みがあればいいわけで。。。研究室のWifiを検知したり圏外になったら通知する仕組みとか調べましたが完全にはならないように思います。

結局はドア前に「ジョブカン押したか?」とかポスター貼ればいいじゃん。。。という感じもしてくるんですね。。。

HCI(Human Computer Interaction)というのはそういうバランスの上に成り立っているところが面白いと思います。

とりあえず、もうしばらく考えてみます。