使用requests.get获取的响应头与DevTools不符,无法获取token
问题:使用requests获取登录后token失败,响应头缺失预期字段
我正尝试使用requests库编写自动登录脚本,需要通过requests.get(URL)获取token以用于后续请求,但未能成功获取该token。
我的代码如下:
import requests import time import urllib.request import json s = requests.Session() username = 'XXXX' password = 'XXXX' gameworld = 'XXXX' s.headers['User-Agent'] = "XXXX" s.headers['Content-Type'] = 'application/x-www-form-urlencoded' s.headers['X-Requested-With'] = 'XMLHttpRequest' # get page cookies url = 'https://www.tribalwars.nl/' res = s.get(url) authurl = 'https://www.tribalwars.nl/page/auth' data = f"username={username}&password={password}&remember=1" res = s.post(authurl, data=data, allow_redirects=False) if res.status_code == 200: print("Logged in to account") else: print("Could not login") # log in to world url_gameworld = "https://www.tribalwars.nl/page/play/nl90" res = s.get(url_gameworld) print(res.headers)
执行后得到如下响应头:
{'Server': 'nginx', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0, private, must-revalidate, no-cache, private, public', 'Date': 'Sun, 08 Jan 2023 22:00:11 GMT', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'X-JoinUs': 'We are always searching for skilled admins and passionate coders! Go to career.innogames.com and mention this header in your application!', 'X-SaId': '494161', 'X-Frame-Options': 'NONE'}
但在浏览器DevTools中查看的响应头包含预期的uri(即token)字段,我的请求返回的头中却没有该字段。
解决思路与方案
- 对齐浏览器请求头:手动设置的请求头不完整,浏览器发送的请求会包含
Accept、Referer、Accept-Language等额外头信息。打开DevTools复制对应请求的完整请求头,全部添加到session的headers中,确保请求特征和浏览器一致。 - 验证登录有效性:仅通过状态码判断登录成功不可靠,登录后可以请求一个需要权限的页面,查看返回内容是否包含登录状态标识;也可以检查session的
cookies属性,确认是否存在登录相关的认证cookie。 - 调整重定向设置:登录请求中设置了
allow_redirects=False,可能跳过了携带token的重定向步骤。可以移除该参数,让requests自动跟进重定向,再查看后续响应的头或内容。 - 补充前置请求:部分网站登录前需要获取csrf token等前置参数,仅访问首页可能不够。查看浏览器登录前的请求序列,确认是否有必须的前置接口(比如获取csrf token的请求),并在代码中添加该步骤。
- 检查响应内容:token不一定在响应头里,可能藏在响应的HTML、JSON或脚本中。打印
res.text,搜索是否存在预期的token字段,再通过解析提取。
内容的提问来源于stack exchange,提问作者JanTromp
相关产品推荐
相关产品推荐

