Pythonで体温を毎朝自動送信

# はじめに
今更ながらpythonで、毎朝formsに体温を送信するプログラムを書きました。備忘録も
兼ねて手順を書いていこうと思います。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/77cd081a-b3ab-ece6-7484-371a437f21ce.png)

こんなやつ

# できるようになること
毎朝8:30~9:30のどこかで、formsにランダムな数値(35.5~36.5)を勝手に送信する。


# 筆者の環境
・Windows 10
・Chrome 92.0.4515.107
・Python 3.7.6

# 目次
1.seleniumの準備
2.Googleアカウント、chromeの準備
3.コード作成
4.xpathの探し方
5.Windowsタスクスケジューラの設定

# 1.seleniumの準備
まずはseleniumの準備をします。pythonのモジュールの一種で、ブラウザを自由に操作できます。

### 1.1 Webdriverのインストール
seleniumを使用するためにはWebdriverが必要です。ターミナルに下記のコマンドを打ちこみます。

```
pip install chromedriver-binary==92.0.4515.107
```

今回は```92.0.4515.107```としていますが、これは使用しているChromeのバージョンです。
[chrome://version/](chrome://version/)の一番上にバージョンが書いてあります。

### 1.2 Seleniumのインストール
簡単です。ターミナルに以下のコマンドを入力してください。

```
pip install selenium
```

# 2.Googleアカウント、chromeの準備
コードを書きたいのですが、seleniumは別のChromeを起動した状態で、起動できないという問題があります。
正確に言うと、同じ```--user-data-dic```を参照したChromeが起動しているとき、seleniumが起動できません。
詳しく説明していきます。
何気なく使用しているChromeですが、実は起動時に ```--user-data-dic```というコマンドライン引数をとっていて、ディレクトリを指定できます。このディレクトリにはサイトのパスワードやブックマーク等が保存されています（多分）
普段は自動で選択されていますが、seleniumはこれを指定しなければなりません。そして同じ```--user-data-dic```を参照したChromeが起動しているときにseleniumが起動できません。

そこでselenium用の```--user-data-dic```とGoogleアカウントを作成していきます。

### 2.1 --user-data-dic用ディレクトリ作成
適当な場所にディレクトリを作成します。今回は```C:\Users\user名\selenium_user```を作成しました。

### 2.2 Chromeの起動
win+Rで```ファイル名を指定して実行```から、

```
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\Users\user名\selenium_user"
```
を入力してChromeを起動してください。（もちろん--user-data-dirには先ほど作成したディレクトリのパスを入力してください。またchrome.exeの保存場所も人によって変わると思いますので、適宜変更してください。）
するとログインされていない状態でChromeが起動できると思います。この状態でGoogleアカウントを作成してください。
ついでにmicrosoftアカウントのログインも済ませておいてください。

### 2.3 プロフィールパスの確認

``--user-data-dir``が普段使用しているものと区別できているかを確認するために、また[chrome://version/](chrome://version/)を開いてください。プロフィールパスを確認すると、先ほど作成した```C:\Users\user名\selenium_user```が書いてあり、その直下の``Default``を参照してることがわかります。この``Default``はこの後使用します。
``Default``ではないかもしれませんが（多分Profile 1とか）、問題はないので、この先の``Default``をすべてその名前に置き換えてください。


# 3.コード作成

さっそくコードを記載します。

```python:temp_send.py
import chromedriver_binary
from selenium import webdriver
import random

options = webdriver.ChromeOptions()
options.add_argument("--user-data-dir=C:/Users/user名/selenium_user")
options.add_argument("--profile-directory=Default")
options.add_argument('--headless') #ブラウザを非表示にする

driver = webdriver.Chrome(options=options)

url = "https://forms.office.com/" #送信したいページのURL

driver.get(url) #urlのページを開く
print(driver.current_url)

taion = str(round(random.uniform(35.5,36.5), 1)) #ランダムな体温を決定

input_form = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/input')
input_form.send_keys(taion) #入力フォームに体温を入力
send_button = driver.find_element_by_xpath('//*[@id="form-container"]/div/div[1]/div[1]/button')
send_button.click() #送信ボタンを押す

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

重要な部分を説明していきます。



```python
options = webdriver.ChromeOptions()
options.add_argument("--user-data-dir=C:/Users/user名/selenium_user") 
options.add_argument("--profile-directory=Default")
```

seleniumへ入力するオプションを設定しています。
``--user-data-dir``には作成していたディレクトリのパスを指定しています。
``--profile-directory``には調べておいたプロフィールパスの最終ディレクトリ名を入力してください。今回は``Default``を指定しています。



```python
input_form = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div[1]/div/div[1]/div[2]/div/input')
input_form.send_keys(taion) #入力フォームに体温を入力
send_button = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div[1]/div/div[1]/button')
send_button.click() #送信ボタンを押す
```
``find_element_by_xpath``で、指定したxpathの要素（ここでは入力フォーム）を取得し、``send_keys``で体温を実際に入力します。
今度は同様に送信ボタンのxpathを取得し、``send_button.click()``で送信ボタンをクリックします。

xpathってなんだよって思うかもしれないので見つけ方について次章で説明します。知っている方は飛ばしてください。

# 4.xpathの探し方
2022/10/27追記
今見たら酷いやり方ですね。簡単なやり方を追記しておきます。

1.ctrl+shit+c でデベロッパーツールを開く
2.入力したいフォームをクリック
3.デベロッパーツールで選択された部分で右クリックして、「xpathをコピー」を選択

以上


xpathがなんなのかは筆者は正直よくわかっていません。多分HTML内のそれぞれの要素のパスみたいなものだと思います。しかし見つけ方は簡単です。
[Googleのホーム画面](https://www.google.com/?hl=ja)での見つけ方を例にしていきます。

まず ctrl+shit+i でデベロッパーツールを開きます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/791c5498-74df-5255-c6a0-f1d6115ce5d8.png)

いろいろ文字が出てきましたが、この文字の上をマウスで通ると、画面が青くなる時があると思います。その文字列の左端の▶を押してみてください。するとまた大量の文字が出てきます。
同様にこの文字列の上をマウスで通ると、今度は青くなる範囲が狭まったと思います。文字列を打ち込む部分が青く選択される文字列を探して、▶を押してください。

![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/2e7716e4-aeb2-6140-a04e-1ddb317d8c57.png)

これを繰り返すと、開けるところがなくなり以下のようになると思います。注目してもらいたいのは水色で囲った部分。ここの文字列の最初に``<input class=…``と書いてあります。ここで右クリックからxpathをコピーできます。

![スクリーンショット (6)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/2aac6a8c-ec7f-87b9-e33f-c1bfc455138b.jpeg)

こんな感じ

![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/24ab0eeb-20d8-2f1a-99ff-0bc440e9106a.png)

ちなみに今回のxpathは``/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input``です。最後がinputで終わっていると成功だと思います。
これを実際のformsでも調べて、``find_element_by_xpath``の引数にしてください。
これは入力フォームの場合の手順ですが、送信ボタンの場合も同様です。ただし探すのは、``<input class=…``で始まる文字列ではなく、``<button class=…``で始まるものを探してください。xpathの最後もbuttonで終わっていると思います。


# 5.Windowsタスクスケジューラの設定

ここまでで作成した``temp_send.py``を毎朝勝手に実行してくれるように、windowsタスクスケジューラを使用します。
プログラム一覧からタスクスケジューラを検索し起動します。右側の基本タスクの作成を選択してください。（下の画像の水色で囲った部分）

![Inkedキャプチャ_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/ca06e43e-fd80-6f37-9591-9c595fce2c7f.jpeg)

タスクの名前と説明、タスクの繰り返しタイミングを入力すると、タスクでどの操作を実行するか聞かれるので、``プログラムの開始``を選択してください。

次は以下の画像のように

プログラム/スクリプト:python自体のファイルパス
引数の追加:作成したプログラムのファイル名
開始:作成したプログラムまでのパス

を入力してください。筆者の場合はC:\Users\user名\work\temp_send.pyという構成です。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/fd45e083-3599-57dc-5cd7-25385b091632.png)


これでタスクを追加することができました。しかしこれでは毎日同じ時間に送信するだけになってしまうので、送信時間にランダム性を持たせていきます。
作成したタスクがタスク一覧に表示されているので、右クリックからプロパティを表示してください。トリガタブの編集を押すと詳細な設定画面が出てきます。
その中の遅延時間を指定するのボックスにチェックをし、時間を指定すれば終了です。

8:30開始、遅延時間1時間とすれば、8:30~9:30のどこかでプログラムが実行されます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655254/0eed4483-3951-c82c-5aef-c4428c7bb0c2.png)


# まとめ
Pythonのseleniumモジュールと、windowsスケジューラを使って、体温自動送信プログラムを作成しました。
これで毎日の面倒な作業から解放されそうです。