向 Python 中的 google 表单发送 POST 请求
Sending a POST request to google forms in Python
所以我创建了一个 google 表单,这里是 link :https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/viewform
我想用 Python 的 Python 回答,我试过了,但是 returns 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)
谢谢!
更新:
我错了。该错误不是由您的会话数据丢失或无效引起的。下面的代码示例(session的使用)不是必须的!我刚刚将您的代码示例中的 URL 更改为您问题中的 link,它对我有用:
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/
如果我使用你的代码示例中的 link 我也会收到错误的请求错误,但是使用你的问题中的 link 这有效:
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)
有点晚了,但是,我发现您收到 400 响应错误的可能原因之一是因为在使用 requests
模块时,posted 数据会自动url 编码。因此 posting 包含“+”、“@”等字符的选项将导致错误的格式错误(google 格式用 + 替换空格)。
因此,解决此问题的一种方法是通过传递字符串来请求 post http URL。
url = "https://docs.google.com/forms/xxx/formResponse"
string = "entry.xxx=Option+1&entry.xxx=option2"
r = requests.post(url, params = string)
希望对您有所帮助。
我刚刚通过禁用“回复收据”选项解决了这个问题。
所以我创建了一个 google 表单,这里是 link :https://docs.google.com/forms/d/e/1FAIpQLSeI3-jkg0oedRXECibaxbGZiFyOHGYjvNiOXcADBK9Qq__gUg/viewform
我想用 Python 的 Python 回答,我试过了,但是 returns 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)
谢谢!
更新:
我错了。该错误不是由您的会话数据丢失或无效引起的。下面的代码示例(session的使用)不是必须的!我刚刚将您的代码示例中的 URL 更改为您问题中的 link,它对我有用:
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/
如果我使用你的代码示例中的 link 我也会收到错误的请求错误,但是使用你的问题中的 link 这有效:
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)
有点晚了,但是,我发现您收到 400 响应错误的可能原因之一是因为在使用 requests
模块时,posted 数据会自动url 编码。因此 posting 包含“+”、“@”等字符的选项将导致错误的格式错误(google 格式用 + 替换空格)。
因此,解决此问题的一种方法是通过传递字符串来请求 post http URL。
url = "https://docs.google.com/forms/xxx/formResponse"
string = "entry.xxx=Option+1&entry.xxx=option2"
r = requests.post(url, params = string)
希望对您有所帮助。
我刚刚通过禁用“回复收据”选项解决了这个问题。