使用Python Requests获取网站Cookie中Token遇到问题求助
解决方案:获取登录后的Token并用于后续请求
问题根源分析
- 部分网站的Token并非在登录请求直接返回,而是需要登录后访问特定页面(比如用户首页、个人中心)才会通过
Set-Cookie返回;若你仅发送了登录请求,未触发后续生成Token的步骤,自然拿不到目标Token。 - 若未使用
requests.Session()维护会话,普通请求的Cookie不会自动持久化,后续请求无法继承登录后的Cookie状态,也会导致Token丢失。
具体解决步骤
1. 用Session对象完整复刻浏览器流程
requests.Session()会自动保存所有响应的Cookie,需用同一个Session实例完成登录、触发Token生成、后续请求的全流程:
import requests # 创建会话对象,自动维护Cookie session = requests.Session() # 1. 发送登录请求(替换为实际登录接口和参数) login_payload = { 'username': '你的用户名', 'password': '你的密码' } session.post('https://目标网站域名/login', data=login_payload) # 2. 访问Chrome中看到Token的那个页面(比如用户首页),触发服务器返回Token session.get('https://目标网站域名/user-dashboard') # 查看会话中所有Cookie,此时应该包含目标Token print(session.cookies.get_dict())
2. 提取Token并用于后续请求
若需手动将Token填入请求头的Cookie字段,可从Session的Cookie中提取后构造请求头:
# 从会话Cookie中取出目标Token(替换为Chrome中看到的Token名称) target_token = session.cookies.get('Token的Cookie键名') session_id = session.cookies.get('eZSESSID') # 构造包含Token的请求头 custom_headers = { 'Cookie': f'eZSESSID={session_id}; Token的Cookie键名={target_token}' } # 发送后续请求 response = session.get('https://目标网站域名/需要Token的接口', headers=custom_headers)
3. 关于eZSESSID生成Token?
不可能直接通过eZSESSID生成Token。Token通常是服务器端结合会话ID、用户身份信息、加密密钥生成的,客户端没有足够的密钥和逻辑逆向生成,必须通过服务器触发的流程获取。
额外排查点
- 复刻浏览器请求头:检查Chrome中登录和后续请求的
User-Agent、Referer等字段,在代码中添加这些请求头,部分网站会校验这些字段,缺失则不返回Token。 - 确认登录成功:打印登录响应的内容,验证是否真的登录成功,若登录失败,服务器不会生成Token。
内容的提问来源于stack exchange,提问作者Ludovic
相关产品推荐
相关产品推荐

