8
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 3 years have passed since last update.

pythonを使ってMicrosoft Formsを自動送信する方法(Mac版)

Last updated at Posted at 2020-10-18

###はじめに
 最近アレの影響があり、私の置かれている状況ではMicrosoftFormsを毎朝早くまでに送信しなければいけなくなりました。それを「めんどくさいな」と考えた私はpythonのwebスクレイピングを習うついでにFormsの自動回答を実装することにしました。

1.作成環境

 ・macOS X Catalina 10.15.7  ・chorme 86.0.4240.80  ・Python 3.7.4  ・Homebrew

###2.モジュールのインストール

 コマンドプロントでseleniumをインストールします。

pip install selenium

Homebrewを用いてwebdriderをinstallします。Homebrewを入れていない場合はまずHomebrewを入れていください

brew install chromedriver

###3.コードの作成
seleniumにあるwebdriverをインポートする。
処理をして秒止めるsleepをインポートする。

form_send
from selenium import webdriver
from time import sleep

selenium自体に処理を待つのモジュールがあるのですが試してみたところうまいことページ遷移後の動作がうまくいかなかったのでsleep()で動作を止めることになります。
下記の場合は10秒処理を止めます。

sleep(10)

ウェブブラウザを立ち上げurl = '***'の***にformsのURLを入れます。

form_send
browser = webdriver.Chrome()
url = '***'
browser.get(url)

formsのURLをいれるとログイン画面に行くのでメールアドレスを入力するtext-boxの要素を調べます。
⌘ + option + i でデベロッパーツールを開き 左上にある下記マークを押すことで要素の指定ができます。
image.png
調べるとMicrosoft formsではi0116のidが使用されています。(変わっているかもしれませんので作成時にチェックをすることをお勧めします)
browser.find_element_by_id()を使用することでidから要素を指定できます。
.send_keys(email)でテキストボックスにemailを記入できます。emailは各自指定してください。
同じようにしてボタンのidを探します。.click()とすることでその要素をクリックします。

form_send
browser.find_element_by_id('i0116').send_keys(email)
browser.find_element_by_id('idSIButton9').click()
sleep(3)

同じようにしてパスワード画面とログイン維持確認画面入力します。

form_send
browser.find_element_by_id('i0118').send_keys(password)
browser.find_element_by_id('idSIButton9').click()
sleep(3)

browser.find_element_by_id('idSIButton9').click()
sleep(3)

するとformsの回答画面に行きます。

formsの回答部分にはidが指定されていないためxpathを指定していきます。

・ラジオボタンを押したい場合

browser.find_elements_by_xpath("//input[@value='***']")[0].click()

***には入力したいラジオボタンのvalueをデベロッパーツールで探して入力してください

・textboxを入力する場合

browser.find_elements_by_xpath("//input[@class='***']")[0].click()

***には入力したいラジオボタンのclassをデベロッパーツールで探して入力してください

browser.find_elements_by_xpath()では指定したxpathにあてはまるものがリスト化されて取得されるため1つ目が[0]、2つ目が[1]、3つ目が[2]のようになっています。そのためtextboxの2つ目へ文字を入れたい場合は[0]が[1]になります。

入力が完了すれば送信ボタンを押すコードを入力します。

browser.find_element_by_xpath("//button[@title='送信']").click())

最後にブラウザのタブを閉じて終了

browser.quit()

###全体のソースコード

from selenium import webdriver
from time import sleep

email = '各自入力'
password = '各自入力'
url = '各自入力'


browser = webdriver.Chrome()
browser.get(url)

browser.find_element_by_id('i0116').send_keys(email)
browser.find_element_by_id('idSIButton9').click()
sleep(3)

browser.find_element_by_id('i0118').send_keys(password)
browser.find_element_by_id('idSIButton9').click()
sleep(3)

browser.find_element_by_id('idSIButton9').click()
sleep(3)


#formsに入力したい事柄で変化します。
browser.find_elements_by_xpath("//input[@value='各自入力']")[0].click()
browser.find_elements_by_xpath("//input[@value='各自入力']")[0].click()
sleep(3)

browser.find_element_by_xpath("//button[@title='各自入力']").click()
sleep(10)

browser.quit()

###4.cronで時間を指定

レンタルサーバーを借りていない私はmacにあるcronを用いて自動実行します。

システム環境設定のセキュリティーとプライバシーの鍵を解除し+から/usr/sbin/crnを選択し開きます。

image.png

ターミナルを開いてcrontab -eと入力します。
・毎日6時に実行する場合(*は全て実行するということです。)

# 分 時間 日 月 曜日 python 保存されているディレクトリ(必ず絶対パスを入力)
  0   6    *  *   *   python form_send

cronはスリープ状態では実行されていないのでその前1分間だけスリープ解除する設定にします。
システム環境設定の省エネルギーからスケジュールを選択し時間を入力します。
image.png
(1日に何度も実行しその時だけ立ち上げたい時はpmsetを活用するといいでしょう)

###5.後書き
初めて記事を書きました。
記事を書くのは意外と根気が入りましたが理解度アップと暇つぶしには良かったと思います。
相当不純な動機でMicrosoft formsの自動回答を作成しましたが良いものに活用していただければ大変喜びます。
最後まで読んでいただきありがとうございました。
※Windows版は執筆されません。

8
2
0

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
8
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?