使用Python将POST请求发送到Google表单

时间:2018-12-05 22:51:22

标签: python post python-requests google-form

所以我创建了一个Google表单,这是链接:https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/viewform

我想用Python的Python回答,我试过,但返回400,错误的请求。

这是我的代码:


import requests
def f():
  url = 'https://docs.google.com/forms/d/e/1FAIpQLSedKV-pzCYZjnp-tAm6Ww9HMoosYPucSL2y9usEIz6yBizbFg/formResponse'
  form_data = {"entry.386860893":"Python","fvv":1,"draftResponse":'[]',"pageHistory":0,"fbzx":-6718008993703688486}
  user_agent = {'Refer':'https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/viewform?fbzx=-6860115379139697000','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
  r = requests.post(url, data=form_data, headers=user_agent)
  print(r)

谢谢!

3 个答案:

答案 0 :(得分:1)

更新:

我错了。该错误不是由您的会话数据丢失或无效引起的。不需要下面的代码示例(使用会话)!我只是将URL从您的代码示例更改为您问题的链接,它对我有用:

import requests
url = 'https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/formResponse'
form_data = {"entry.386860893":"Python","fvv":1,"draftResponse":'[]',"pageHistory":0,"fbzx":-6718008993703688486}
requests.post(url, data=form_data)  # response [200]

原始答案:

可能您需要先获取令牌或其他东西。为了与网站进行互动交流,我建议使用requests.Session()处理与网页的互动。 http://docs.python-requests.org/en/master/user/advanced/ 如果我使用您的代码示例中的链接,我也会遇到严重的请求错误,但是使用您的问题中的链接,这行得通:

url1 = 'https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/viewform'
url2 = 'https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/formResponse'
form_data = {"entry.386860893":"Python","fvv":1,"draftResponse":'[]',"pageHistory":0,"fbzx":-6718008993703688486}

s = requests.Session()
s.get(url)
r = s.post(url2, data=form_data)
print(r)

答案 1 :(得分:0)

有点晚了,但是我发现您收到400错误消息的可能原因之一是因为使用requests模块时,发布的数据会自动进行url编码。因此,发布包含“ +”,“ @” .. etc等字符的选项将导致错误的表单错误(Google表单将空格替换为+)。

因此,解决此问题的一种方法是让请求发布http URL而不是传递字符串。

url = "https://docs.google.com/forms/xxx/formResponse"
string = "entry.xxx=Option+1&entry.xxx=option2"
r = requests.post(url, params = string)

希望这会有所帮助。

答案 2 :(得分:0)

我刚刚通过禁用“响应回执”选项解决了这个问题。 enter image description here