2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで体温を毎朝自動送信

Last updated at Posted at 2021-07-28

はじめに

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

キャプチャ.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/の一番上にバージョンが書いてあります。

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/を開いてください。プロフィールパスを確認すると、先ほど作成したC:\Users\user名\selenium_userが書いてあり、その直下のDefaultを参照してることがわかります。このDefaultはこの後使用します。
Defaultではないかもしれませんが(多分Profile 1とか)、問題はないので、この先のDefaultをすべてその名前に置き換えてください。

3.コード作成

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

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() #ブラウザを終了する

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

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を指定しています。

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のホーム画面での見つけ方を例にしていきます。

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

キャプチャ.PNG

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

スクリーンショット (4).png

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

スクリーンショット (6)_LI.jpg

こんな感じ

スクリーンショット (8).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

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

次は以下の画像のように

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

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

キャプチャ.PNG

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

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

キャプチャ.PNG

まとめ

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

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?