【定時実行】MicrosoftFormsの自動回答botの作り方解説(python・selenium)

スポンサーリンク

作成した背景

何がとは言いませんが、毎日毎日機械的にMicrosoftFormsを入力することに疲れたので、自分の補助をしてくれるbotを作りました。

自己責任

コロナ禍で、毎日あほみたいにFormsを入力する必要が出てきて、ウンザリしています。

そこでFormsへの入力を完全に自動化したくなりますが、それをする場合は自己責任でお願いします。

例えば、名前や出席番号の入力は自動化しても、体調や体温の入力は手動で入力するなど、あくまでも自分を"補助"する目的で使うことを推奨します

(この記事では、ログインを自動化する方法についてはあえて触れません。)

Seleniumの導入

実行環境

以下は、Pythonがすでにインストール済みのWindows10 PCで実行しています。

Pythonのバージョンは3.7.4です。

Chromeが推奨ブラウザです。Chrome以外のブラウザはやり方を自分で工夫してください。

ライブラリのインストール

コマンドプロンプトで、

pip install selenium

と入力すればインストール完了です。

ドライバのインストール

こちらのサイトにある方法で、ご利用のchromeのメインバージョンを調べてください。

そのうえで、こちらのサイトのCurrent Releases内の、自分のchromeのメインバージョンにあったものをクリックして、自分のOS(Linux,Mac,Windows)のドライバをインストールしてください。

chrome以外のブラウザに関しては、selenumの公式サイト内の[Browsers]内にダウンロードリンクが書いてあります。(参考:PythonとSeleniumを使ったブラウザ自動操作)

64bitのOSを利用している人が、32bitと書いてあるドライバを使っても特に問題ありません。

pythonでプログラミング

先ほどダウンロードしたドライバをDLして、解答すると、chromedriver.exeというファイルが手に入ります。そのファイルを自分がアクセスしやすいフォルダに保存します。

私の場合は、C:\selenium\chromedriver.exeというところに保存しました。

そのうえで、Sublime Text 等のエディタを開いて、sample.pyというファイルを、chromedrive.exeと同じフォルダ内に保存します。

つまり、seleniumフォルダ内が

こうなっている必要があります。


今回は、このFormsへの自動回答を想定しています。

そのうえで、sample.py内には、以下のようなソースコードを書きます。

from selenium import webdriver
import time

driver = webdriver.Chrome("c:/selenium/chromedriver.exe")
driver.get("https://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAMAANfJPNxURDNNOTAxOFFOM0pGOVJNREU2NDZZRlNURy4u")
time.sleep(5)

#名前
element = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/div/div[1]/div[2]/div[2]/div/div[1]/div/div[2]/div/div/input')
text = '山田太郎'
element.send_keys(text)
#クラス
element = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/div/div[1]/div[2]/div[2]/div/div[2]/div/div[2]/div/div[1]/div/label/input')
element.click()
#出席番号
element = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/div/div[1]/div[2]/div[2]/div/div[3]/div/div[2]/div/div/input')
text = '7'
element.send_keys(text)


#体温
element = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/div/div[1]/div[2]/div[2]/div/div[4]/div/div[2]/div/div/input')
text = '36'
element.send_keys(text)

time.sleep(2)

#送信
element = driver.find_element_by_xpath('//*[@id="form-container"]/div/div/div/div/div[1]/div[2]/div[3]/div[1]/button/div')
element.click()
time.sleep(3)

driver.close()

各部分の詳細な説明は、こちらのサイトが参考になります。

(2021/6/15追記)MicrosoftFormsの内部構造の変更によって、XPathが変わり、上のプログラムが正常に動作しないことがあります。対策方法を別の記事にまとめましたので参考にしていただけると幸いです。

手動実行

まず、手でこのプログラムを動かしてみましょう。

コマンドプロンプトで、先ほど作ったフォルダに移動します。

cd C:\selenium

そのうえで、pythonファイルを実行します。

python sample.py

こんな感じにできました。

(当たり前ですが、無編集です。)

定時実行

定時実行をする場合は、バッチファイルを作る必要があります。

つまり、seleniumフォルダ内に、「samplebat.bat」というファイルをSublimeText等で作成し保存します。つまり、フォルダ内が、

こうなっている必要があります。

batファイルには、

python sample.py

と1行だけ書き込んでください。

そのうえで、タスクスケジューラーを起動させます。

このような画面が出てくると思いますので、タスクスケジューラ(ローカル)/タスク スケジューラ ライブラリを右クリックして[新しいフォルダ]を選択します。

フォルダーの名前はご自身が区別できれば良いですので、好きな名前を付けてください。私はscheduleと付けました。次に、その作ったフォルダを右クリックして[タスクの作成]を選択します。

すると、このような画面が出てくるので、自分が区別できるような名前と、[ユーザーがログオンしているかどうかにかかわらず実行する]と、[最上位の特権で実行する]、[表示しない]、[Windows10]を選択します。

トリガーの画面に移り、[新規]を押します。

このような画面が出てきますので、自分がFormsを実行したいタイミングを選んでください。例えば、私の場合は毎日7時にFormsへの回答を行うようにスケジューリングしました。

次に、操作の画面に移り[新規]を押します。

このような画面が出てきますので、[プログラム/スクリプト]で、先ほど作成したbatファイルを参照します。そのうえで、[開始(オプション)]の欄に、pythonのプログラムファイルと、batファイルが置かれているフォルダのパスを入力します。

次に条件の画面に移り、[コンピュータをAC電源で使用している場合のみタスクを開始する]についているチェックを外します。

