Python编写Coolmod自动登录机器人时POST请求无法正常工作问题求助
coolmod站点自动登录失败排查修复方案
核心问题修复
1. 删除硬编码的Content-Length请求头
headers2中写死的Content-Length: '106'是浏览器单次请求的固定值,你代码中随机生成的隐藏字段名长度不固定,会导致实际payload长度和声明的长度不匹配,被服务端直接拒绝请求。requests会自动根据提交的payload计算正确的长度,直接删除headers2中的这一行即可。
优化逻辑降低出错概率
2. 避免硬编码索引提取隐藏字段
当前用findAll(...)[1]取第二个匹配的隐藏字段,页面结构稍有变动就会提取到错误的字段名,建议直接提取登录表单全部参数自动组装payload:
# 替换原有token提取、payload构造逻辑 login_form = soup.find('form', {'action': '/web/auth/login'}) payload = {} for input_item in login_form.find_all('input', type=['hidden', 'checkbox']): if input_item.get('name'): payload[input_item['name']] = input_item.get('value', '') # 覆盖账号密码字段 payload['jform[email]'] = '实际登录邮箱' payload['jform[password]'] = '实际登录密码' payload['remember-me'] = 'on'
3. 校验登录状态
登录成功后服务端会返回302跳转,可通过以下代码确认请求链路是否符合预期:
# 查看是否有302跳转记录 print(f"跳转历史: {r2.history}") # 查看最终落地页地址 print(f"最终页面URL: {r2.url}") # 打印session内存储的cookie确认是否拿到登录凭证 print(f"当前session Cookie: {s.cookies.get_dict()}")
可选排查手段
如果以上修复后仍无法登录,可开启requests调试日志,把打印的请求报文和浏览器提交的登录请求逐字段对比,排查漏传/错传的参数:
import logging import http.client http.client.HTTPConnection.debuglevel = 1 logging.basicConfig(level=logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True
内容的提问来源于stack exchange,提问作者Luis Pérez
相关产品推荐
相关产品推荐

