[问题] POSTMAN和python跑request结果不一致

楼主: Federer5566 (费德勒5566)   2024-10-11 14:52:26
先前有问问题,承蒙几位前辈指正
所以做了一些测试
先以postman送https post,顺利执行成功
但用python用request去送,却出现
Failed to establish a new connection: [WinError 10060]
所以试着用wireshark去抓封包观察
发现两者在最初的standard query和回应的standard query response都长一样
但下一步却connect到不同的地方
postman是正确的CONNECT到我请求的API位址
但python request却是CONNECT到mobile.events.data.microsoft.com
一整个超莫名其妙
觉得问题应该就出在这里,但完全不知道如何解决
不晓得该怎么解决这个问题
有劳高手指点><
python code是长下面这样(私密资料已代换):
import requests
import json
url = https://API位址
payload = json.dumps({
"to": "XXXXXX",
"messages": [
{
"type": "text",
"text": "测试讯息"
}
]
})
headers = {
'Content-Type': 'application/json',
'Authorization': 认证资料
}
response = requests.request("POST", url=url, headers=headers, data=payload)
作者: TuCH (谬客)   2024-10-11 15:03:00
requests.post?
楼主: Federer5566 (费德勒5566)   2024-10-11 15:28:00
改resquests.post也是一样的error codewireshark抓包的部分也一样导去那个怪地方
作者: Hsins (翔)   2024-10-11 16:34:00
你可能还需要补一些资讯;这个错误是使用 requests 就立刻出现,还是打了一阵子请求才出现?仅仅只有这个错误讯息的话,就只能知道是连接超时,涉及的原因很多。多数人碰到这个问题,比较有可能是因为超过了对方服务器允许的连结次数、或者是同一 IP 位址超过连结数量,又或是 IP 被封禁导致。抓包如果是出现错误之后才去抓,那也有可能是超过访问上限而被转址,并不能够有效定位问题唷。假设你是同一台机器,且程式或 Postman 均没有使用 proxy访问,比较有可能就是超过访问次数导致的,因为 Postman 只打一次请求,而许多人用 requests 会写在循环中发起多个请求;另外一个可能就是 headers 携带的内容跟 Postman 存在差异,比如许多站点还会根据 User-Agent 去判断。
楼主: Federer5566 (费德勒5566)   2024-10-11 17:07:00
嗯,我是按F5前就让wireshark开始抓,应该不算是跑失败才去抓;另外,也没有用循环去送request,只下1次;User-Agent部分,我试着把postman的User-Agent设给Python的requests去带,结果看起来还是一样...发现没回应到一个问题,我的错误是F5之后过一段时间才出现,并不是执行后马上跳出来
作者: Hsins (翔)   2024-10-11 17:59:00
如果不是连线次数超过上限或是连线过于频繁,比较大的可能还是在 headers 的资讯。在 Postman 里面可以生成请求对应的 Python 程式码,你可以先试试看
作者: blc (Anemos)   2024-10-11 18:15:00
data=payload 改成 json=payload 试试
作者: lycantrope (阿宽)   2024-10-11 21:24:00
先json.dumps data=json.dumps(payload)
作者: hanksky (鲁蛇一枚)   2024-10-12 08:44:00
我也曾经有过postman可以,程式不可以,后来把postman旁边提供输出的python程式码,去和自己比对,才抓出自己的问题
作者: HerryL (Hollander)   2024-10-19 21:35:00
那,用curl会得到哪种结果?
作者: JerryChungYC (JerryChung)   2024-10-21 15:09:00
有类似问题 get在浏览器工具编辑和重放请求可以成功但请求复制curl转python或丢postman都会被判定403一样是11号开始发生的因为是get 没上面data或json的问题 还有什么可能原因吗
作者: Hsins (翔)   2024-10-21 18:05:00
403 的错误资讯跟你说没权限,要嘛 headers 没有带足够的认证资讯,要嘛就是 IP 被封;另外对方判断认证资讯的方式跟逻辑,也会影响要怎么带,很多时候未必是直接照着送就可以了。
作者: JerryChungYC (JerryChung)   2024-10-21 18:57:00
用Fiddler获得的请求 用内建的Composer Raw有试过headers顺序变换 或是把key全转小写 都还是成功DevTools的请求根据Fiddler Raw格式填上 也能成功py用requests或http.client都不行 cmd用curl也不行不知道还有什么可能的判断方式在Fiddler把 header 剩 Host, Authorization,Accept,Accept-Encoding, Accept-Language, User-Agent,Connection 还是有成功 还是python有什么连线方式不同
作者: Hsins (翔)   2024-10-21 19:17:00
也有可能是对方需要 HTTP2 而 requests 不支持,一般会改用httpx 试试有些站点还会根据 TLS fingerprint 去比对客户端,这时候会用 curl_cffi 套件处理。可能的状况有很多,要看对方服务器的判断机制是什么如果浏览器、Postman 跟抓包工具都正常的话,比较有机会是TLS 指纹的问题如果对方反爬的限制不严格,那 httpx 也可以设定简单的 ciphers 绕过
作者: JerryChungYC (JerryChung)   2024-10-21 21:11:00
更新一下 curl -v "url" -H "Authorization: ..."-H "User-Agent: ..." 可以成功 是用 HTTP/1.1会自动补上 Host 跟 Accept: */*最后先用subprocess跟curl解决 requests暂时没想法
作者: blc (Anemos)   2024-10-23 18:49:00
https://httpbin.org/headers 这个会回传送出去的headers
楼主: Federer5566 (费德勒5566)   2024-10-28 14:39:00
不好意思,我是这篇的原po,我的python code就是从POSTMAN里转成python的,偏偏wireshark抓包结果不一
作者: Hsins (翔)   2024-10-28 17:06:00
如同我前面说的,你要不要再试试看调整 TLS 指纹或改用 HTTP2

Links booklink

Contact Us: admin [ a t ] ucptt.com