最後の設定の画面では特に何かいじる必要はありませんが、運用上何らかの問題が生じた際にはこの辺を調節すると良いと思います。

最後に、パスワードの入力が求められますので、入力をしてください。パスワードの認証が通れば、自動実行の設定が完了しました。お疲れさまでした。

もし、しっかり設定できているか不安な場合、今作成したタスクを選択した後に、タイムスケジューラの右側に出てくる実行ボタンを押すことで、スケジューラの設定に関わらず今すぐタスクを実行させることが可能です。

対策

自動化する方法だけを書くと、アンフェアだと思うので、自動化への対策も書いておきます。

と言いたいところですが、Formsを利用している以上、自動化を完全に対策する方法はないです

例えば、FormsにGoogleのreCAPTCHAを導入できれば、容易に自動化を対策できると思います。

↓reCAPTCHAとはおなじみのこれのことです

https://konpure.com/2018/11/08/post-8849/

しかし、MicrosoftFormsには、reCAPTCHAを容易に導入できるような機能はないですので、今回は対策としては不適切です。

reCAPTCHAの一世代前の読みにくい文字の書かれたタイプの認証を"疑似的"に導入することはできますが、入力された値があっているかどうかを判別したうえで、あっていなければ先に進めないようにする機能をFormsに導入することはできません。

https://senrioka-info.net/0_google_sitemap/google_sitemap.htm

無理やりですが、こんな感じに"疑似的"に作ることは可能です。

しかし、間違った文字を入力したところで、Formsの回答自体ができなくなるわけではないですし、本質的な対策にはなりません。

また、機械的に文字を読み取る技術も年々高まってきていて、正直この認証方法が本当に人間かどうかを識別できているかは微妙というところもあります。

意見

コロナ禍で、出席から点呼から何から何までFormsを使われるようになりましたが、毎週、出席番号や名前を入力する必要があり、毎日同じことをしている気がして、なんだかなぁと思っています。

出席確認に関して、Formsを使うことが悪いとは思いませんが、会議への出席ログから自動的に出席扱いにされるようにするとか、ファイルのダウンロード・アクセスにより出席扱いにするとか、学生が毎日毎日Formsをポチポチしなくても良くなる工夫がされてもいいのでは?と思っています。

(あと、1日4回くらいFormsに回答していると、純粋にFormsへの入力を忘れるときもあって、それで欠席扱いにされたら、「なんだかな」という気持ちになります。)

Formsはどんなことでも使えるように、汎用性がものすごく高く、また、機能が最小限であるために、誰にとっても使いやすい設計となっています。一方、Formsの基礎的な機能以外の機能を追加する拡張性はほとんど無いに等しいです

"拡張性"の無さを、アンケートの運営者かアンケートの回答者に負担を押し付けることで、何とかFormsを使っているような状況もあったりして、正直何のためにFormsを使っているか分からなくなっていることもあります。

Formsだけにとらわれなくても、適切な機能を持ったアンケートツールは世の中にたくさんあると思いますし、HTMLとCSS、JavaScriptが扱える人なら、容易にFormsに類似する物を作成できると思います。「アンケート=Forms」ではなく、様々な選択肢を検討したうえで、作る側にも答える側にとっても負担の少ないアンケートを作ってほしいと思います。

まとめ

自分のFormsの入力を"補助"してくれるbotを作ってみました。

この技術は、Formsに限らずに様々なWEBサービスで応用できますので、ぜひ使ってみてください。

最初にも書きましたが、このプログラムを使うときは自己責任でお願いします。

参考

MSformsの自動回答スクリプトを通してselenium入門

PythonとSeleniumを使ったブラウザ自動操作

Windowsでbatファイルを自動実行したい時(タスクスケジューラの設定)

このブログが良いと思ってくださったら、ご支援をお願いします!

※OFUSEは登録不要で、50円から簡単にクリエイターを支援できるサービスです。

OFUSEで支援する

python技術メモ
スポンサーリンク
asyano.jp

コメント

  1. ねお より:

    以前までは正常に動作していたのですが、最近になって急に使えなくなってしまいました。
    もしかしたらMicrosoft Forms側のHTMLコードが変わったのではないかと思うのですが、解決策はありますでしょうか?

    • asyanoasyano より:

      コメントいただきありがとうございます。

      ねお様のご指摘の通り、FormsのHTMLのタグの構造の変更によって、当サイト上にエラーが発生してしまうソースコードが掲載されていました。
      当サイト上のソースコードを、最新のHTMLタグに対応したものに変更させていただきましたので、こちらのコードをご参照ください。

      今後も、Forms側のHTMLタグの変更によって同様の事態が生じることが予想されます。私の方でも、できる限り最新版のソースコードに更新するように心がけますが、以下の方法で解決をすることができますので参考までにご紹介させていただきます。
      参考にさせていただいたQiitaの記事内(https://qiita.com/butsuli_shine/items/4f9ac78753a36d7ec9b3)、コードを書いていく>seleniumでブラウザを操作する>
      要素を探す の方法によって、解答欄・選択肢のxpathを手に入れてください。上に掲載されているソースコードの場合、名前・クラス・出席番号・体温・送信ボタンの計5つのxpathが用いられています。
      新しい、xpathを、ソースコード上のxpathと置き換えてください。
      この方法によって、解決をすることが可能です。(今後、図を利用してこの辺のことを解説する記事を出します。多分文字だけだと伝わらないと思うので。)

      少し脱線しましたが、当サイトのエラーをご指摘いただきありがとうございました。
      ねお様に、深く御礼申し上げます。今後とも、どうぞよろしくお願いします。

タイトルとURLをコピーしました