まえおき
忘れっぽい私。忘れることは決して悪気があるわけではないけど、結果的に忘れてしまって周りの方に迷惑をかける、何度となく。。。
どっか欠陥があるんでしょうね。覚えておくってことが嫌い。そういう人間の誤りを補佐してくれるのがITだと思っています。DXとまでいいませんが、ITに使われることなくITを活用したい。 いや、すべきだ そう願って生きています。
大学の出勤簿が紙から電子(ジョブカン)に変わりました。学内ネットでジョブカンさんのページにアクセスしてPUSHボタンを押せば、それまでの出勤状態の反対の状態にすることができます。要はトグル。
で、忘れっぽい私は、出勤しても押し忘れたり、退勤時に押し忘れたりして、あとで修正することになります。それを何とかしたい(GPSで勤務圏内に出入りしたら自動処理するという開発をされている方もいるようですが)、そこまで自動にしなくてもとにかく、出勤したとき、退勤する前に、気づくことを促して欲しい、そう考えていました。
で、ゼミ生の開発で余っていたランプつきのゲームボタンでちょっとしたコントローラを作ったんです。
これね、なかなかよかたんですよ。自分でいうのも恥ずかしいですが。押し忘れが激減しました。
でもね。。。これにも課題がありまして。。。
その1つが、Chromeのバージョンアップです。数週間使い続けているとChromeのバージョンアップを要求されます。バージョンアップするとArduinoとのシリアル通信が切れます。そのたびにChrome拡張を押して再接続する必要がありました。
また、ジョブカンにログインするには大学の認証(2要因)を通さなければならず、その有効期間が切れると再度、ログインする必要があります。これは避けられません。
ただ、シリアル通信の方はどうにかならないかと思いました。色々探しましたが、ブラウザからシリアル通信にアクセスするには必ずユーザのアクションが必要らしくどうにもならない様子でした。
ブラウザとシリアル通信していることが問題なのだと思いました。他のスクリプトならArduinoの通信にわざわざ許可は必要ないでしょうしね。。。Pythonとかで作ればいいんじゃないかって思ったんです。
Arduinoとの通信はまだ作っていませんが、とりあえず、ブラウザを制御して出勤状態を変えられるだろうか?をやってみました。それが以下になります。やっと本題です。
Seleniumでジョブカンの画面を制御する
参考にさせていただいたのは以下の記事です。ありがとうございます。
import time from selenium import webdriver import chromedriver_binary from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By # (1)プロファイルのオプション指定 options = Options() options.add_argument("--user-data-dir=/Users/ユーザ名/Library/Application Support/Google/Chrome/") options.add_argument("--profile-directory=Profile 1") # (2)Selenium実行後もChromeを開いたままにする # options.add_experimental_option('detach', True) # Chromeブラウザを開く driver = webdriver.Chrome(options=options) # ジョブカンのページを開きます driver.get("ジョブカンのURLをいれます") time.sleep(1) # (3)大学の2段階認証・開始(あくまで例ということで) user = driver.find_element(By.ID,"ユーザ名タグのID") user.clear() user.send_keys("ユーザ名") driver.find_element(By.ID,"ログインボタン").click() time.sleep(1) pw = driver.find_element(By.ID, "パスワードタグのID") pw.clear() pw.send_keys("パスワード") driver.find_element(By.ID,"ログインボタン").click() # 大学の2段階認証・終了(あくまで例ということで) # (4)ここからジョブカンの画面の操作になります。出勤状態(未出勤など)の状態を取得します。これは後々何かに使う予定です。 status = driver.find_element(By.ID, "working_status") print(status.text) #if status.text == "未出勤": # ジョブカン画面のPUSHボタンのIDが以下ですのでそれをクリックできます。 driver.find_element(By.ID, "adit-button-push").click() time.sleep(3)
一応、以下、番号をつけたところを解説します。
(1)Chromeのプロファイルは使った状態にしたいのでこの指定を書いています。2段階認証を通過した状態を保持して一定期間はその情報を使いたいからです。プロファイルの位置は、ChromeのURLのところに「chrome://version/」といれると、「プロフィール パス」という欄がありますので、そのパスの最後がprofile-directoryであり、その前の全部がuser-data-dirになります。
(2)Selenium実行後も開いたままにしたい場合はこれをTrueにする必要があります。デフォルトはFalseのようですのでコメントアウトすればSelenium実行後にChromeが閉じるようです。で、これをTrueにするのは2段階認証を通過させたいときですね。そのときに閉じてしまうと2段階認証の画面も閉じられてしまうので通すことができません。なので、2段階認証が必要といわれたら、そのときにTrueにしておいて通過させ、一度通過すれば一定期間は閉じてもいけるのでこれをコメントアウトします。面倒ですね。。。なんとかならないかなぁ。
(3)大学の認証(1段目)が必ず入りますので、これを自動化する処理です。タグ名などはお使いの環境によって変わると思いますのでご自身で調べてみてください(開発者ツールで調べてく感じになります)
(4)ここからログイン後にジョブカンの画面の自動操作する処理になります。とりあえず出勤状態を取得してみました。未出勤とかの文字列が取れます。出勤状態によって何か音を鳴らすとかしてみたいと思います。あとですね。あと、adit-button-pushがPUSHボタンのIDのようですので、これをclick()すれば自動で押すことができました。
1つ注意点があります。Chromeが開いた状態だと、このスクリプトは例外がでました(プロファイル指定だとみたいです)。なので、必ずChromeが落ちた状態でスクリプトを実行する必要がありました。ここは注意しましょう。
ということで、おしまい。あとはPythonスクリプトとArudinoをつなげて動かせるようにしたら。。。うまくいくかもですね。。。また続きをいつか書きます。