Postman请求成功但curl/Python Requests访问Twitter端点失败问题
问题根源与工具差异拆解
1. curl为啥会触发重定向循环?
你复制的curl请求里带了referer: https://twitter.com/i/flow/login,但正常初始访问twitter.com时,浏览器根本不会带这个referer。当你硬加这个登录页的referer访问主页,Twitter的会话验证逻辑会判定你是从登录页跳转回来但没有有效会话,直接把你打回登录页,一来一回就形成了循环。curl的--location参数会自动跟着重定向走,直到触发默认的50次上限,所以才会报Maximum (50) redirects followed。
2. Postman为啥能拿到Cookie?
Postman的重定向处理比curl和Requests灵活:
- 它会在重定向过程中自动修正请求头:比如第一次重定向后,会把referer改成上一次请求的URL,不会一直死抱着初始的登录页referer,自然就跳出了循环。
- Postman默认会自动存Cookie并在后续请求里带上:第一次302响应返回的Cookie会被Postman存下来,后续重定向请求时自动带上,让Twitter认为是有效会话,最终返回200和完整Cookie。
3. Python Requests为啥返回空CookieJar?
Requests默认会自动跟随重定向,但它不会主动修正错误的referer,所以同样会陷入循环。当循环达到内部上限(默认50次)后请求终止:
- 循环过程中每次重定向返回的Cookie可能被后续响应覆盖,或者Twitter在循环里根本不再返回有效Cookie;
- 而且Requests的
response.cookies默认只保留最后一次响应的Cookie,循环终止时的最终响应没Cookie,自然就显示空的<RequestsCookieJar[]>。
和初始302重定向的关系
完全有关。Twitter对无Cookie的初始请求返回302,本来是引导到登录页或初始化会话,但错误的referer头直接破坏了这个流程,导致循环重定向。Postman的重定向处理逻辑刚好适配了Twitter的验证规则,而curl和Requests的默认处理没做到这点。
修复方案
修复curl请求
删掉错误的referer头,同时把sec-fetch-site改成none(对应初始无来源的请求):
curl --location 'https://twitter.com/' \ --header 'authority: twitter.com' \ --header 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ --header 'accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7' \ --header 'cache-control: no-cache' \ --header 'pragma: no-cache' \ --header 'sec-ch-ua: "Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"' \ --header 'sec-ch-ua-mobile: ?0' \ --header 'sec-ch-ua-platform: "Windows"' \ --header 'sec-fetch-dest: document' \ --header 'sec-fetch-mode: navigate' \ --header 'sec-fetch-site: none' \ --header 'sec-fetch-user: ?1' \ --header 'upgrade-insecure-requests: 1' \ --header 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'
修复Python Requests代码
同样删掉referer头,修正sec-fetch-site:
import requests url = "https://twitter.com/" payload = {} headers = { 'authority': 'twitter.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7', 'cache-control': 'no-cache', 'pragma': 'no-cache', # 移除错误的referer头 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', # 初始请求无来源,设为none 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36' } # 允许重定向,Requests会自动收集重定向过程中的所有Cookie response = requests.get(url, headers=headers, data=payload) print(response.cookies)
修改后,curl和Requests都能正常获取Twitter返回的Cookie,不会再出现循环或空CookieJar的问题。
内容的提问来源于stack exchange,提问作者Gordian
相关产品推荐
相关产品推荐

