使用Python登录带条款同意复选框的AJAX网站时登录失败求助
问题原因
你无法成功登录的核心问题有3个:
- 提交的登录payload缺少「同意条款」对应的参数
- CSRF Token获取方式不符合站点要求,你直接从cookie提取token,但站点要求提交的是登录页HTML中隐藏表单字段内的token
- 登录请求提交的地址错误,你代码中提交到了
/Login/Check,但实际表单配置的提交地址是/Login/Login
代码修改方案
第一步:先确认同意条款对应的参数名
打开浏览器F12开发者工具,切换到「网络」选项卡,手动勾选同意框、输入账号密码点击登录,查看登录请求的Form Data部分,找到对应同意条款的参数键名,常见为agree、termsAgreed、IsAgree这类,值一般为on或true。
第二步:修改后的完整代码
from bs4 import BeautifulSoup as bs import requests URL = 'https://www.somesite.com/Login' # 修正登录提交地址,和表单action保持一致 LOGIN_ROUTE = 'https://www.somesite.com/Login/Login' user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.3' HEADERS={'User-Agent':user_agent} s = requests.session() # 先请求登录页面,提取表单中的CSRF Token login_page_resp = s.get(URL, headers=HEADERS) soup = bs(login_page_resp.text, 'html.parser') csrf_token = soup.find('input', {'name': '__RequestVerificationToken'})['value'] print("\ncsrf_token " + csrf_token) login_payload = { 'Login.UserName': 'username', 'Login.Password': 'password', '__RequestVerificationToken': csrf_token, # 补充同意条款参数,参数名和值替换为你抓包拿到的实际内容 'termsAgreed': 'on' } login_req = s.post(LOGIN_ROUTE, headers=HEADERS, data=login_payload) if login_req.status_code==200 and '请同意条款' not in login_req.text: print(str(login_req.status_code) + " login successful\n") else: print(str(login_req.status_code) + " login unsuccessful") print(login_req.text)
额外说明
如果修改后仍然报错,可以把抓包拿到的所有Form Data参数都按键值对添加到login_payload中,确保提交的参数和浏览器手动提交的完全一致即可。
内容的提问来源于stack exchange,提问作者faiza rashid
相关产品推荐
相关产品推荐

