Skip to content
Python:自動填寫Google表單
📆2019-04-20 | 📂Python

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


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

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

Url

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

Data

python
payload = {
    'entry.1216123536' : '',
    'fvv' : '0',
    'draftResponse' : '[]',
    'pageHistory' : '0',
    'fbzx' : '9150375950543103543'
}

Code

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

python
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帳號,那就先登入吧:

python
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)

Last updated: