SeleniumでPC起動時・終了時に出退勤打刻をする（Windows10 Pro）

# はじめに

現在在籍している会社の勤怠システムがめんどくさい。勤怠管理アプリにログインして、「出勤ボタン」や「退勤ボタン」を押さなくてはいけないので、PC 起動時や終了時に自動でボタンを押してもらえるように selenium を使ってプログラムを書いてみた。実行環境は以下。（普段は WSL2 を用いているが、Windows 環境の方が PC 起動や終了きっかけで動かすには都合がよさそうだったので Windows ローカルで実行した。）

- Windows 10 Pro
- Google Chrome = 91.0.4472.124
- chromedriver = 91.0.4472.101
- Python = 3.9.6
- selenium = 3.141.0

大まかな流れは以下の通り。

1. Google Chrome のバージョン確認および chromedriver のインストール
1. Python および Selenium のインストール
1. ウェブサイトへのアクセスするための Python スクリプト作成
1. Python スクリプトを実行する bat ファイルの作成
1. PC 起動時・終了時に bat を実行するための設定

# 1. Google Chrome のバージョン確認および chromedriver のインストール

Selenium を用いて Google Chrome を扱うには chromedriver が必要となる。使用している Chrome のバージョンと合わせる必要があるため、以下手順で確認する。

1. Google Chrome を開く
1. 右上の「︙」→「ヘルプ」→「Google Chrome について」をクリック
1. 以下のような画面に遷移するので、バージョンを確認
![chrome_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/081b1a4f-7936-25d7-d471-a13065132029.png)

次に Chrome のバージョンに合わせて、chromedriver を [ChromeDriver - Downloads](https://chromedriver.chromium.org/downloads) からダウンロードする。今回の場合、メジャーバージョンが 91 なので、ChromeDriver 91.0.4472.101 を選択し、chromedriver_win32.zip をダウンロードし解凍する。（ダウンロードしたドライバへのパスが後で必要となるので、適宜ファイルを移動させておく。自分の場合は `C:/Users/[user_name]/chromedriver_win32/chromedriver.exe` に置いた）

# 2. Python および Selenium のインストール

Microsoft Store にて Python をインストールする。（ターミナルを開いて、`python` と打ってまだインストールされていなければ自動で Microsoft Store に遷移するはず。）ここでは Python 3.9 をインストールした。ターミナルで `pip install selenium` を実行して、selenium もインストールする。

# 3. ウェブサイトへのアクセスするための Python スクリプト作成

以下の shukkin.py でサイトへのアクセスおよび出勤ボタンの打刻ができる。ログインに使用するアカウントやパスワードは config.txt に書いておく。（どちらのファイルも `C:/Users/[username]/Program/` 直下に置いた。）

```python:shukkin.py
### ライブラリのインポート（selenium 以外は標準ライブラリ）
import sys
import time
import configparser
from selenium import webdriver

### プログラムの実行許可（必要ならコメントアウト）
# print('勤怠管理アプリを開いて打刻します。よろしければ yes と入力してください')
# ans = input()
# if ans != 'yes':
#     print('終了します')
#     sys.exit()

### Chrome ドライバのパス、接続先 URL を設定
chrome_path = 'C:/Users/[username]/chromedriver_win32/chromedriver.exe'
url = 'https://**********'

### アカウント名、パスワードを読み取り
config = configparser.ConfigParser()
config.read('C:/Users/[username]/Program/config.txt', encoding='utf-8')
account = config['kintai']['account']
password = config['kintai']['password']

### Chrome のオプションを設定する
options = webdriver.ChromeOptions()
# options.add_argument('--incognito') # プライバシーモード
# options.add_argument('--headless')  # ヘッドレスモード
driver = webdriver.Chrome(executable_path=chrome_path, options=options)

### 指定サイトに接続する
driver.get(url)

### アカウント、パスワードの入力
driver.find_element_by_id('username').send_keys(account)
driver.find_element_by_id('password').send_keys(password)
driver.find_element_by_id('login').click()
time.sleep(10)

### 出勤ボタン
driver.find_element_by_id('Shukkin').click()
time.sleep(5)

### 退勤ボタン
# driver.find_element_by_id('Taikin').click()
# time.sleep(5)

### ブラウザを終了する
driver.quit()
```

```config.txt
[kintai]
account = myaccount
password = mypassword
```

アカウントやパスワードの入力フォームは、実際の画面にて右クリック→「検証」から id を調べて `driver.find_element_by_id('username')` のようにしてアクセスできる。id がない場合はその他キーで代用する。

# 4. Python スクリプトを実行する bat ファイルの作成

Python スクリプトを実行する bat ファイルは以下のようになる。

```bash:shukkin.bat
# `python shukkin.py` をそれぞれ絶対パスで書いているだけ
C:/Users/[username]/AppData/Local/Microsoft/WindowsApps/PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0/python.exe C:/Users/[username]/Program/shukkin.py
```

python.exe までのパスは以下で確認できる。

```bash
$ python
>> import sys
>> sys.executable
```

# 5. PC 起動時・終了時に bat を実行するための設定

起動時の自動実行はスタートアップへの登録でできる。[Windows]+[R] を押して、`shell:startup` と入力すると、スタートアップでのエクスプローラが開かれる。あとは実行したいファイル（今回の場合は shukkin.bat）のショートカットを置けばよい。

終了時の自動実行はローカルグループポリシーへの登録でできる。 [Windows10で終了時に特定のスクリプトを実行させる方法（ローカルグループポリシー/gpedit.msc）](http://pineplanter.moo.jp/non-it-salaryman/2018/07/03/win10-gpedit/) を参考にした。
[Windows]+[R] を押して、`gpedit.msc` と入力すると、ローカルグループポリシーエディタが開かれる。左のツリーメニューから「コンピューターの構成」→「Windows の設定」→「スクリプト（スタートアップ/シャットダウン）」→「シャットダウン」を選択。
シャットダウンのプロパティ画面にて、「追加」→「参照」で実行したいスクリプト（shukkin.bat）を選択し「OK」で設定できる。

# おわりに

もっともっと自動化を進めたい。楽をしたい。。。