【コピペOK】Pythonで毎日の検温フォームを自動化しよう!

プログラミング

どうもなおです。

最近は多くの学校や企業で体温を毎朝送ってください、というシステムが導入されているようですが、正直めんどくさいし実際に体温を測っている人って少ないと思います。そこで今回はPythonを使って毎朝、体温を自動で送信するプログラムを作ります。完成したプログラム(ソースコード)も公開しますので、プログラミングの知識がなくても大丈夫です

僕は体温を測らないことを推奨しているわけではありませんが、Pythonの学習の教材として自動で体温を送信するプログラムを作ります。

Pythonでできること

Pythonは非常に人気のある流行りのプログラミング言語です。Googleなどの大手企業でもPythonが使われています。そしてPythonでできることと言えば、AI・機械学習の開発が有名ですが、他にもデータ分析やwebアプリケーションのバックエンド開発、自動ツールも開発することができます。

今回はPythonで自動化を行っていくのですが、一般的に自動化は単純かつ何度も同じ作業を繰り返すときに使われます。なので今回の例は自動化するにはピッタリなわけです。

今回の流れ

今回はPythonで自動化するにあたって、Seleniumというライブラリを使います。ライブラリは便利なツールをセットにしたものです。Seleniumを使うことで自動化が簡単に開発することができます。

そして今回はGoogle フォームを使って体温を自動で送信するプログラムを作ります。Google フォームは多くの学校や企業でも使用されているので、非常に実践的だと思います。

(※僕は体温の送信を自動化することを推奨しているわけではありません。)

準備

今回使うGoogle フォームはこちらです。これは教材として僕が作ったテスト用のフォームになりますので、みなさんが実際に使用する際はそれぞれのフォームに置き換えてください。しかしテストする場合はこのフォームを使って下さい。

今回は日付、出席番号、名前、体温、の4つの項目を必須で入力しなければなりませんが、みなさんの場合に置き換えて考えてください。出席番号ではなく会社の社員IDを入力する場合や、日付の入力がない場合でも大丈夫です。

テスト用Google フォーム

このプログラムはChromeを使って開発することを前提に話を進めていきますので、他のEdgeやFirefoxを使っている人は先にChromeをインストールしてください。

URLをカスタマイズする方法

フォームのURLにデータを入力しておくと、フォームの質問に対する回答が入力された状態でフォーム画面が表示されます。

ではフォームのURLをカスタムする方法を紹介します。フォロームのURLは最初このようになっていると思います。

https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=sf_link」

最後の部分が少し違う場合もあるかもしれませんが問題ありません。肝心なのは「~~/viewform」という部分です。その後に何か続いていてもOKです。

フォームをChromeで表示させたら、F12キーを押します。すると右または下からデベロッパーツールが表示されます。

次にデベロッパーツールの左上にある矢印を押して、1つ目の質問(画像の「本日の日付を入力して下さい。例:1月1日」)の黄緑色になった部分を左クリックします。

するとデベロッパーツールの一部が青色または灰色に強調されます。その上にフォームの質問文が書かれていると思います(写真の青枠)。今回重要になってくるのが質問文のすぐ後にある赤枠の数字です。この数字はこの質問の識別番号だと思ってください。そして識別番号をメモしておきましょう。

次にURLをカスタムしていきます。次の手順にそってURLを書き換えて下さい。(書き換えるところは太字にしています)

最初の状態:

「 https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=sf_link 」

手順1:

「 https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=pp_url

手順2:

「 https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=pp_url&entry.108291599=2月14日

(108291599は識別番号です}

手順2のURLを開く

書き換えたURLを開いてみて下さい。すると1つ目の質問に「2月14日」と既に入力されていると思います。このようにして各質問に対してあらかじめ回答を入力しておくと、回答が入力された状態でフォームを開くことができます。

2つ目以降の回答をURLに付け加えるときは「&entry.識別番号=回答」の形式で記述します。

今日の日付を取得する

日付を直接URLに入力すると、毎日同じ日付が入力された状態でフォームが開いてしまいます。なのでPythonのライブラリを使って、毎日その日の日付を取得するようにします。使用するライブラリは「datetime」です。

today = datetime.datetime.now().strftime('%m月%d日')

todayという変数にdatetimeのnowという機能を使ってその日の日付を取得して、strftimeで「○月□日」という形に整えて代入しています。

体温をランダムで作る

体温も毎日同じだと怪しまれる可能性があります。なので今回は36.0~36.5で毎日ランダムに体温を取得して回答に入力するようにします。使用するライブラリは「random」です。

thermometry = str(36+random.randint(0,5)/10)

thermometryという変数にstr型(文字列型)で36.0~36.5の中からランダムで数字を代入しています。

回答をURLに付け加える

