使用Python requests库自动提交Google Form返回200无接收数据问题
问题根源
你提交请求里的dlut、fbzx、draftResponse等参数属于谷歌表单每次加载生成的会话绑定动态参数,硬编码固定值会被谷歌后台判定为无效提交,所以即使返回200的成功页面,数据也不会被录入后台。
修复方案
- 每次提交前先发起GET请求获取表单原始页面,提取页面中所有隐藏的非entry开头的动态参数,不要硬编码这些值
- 提交请求时携带符合浏览器特征的
User-Agent请求头,同时设置Referer为表单原始访问地址,降低被拦截概率 - 提前核对所有
entry.xxx参数和表单问题的对应关系,确认选项值、文本内容符合表单字段的校验规则
修正后参考代码
import string import requests import random import re # 表单基础地址 form_base_url = 'https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/' submit_url = form_base_url + 'formResponse' # 初始化会话,自动管理cookie session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': form_base_url + 'viewform' }) # 第一步:GET获取表单页面提取动态参数 res = session.get(form_base_url + 'viewform') # 提取fbzx参数 fbzx = re.search(r'name="fbzx" value="(.*?)"', res.text).group(1) # 提取dlut参数 dlut = re.search(r'name="dlut" value="(.*?)"', res.text).group(1) # 提取draftResponse参数 draft_response = re.search(r'name="draftResponse" value="(.*?)"', res.text).group(1) # 构造提交数据 tex = ''.join(random.choices(string.ascii_lowercase + string.ascii_uppercase, k=random.randint(10,20))) post_data = { 'entry.583812596': 2, 'entry.1023010593': tex, 'entry.583812596_sentinel': '', 'fvv': 1, 'pageHistory': 0, # 动态参数替换为实时提取的值 'dlut': dlut, 'draftResponse': draft_response, 'fbzx': fbzx } # 提交请求 submit_res = session.post(submit_url, data=post_data) print(submit_res.status_code) with open('submit_result.html', 'w', encoding='utf-8') as f: f.write(submit_res.text)
如果表单设置了仅允许登录谷歌账号的用户提交,需要先在当前会话里完成谷歌账号登录,或者携带有效的登录态Cookie再发起提交请求。
内容的提问来源于stack exchange,提问作者woods
相关产品推荐
相关产品推荐

