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

###はじめに
　最近`アレ`の影響があり、私の置かれている状況ではMicrosoftFormsを毎朝早くまでに送信しなければいけなくなりました。それを「めんどくさいな」と考えた私はpythonのwebスクレイピングを習うついでにFormsの自動回答を実装することにしました。
<h3>1.作成環境</h3>
　・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をインポートする。


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

```python
sleep(10)
```
ウェブブラウザを立ち上げurl = '＊＊＊'の＊＊＊にformsのURLを入れます。

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

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


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

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

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

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

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

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


・textboxを入力する場合

```python
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]になります。

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

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

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

```python
browser.quit()
```
###全体のソースコード

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/800249/2deaba76-b846-ab6e-ac99-2ada5645058c.png)

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


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

```

cronはスリープ状態では実行されていないのでその前1分間だけスリープ解除する設定にします。
システム環境設定の省エネルギーからスケジュールを選択し時間を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/800249/d8f9951d-e07c-10c3-f128-e2de998746cc.png)
(１日に何度も実行しその時だけ立ち上げたい時は`pmset`を活用するといいでしょう)

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