はじめに
今更ながらpythonで、毎朝formsに体温を送信するプログラムを書きました。備忘録も
兼ねて手順を書いていこうと思います。
こんなやつ
できるようになること
毎朝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.コード作成
さっそくコードを記載します。
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 でデベロッパーツールを開きます。
いろいろ文字が出てきましたが、この文字の上をマウスで通ると、画面が青くなる時があると思います。その文字列の左端の▶を押してみてください。するとまた大量の文字が出てきます。
同様にこの文字列の上をマウスで通ると、今度は青くなる範囲が狭まったと思います。文字列を打ち込む部分が青く選択される文字列を探して、▶を押してください。
これを繰り返すと、開けるところがなくなり以下のようになると思います。注目してもらいたいのは水色で囲った部分。ここの文字列の最初に<input class=…
と書いてあります。ここで右クリックからxpathをコピーできます。
こんな感じ
ちなみに今回の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タスクスケジューラを使用します。
プログラム一覧からタスクスケジューラを検索し起動します。右側の基本タスクの作成を選択してください。(下の画像の水色で囲った部分)
タスクの名前と説明、タスクの繰り返しタイミングを入力すると、タスクでどの操作を実行するか聞かれるので、プログラムの開始
を選択してください。
次は以下の画像のように
プログラム/スクリプト:python自体のファイルパス
引数の追加:作成したプログラムのファイル名
開始:作成したプログラムまでのパス
を入力してください。筆者の場合はC:\Users\user名\work\temp_send.pyという構成です。
これでタスクを追加することができました。しかしこれでは毎日同じ時間に送信するだけになってしまうので、送信時間にランダム性を持たせていきます。
作成したタスクがタスク一覧に表示されているので、右クリックからプロパティを表示してください。トリガタブの編集を押すと詳細な設定画面が出てきます。
その中の遅延時間を指定するのボックスにチェックをし、時間を指定すれば終了です。
8:30開始、遅延時間1時間とすれば、8:30~9:30のどこかでプログラムが実行されます。
まとめ
Pythonのseleniumモジュールと、windowsスケジューラを使って、体温自動送信プログラムを作成しました。
これで毎日の面倒な作業から解放されそうです。