リモートワークで面倒な作業の一つとして挙げられるのが打刻です。
会社によっては出退勤に加え、昼休みの開始、終了時にも打刻が必要なため、最大で1日4回もの打刻が必要です。
私もリモートワークをしており、1日4回の打刻に加え、WebサイトのセッションID(ログイン情報)が1時間で切れるため、打刻のたびにログインする必要があり、非常に煩わしさを感じています。
この記事ではそんな面倒な打刻をSeleniumで自動化する方法をご紹介します。
今回はグループウェアの一つである「desknet’s NEO」を例として解説していきますが、サイボウズOfficeやrakumoなどの他社サービスでも手順は同じです。打刻をブラウザで行う場合、手順は同じですので「desknet’s NEO」を使っていないという方でも是非参考にしてみてください。
この記事でできるようになること
- スクリプトファイルを実行させておくだけで打刻できる
- 打刻に限らずブラウザ操作を自動化できる
開発の下準備
必要なモノ
- Python3
- Pythonパッケージ
- Selenium
- webdriver-manager
- Google Chrome(ドライバーを差し替えれば他のブラウザでも可)
Python3がインストール済みかどうかは、ターミナルで下記コマンドを実行して、Pythonのバージョンが表示されていれば問題ありません。
python3 -V
Python 3.10.2
インストールされていない場合、Pythonの公式ホームページからダウンロードしてください。
ブラウザ自動操作に必要なPythonライブラリ
ブラウザ操作を自動化するためのフレームワークです。
Webアプリケーションのテストを目的としてリリースされました。その他にも、パソコン上で行う日常業務の自動化や、Webサイトの情報を収集して欲しい情報だけを抜き出すスクレイピングにも活用されています。
ブラウザを制御するためのドライバです。
ブラウザ操作を自動化するには、ブラウザごとに異なる専用のドライバが必要です。通常、パソコンにインストールされているブラウザとそのバージョンに合わせてドライバを用意する必要があります。
しかし、webdriver-manager
を使えば、インストールされているブラウザとバージョンを検出して、それに合わせたドライバを自動でインストールしてくれます。
今回はGoogle Chromeを採用しますが、専用のドライバーを使えばFirefoxやEdgeなどを使ったブラウザ操作も可能です。ブラウザごとの使い方についてはこちらが参考になります。
自動打刻プログラムの実装
今回作成するプログラムの流れは下記のとおりです。
- 打刻用のWebサイトを開く
- ログイン画面でIDとパスワードを入力してログイン
- タイムカード画面に移動
- 打刻
最初に、ブラウザの自動操作に必要なパッケージをインストールしておきます。プログラム定期実行させるために必要なschedule
もインストールしておきます。
pip3 install selenium webdriver-manager schedule
次に、新規でPythonファイル(今回はdesknets.py
)を作成して、下記のようにWebサイトのURL、ログイン情報を変数として用意して、ウェブドライバーのインスタンスを作成しておきます。
Webサイトはdriver.get(URL)
で開き、driver.quit()
で終了します。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
url='https://******'
id='******'
password='******'
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)
driver.quit()
ここからは、Webサイトを開いて、操作したい要素を特定しながらコードを実装していきます。ログインページやタイムカードページごとに下記の手順を実行します。
- 目的のWebサイト上で
F12
を押して開発者ツールを開く - 開発者ツールで操作したい要素(ボタンやチェックボックスなど)を探す
- 目的の要素を特定するためのクラス名や属性などを確認
- ③の情報をもとに要素を取得して操作
step
1ログイン情報の入力とログイン
Webサイトを開いたら、F12
キーを押して開発者ツールを開きます。開発者ツールのElement
メニューでツリー状になったWebサイトの要素が確認できます。
次に、開発者ツール内で要素を検索(⌘/Ctrl + F
)して、目的の要素にジャンプします。今回はログインID
で検索しました。
ログイン画面ではログインID
とパスワード
の入力欄にログイン情報を入力して、ログイン
ボタンを押してログインさせます。
ログインIDとパスワードはinput要素のname、ログインボタンはinput要素のvalueから特定できました。
事前に用意したログインIDとパスワードを入力させ、ログインボタンを押します。
driver.find_element_by_name('UserID').send_keys(id)
driver.find_element_by_name('_word').send_keys(password)
driver.find_element_by_id("login-btn").click()
要素の特定やクリックやテキスト入力などの操作用メソッド一覧を確認したい場合はSelenium with Pythonがオススメです。
非公式ではあるものの、公式ドキュメントよりも見やすくまとまっており、日本語版も公開されています。要素の特定と操作用のメソッド一覧は下記のページで確認できます。
step
2タイムカードのメニューに移動
Webサイトにログインできたら、タイムカードのメニューに移動させます。ログイン画面と同じ要領で、「タイムカード」のメニューを押します。
タイムカードメニューはtitleがタイムカードのli要素で特定してクリックできました。
driver.find_element_by_xpath("//li[@title='タイムカード']").click()
step
3打刻
タイムカードのページに移動したらいよいよ打刻です。
打刻ボタンはinput要素のclass名で特定できました。
外出(昼休み開始)ボタンの場合、下記のコードで要素が特定できます。
driver.find_element_by_class_name('jtcard-btn-outtime').click()
step
4まとめ
ここまでで、Webサイトへログインして、打刻メニューへ移動して打刻できました。
今までの総まとめとして、schedule を使って出勤、昼休み、退勤時間に自動で打刻させてみます。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
import schedule
url='https://******'
id='******'
password='******'
# ヘッドレスモードの場合コメントイン
# options = webdriver.ChromeOptions()
# options.add_argument('--headless')
def stamp(time):
driver = webdriver.Chrome(ChromeDriverManager().install())
# ヘッドレスモードの場合
# driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get(url)
driver.find_element_by_name('UserID').send_keys(id)
driver.find_element_by_name('_word').send_keys(password)
driver.find_element_by_id("login-btn").click()
time.sleep(1)
driver.find_element_by_xpath("//li[@title='タイムカード']").click()
time.sleep(1)
if time == '8:00':
driver.find_element_by_class_name('jtcard-btn-stime').click()
elif time == '12:00':
driver.find_element_by_class_name('jtcard-btn-outtime').click()
elif time == '12:50':
driver.find_element_by_class_name('jtcard-btn-intime').click()
elif time == '18:00':
driver.find_element_by_class_name('jtcard-btn-etime').click()
driver.quit()
# 平日の8時45分、12時、12時50分、18時に打刻
for i in ["08:45", "12:00", "12:50", "18:00"]:
schedule.every().monday.at(i).do(stamp)
schedule.every().tuesday.at(i).do(stamp)
schedule.every().wednesday.at(i).do(stamp)
schedule.every().thursday.at(i).do(stamp)
schedule.every().friday.at(i).do(stamp)
# 指定時間になったらstamp関数を実行
while True:
schedule.run_pending()
time.sleep(1)
ターミナルでpython3 desknets.py
を実行しておけば、放っておくだけで打刻してくれます。
ヘッドレスモードのオプションを指定してドライバーのインスタンスを生成すれば、ブラウザのGUIを表示させずに実行することもできます。
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
注意点として、PCがスリープ状態だと打刻できないことに留意しておく必要があります。
Macの場合は、ターミナルでpmsetを使うことで、指定の時刻にスリープ解除できます。
例えば、ターミナルで以下を実行すれば、毎週平日8:30にスリープ状態を解除できます。
sudo pmset repeat wake MTWTF 8:30:00:
詳細は、「ターミナル」でMacをオン/オフにするスケジュールを設定する - Apple サポート (日本)を参照してください。
今回ご紹介した、Seleniumを使ったブラウザ操作はスクレイピング技術の一端に過ぎません。
スクレイピングでは、ブラウザ操作以外にも、定期的にWebサイトの情報を取得するクローリングや、自然言語をコンピュータに処理させる自然言語処理など、面白い技術がたくさん存在しています。
もしこの記事を読んで面白いと感じていただけたのなら、ぜひそれらも学んでみることをおすすめします。
スクレイピングについて学ぶ際は、私がスクレイピングの楽しさを知るキッカケになったこちらの本がオススメです。
もともと同人誌として出版されましたが、その人気から一般向けに加筆修正された本です。Pythonの基礎に加えて、スクレイピングで使われる技術がわかりやすく解説されており、スクレイピング初心者でもすぐにコードを書いて実践できる構成になっています。とくに私のようなスクレイピング初心者に非常にオススメできる1冊です。
まとめ
今回はSeleniumとwebdriver-managerを使って打刻を自動化しました。
Pythonになじみがない人でも、Seleniumを使えばカンタンにブラウザ操作の自動化ができることがおわかりいただけたと思います。
ブラウザの自動操作の手順は打刻に限らず、Webサイトなら使える方法ですので、打刻以外の面倒な作業もぜひ自動化してみてください。
今回はスクリプトファイルの形で完成としますが、コマンドラインに慣れていない方には扱いづらいという問題があります。そこで次回は、プログラムになじみのない人でも使えるよう、今回作成したプログラムをGUIアプリに落とし込んでみたいと思います。