本部落格已搬遷, 3秒後跳轉...

Python:自動填寫Google表單 | Laplace's Lab

Python:自動填寫Google表單

建個Google表單來測試:現任美國總統究竟是州普?卅普?還是川普?

打開瀏覽器的開發人員模式,切換到Network Panel並試著送出一次表單,可見formResponse有相當明顯的數據傳輸。

展開查看詳情,在Header的部分可以找到剛才送出表單的資料結構,確定“entry.1216123536”就是所填寫的表單欄位,那麼可以開始寫程式了。

Url


在Header摘要可見到url的格式為表單網址加上”/formResponse”,使用縮網址會無法重導向至正確的表單位址。

Data

1
2
3
4
5
6
7
payload = {
'entry.1216123536' : '',
'fvv' : '0',
'draftResponse' : '[]',
'pageHistory' : '0',
'fbzx' : '9150375950543103543'
}

Code


為了讓程式的行為看起來不那麼程式(?),設置隨機填寫欄位值與隨機延遲時間。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import re
import time
import random
import numpy as np
import requests as rq

url = 'https://docs.google.com/forms/d/e/********************/formResponse'
params = ['州普', '卅普', '川普']
payload = {
'entry.1216123536' : '',
'fvv' : '0',
'draftResponse' : '[]',
'pageHistory' : '0',
'fbzx' : '9150375950543103543'
}

num = 10 # number of executions
period = np.arange(0.5, 5.0, 0.1)
delay = 0 # delay of execution
while num > 0:
try:
payload['entry.1216123536'] = random.choice(params) # random choice
res = rq.post(url, data=payload)
res.raise_for_status()
if res.status_code == 200 :
delay = round(random.choice(period), 2) # round off to the 2nd decimal place
print('Fill Out : ' + payload['entry.1216123536'] + ' delay : ' + str(delay) + ' sec')
time.sleep(delay)
except rq.HTTPError:
print('HTTP Error!')

num -= 1

↓ 嗯,只有兩個人答對呢(?)

Note

如果表單必須登入Google帳號,那就先登入吧:

1
2
3
4
5
6
login_url = 'https://accounts.google.com/ServiceLoginAuth'
login_data = {'Email': '{YOUR_GMAIL}', 'Passwd': '{YOUR_PASSWORD}'}
session = rq.session()
session.post(login_url, data=login_data)
# do something...
# e.g. session.post(form_url, data=payload)

0%