POST 请求在 Postman 中有效,但在 Python 请求中无效(200 响应机器人检测)
Posted
技术标签:
【中文标题】POST 请求在 Postman 中有效,但在 Python 请求中无效(200 响应机器人检测)【英文标题】:POST request works in Postman, but not in Python Requests (200 response with robot detection) 【发布时间】:2019-07-19 14:22:10 【问题描述】:我有一个与 Postman 和 cURL 完美配合的 POST 请求(它返回一个 JSON 数据块)。但是,当我使用 Python 的 Requests 库执行完全相同的请求时,我得到了 200 成功响应,但我得到的不是 JSON blob,而是:
<html>
<head>
<META NAME="robots" CONTENT="noindex,nofollow">
<script src="/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3">
</script>
<body>
</body></html>
我使用 HTTP 请求箱来验证来自 Postman/cURL 的请求与来自 Python Requests 的请求完全相同。
这是我在 cURL 中的 Postman 请求:
curl -X POST \
https:/someurl/bla/bla \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 2488e914-531e-4ac7-ae8d-8490b2242396' \
-H 'Referer: https://www.host.com/bla/bla/' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0' \
-H 'cache-control: no-cache' \
-d '"json1":"blabla","etc":"etc"'
...这是我的 Python 代码:
payload =
"json1": "blabla",
"etc": "etc",
headers =
'Host': 'www.host.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://www.host.com/bla/bla/',
'Content-Type':'application/json',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive',
'Origin': 'https://www.host.com',
s = requests.Session()
response_raw = s.post(url, json=payload, headers=headers)
print(response_raw)
print(response_raw.text)
我已验证有效负载和标头正确且有效。任何帮助将非常感激;谢谢!
【问题讨论】:
尝试打开调试并检查实际发出的请求...from http.client import HTTPConnection; HTTPConnection.debuglevel = 1
什么是url,如果可以访问你可以分享...
你的 Postman-Token: 2488e914-531e-4ac7-ae8d-8490b2242396
在 python 代码中在哪里?你在curl
中有它,但在 python 中没有。
@Matej 由 Postman 自动添加——我从配置中删除了它,它仍然可以正常工作。我更新了我原来的问题,说明 Postman 和 Python 请求的 HTTP 请求是相同的,以收到的 HTTP 请求箱来衡量:)
@Matej 是的,响应代码相同,但实际响应不同。 Curl 返回 json 数据,而 Python 返回 HTML,说明 Incapsula 阻止了请求。
【参考方案1】:
您收到 200 成功响应,但响应中没有 JSON 数据。
这意味着这只是一个响应对象。它仅包含响应代码
从响应中提取 blob 信息,将响应对象转换为 json
只需json_resp = response_raw.json()
此json_resp
包含您的实际回复详细信息。
【讨论】:
这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review @Kvam 这就是有效的答案。如果在评论中添加它,对于那些落在这里的人来说,这可能会被忽略。我建议您仔细阅读问题以及作者期望的解决方案。【参考方案2】:我有一个类似的问题,我可以通过在请求中发送一个 cookie 来解决。试试这个:
...
my_cookie = "Cookie": "cookie text..."
s = requests.Session()
response_raw = s.post(url, json=payload, headers=headers, cookies=my_cookie)
print(response_raw)
print(response_raw.text)
print(response_raw.content)
您可以从浏览器开发工具控制台的“请求标头”部分的“网络”选项卡中获取 cookie。听起来您也可以使用 Python 的 CookieJar 库获取 cookie。
【讨论】:
【参考方案3】:尝试将验证选项作为 false 传递。
requests.get('https://example.com', verify=False)
【讨论】:
以上是关于POST 请求在 Postman 中有效,但在 Python 请求中无效(200 响应机器人检测)的主要内容,如果未能解决你的问题,请参考以下文章
简单的 POST 请求在 Postman 中有效,但在浏览器中无效
HTTP POST 请求在 Postman 中有效,但在代码中无效
MAXIMO API 7.6.1 POST 以编程方式创建服务请求创建空记录,但在 POSTMAN 中同样有效
对 API 的请求在 Postman 中有效,但在我尝试使用 laravel/guzzle 时无效