[問題] 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