You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:34:52