自動打刻システムを作ろう（Python+Selenium+Chrome）

#TL;DR
~~[RPA（Robotic Process Automation）](https://rpa-technologies.com/about/)使うのやめよう~~

#intro
？？？:man_tone1:「毎日出社したらPCを立ち上げて、ブラウザで出勤システムにログインして”出勤”ボタンを押してね〜。退勤する時も同様に”退勤”ボタンを押してね〜。」

###僕 :joy:「何それめんどい」

##やりたい事
introで紹介したストーリーを勝手やってもらいましょう

PCを起動したら以下の事を勝手にやってほしい（＝自動化）
- インターネットブラウザ（Google Chrome）を開く
- 出勤システムのWebページにアクセス
- IDとパスワードを入力してログイン
- "出勤"ボタンを押す
- ブラウザを閉じる

##開発環境
- Windows 10
- Python 3.7.2
- Selenium 3.14.0
- ChromeDriver 2.45

#Pythonを入れよう
参考：[Pythonのインストール方法[Windows]](https://qiita.com/R-Imai/items/18fee5203e695838e899)
これの「インストールできたか確認」ぐらいまでやればOK

Windows向けの[Pythonのダウンロードページ](https://www.python.org/downloads/windows/)からインストーラーをダウンロードしましょう。
2018年12月時点では最新版の「Python 3.7.2 - 2018-12-24」の「Windows x86-64 web-based installer」をクリックします。

<img width="649" alt="スクリーンショット 2019-01-05 18.14.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/331407/a33bc53b-cdb5-b401-fc3a-ce36fc4d22dc.png">

ダウンロードした「python-3.7.2-amd64-webinstall.exe」を実行してインストールしましょう。
`add python ○.○ to PATH`にチェックを入れると自動でパスの設定をしてくれるのでお好みで。

Windowsキーを押して、「cmd」と入力するとコマンドプロンプトが立ち上がります。
そこで以下のコマンドでPythonのバージョンが表示されるはずです。

```shell
python -V
```

#SeleniumとChromeDriverをダウンロードしよう
Pythonが使えるようになったら次にSeleniumをインストールしましょう。

基本的には以下の「Seleniumの準備」「chromedriverをダウンロード」辺りを参考に。
参考：[WebのUIテスト自動化 - Seleniumを使ってみる
](https://qiita.com/edo_m18/items/ba7d8a95818e9c0552d9)

##具体的には
###pipコマンドでSeleniumをインストール
```bash
pip install selenium
```

###ChromeDriverをダウンロード
[ここ](https://sites.google.com/a/chromium.org/chromedriver/downloads)からダウンロードしましょう。
「ChromeDriver 2.45」→「chromedriver_win32.zip」を順にクリック。
解凍した「chromedriver.exe」はお好きなディレクトリに置きましょう。
後で「chromedriver.exe」のパスが必要になります。
もしくはPATHを通しておいてもOKです。


#コードを書こう
早速、自動出勤するプログラムを書いてみましょう。
以下がコードの全容です。

```python:auto_work.py
from selenium import webdriver

#chromedirverのPATH通していれば、わざわざパス指定不要
driver = webdriver.Chrome(executable_path='C:\\Users\\hoge_user\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\site-packages\\chromedriver_binary\\chromedriver.exe')
#出勤システムトップページにアクセス
driver.get('http://hedgehog/fugafugaどこかの出勤システム')

#ユーザーid入力
user_id_box = driver.find_element_by_id("input_userid")
id_box.send_keys('userid')

#パスワード入力
pass_box = driver.find_element_by_id("input_password")
pass_box.send_keys('password')

#ログイン関数実行
driver.execute_script("doChallengeResponse()")

#次ページで出勤関数を実行（ボタンがinvisibleなのでclick()できないので）
driver.execute_script("doDakoku('syukkin')")

#Chrome終了
driver.quit()
```

「やりたいこと」と照らし合わせて見ます。
###インターネットブラウザ（Google Chrome）を開く＆出勤システムのWebページにアクセス
```python
#chromedirverのPATH通していれば、わざわざパス指定不要
driver = webdriver.Chrome(executable_path='C:\\Users\\hoge_user\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\site-packages\\chromedriver_binary\\chromedriver.exe')
#出勤システムトップページにアクセス
driver.get('http://hedgehog/fugafugaどこかの出勤システム')
```

Selenium、chromedriverでブラウザを開いてWebページにアクセスします。
ここでは出勤システムのログイン画面を開くようにしています。
（毎回ログイン処理をすることになりますが、ログインしている場合、処理をスキップするのも面白そうですね。）

###IDとパスワードを入力してログイン
```python
#ユーザーid入力
user_id_box = driver.find_element_by_id("input_userid")
id_box.send_keys('hogehogeid')

#パスワード入力
pass_box = driver.find_element_by_id("input_password")
pass_box.send_keys('fugafugapassword')

#ログイン関数実行
driver.execute_script("doLogin()")
```


出勤システムのログインページのhtmlを見てみると、大体以下のようなフォームになっているのではないでしょうか。

```html
<input type="text" id="input_userid" required
       minlength="4" maxlength="8" size="10">
```

`find_element_by_id`では指定したidで要素を取得できます。
この場合"input_userid"を引数に渡せば、このテキストボックスを色々操作できます。

次の処理、`send_keys`では文字を入力してくれます。

IDとパスワードを入力したらログインボタンを押します。
ここではボタンを押した時のjavascript関数を`execute_script()`で直接呼んでいます。

###"出勤"ボタンを押す
```python
#次ページで出勤関数を実行（ボタンがinvisibleなのでclick()できない）
driver.execute_script("doSyukin()")
```
自分の出勤システムWebページでは、ボタンがinvisibleなのでclick()できなかったので、ここでも`execute_script()`を使っています。

システムによっては引数を渡したりなんやかんやしたり。htmlを解析しましょう。

###ブラウザを閉じる
```python
#Chrome終了
driver.quit()
```
簡単やぁ:relaxed:

#PC起動時に出勤プログラムを呼ぼう
出社してPC起動時に、先ほどの`auto_work.py`が実行されるようになればシステム完成です。

`auto_work.py`ファイルを実行するbatファイル（`work_start.bat`）を作成して

```bash:work_start.bat
python auto_work.py
```

以下のディレクトリに`work_start.bat`もしくはそのショートカットを置けば、PC起動時に`work_start.bat`が実行され、`auto_work.py`が呼ばれることになります。
`C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup`

#終わりに
PythonとSeleniumでこんなことも出来るだなと思ってやってみた次第です。

今回はPython+Selenium+Chromeを使って自動打刻してみようということですが、自動出勤するのにこれが最適解！というわけでは無いと思います。環境は千差万別だし、日々便利なものは増えていくので。
自分の先輩はwiresharkでパケット解析して、出社したら自動で出勤するようにパケット通信したりしています。

昨今、RPAで業務効率化が注目されていますが、RPAもRPAでクセがあるし、個人的にはなんでもかんでも自社エンジニアが作ってみる方が良いかなと思います。