日付、体温を含めその他の項目をURLに付け加えます。

#ライブラリを入れる
import random
import datetime
#回答を変数に入れる
url='https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=pp_url&'
number='1'
name='なお'
today = datetime.datetime.now().strftime('%m月%d日')
thermometry = str(36+random.randint(1,5)/10)
#URLに質問の識別番号と回答を付け加える
result_url=(url
            +'entry.108291599='+ today
            +'&entry.163185999='+ number
            +'&entry.1834989880='+ name
            +'&entry.92304941='+ thermometry)
#カスタムURLを表示する
print(result_url)

これを実行して表示されたURLを開きます。すると各質問に既に回答が入力された状態でフォームが表示され、あとは[送信]を押すだけだと思います。

では最後に[送信]をクリックするプログラムを書いていきましょう。

[送信]ボタンを押す

質問に対する回答をURLに入れたら、あとは[送信]ボタンを押すだけです。ボタンを押すなど画面の操作を行うときには冒頭に紹介したSeleniumというライブラリを使用します。

Seleniumでサイトを表示させる

Seleniumはdatetimeやrandomとは異なり最初からPythonに入っているものではないので、下記のコマンドをwindowsの場合はコマンドプロンプト、macの場合はターミナルで入力してSeleniumをインストールしてください。

pip install selenium

seleniumでchromeを操作するために必要なライブラリも一緒にインストールします。

pip install webdriver_manager

検温フォームのページを自動で開くプログラム(ソースコード)は下記のようになります。

from selenium import webdriver
from driver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('表示するサイトURL')

Xpathで[送信]ボタンを押す

[送信]ボタンは質問ではないので、数字の識別番号はありません。ボタンはHTMLで書かれているのでHTMLのXpathを識別番号の代わりに使用します。

XpathはHTMLなどのXML文を要素や属性などを指定するための言語です。今回であれば Xpathを使用することで、Pythonで[送信]ボタンを押すプログラムを書くことができます。

Xpathの解説をすると少し長くなるので今回は解説しませんが、プログラムについては簡単に解説します。

def click(x):
  driver.find_element_by_xpath(x).click()
submit_button = '//*[@id="mG61Hd"]/div[2]/div/div[3]/div[1]/div/div'
click(submit_button)

まずclickという関数を作ります。この関数ではxに代入されるXpathのボタンをクリックするというものです。Xpathは「//*[@id=”mG61Hd”]/div[2]/div/div[3]/div[1]/div/div」です。下の写真を見て分かるように[id=mG61Hd]の下層にボタンがあります。[id=mG61Hd]より上は「//*」で省略されています。

今回の1番の難しいところは自分の場合のXpathを探すことだと思いますが、Googleフォームであれば上の写真と似ていると思うので参考にしつつ頑張って探してみて下さい。

完成形

ではこれまで解説してきたプログラムを1つにまとめたものがこちらです。

from selenium import webdriver
import random
import datetime
import time
from driver_manager.chrome import ChromeDriverManager

url = 'https://docs.google.com/forms/d/e/1FAIpQLSeLgaUrGX_f_KNhJ1KJ41G69sBoDcIECk0IJXBWBNc4ljdDpQ/viewform?usp=pp_url&'
number = '1'
name = 'なお'
today = datetime.datetime.now().strftime('%m月%d日')
thermometry = str(36+random.randint(1,5)/10)
#URLにそれぞれの値を付け加える
result_url = (url
            +'entry.108291599='+ today
            +'&entry.163185999='+ number
            +'&entry.1834989880='+ name
            +'&entry.92304941='+ thermometry)
        
def click(x):
    driver.find_element_by_xpath(x).click()

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(result_url)
time.sleep(1)
submit_button = '//*[@id="mG61Hd"]/div[2]/div/div[3]/div[1]/div/div'
click(submit_button)
driver.close()
driver.quit

まとめ

今回はいくつか解説を省いたところがありましたね。Chrome driverのダウンロード方法やXpathの詳しい説明など、これらもまた1つの記事にして解説したいと思います。

また今回のプログラムは毎回送信する際にコードエディタやコマンドプロンプトまたはターミナルを起動する必要がありましたが、今後サーバにアップロードして完全自動化する方法も紹介したいと思っていますので期待していて下さい。

この記事について分からないことがありましたらTwitterのDM等で質問して下さい。僕は毎日暇なので遅くても次の日には返信できると思います。

それではまた。

【なおくんのSNS】

【note】

noteでもスマホやパソコンなどの記事を書いていますので、ぜひご覧ください。あとフォローもお願いします。

【案件の依頼やお問い合わせはこちら】

    プログラミング
    naokunをフォローする
    なおコンサルティング
    タイトルとURLをコピーしました