使用Requests库实现Qlink Wireless授权时的异常问题
问题分析与解决方案
你的代码不管凭据对错都返回200,还拿不到正确的套餐页面,核心原因是忽略了ASP.NET表单页面的动态验证字段,以及请求头完整性问题,导致登录请求根本没被服务器正确处理。
具体问题点
- 缺少ASP.NET页面必备的
__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION隐藏字段:这些字段由服务器动态生成,每次访问登录页面都会变化,必须随登录请求一起提交,否则服务器会直接忽略登录请求,返回默认页面。 - 请求头不全:缺少
Referer等关键头,服务器可能判定请求不合法,直接返回非目标页面。 - 未验证登录状态:你直接跳转套餐页面,但实际上登录请求可能根本没生效。
修正后的代码
import requests from bs4 import BeautifulSoup login_url = "https://qlinkwireless.com/members/Login.aspx" profile_url = "https://qlinkwireless.com/customer/members/plans" headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'Referer': login_url } def check_auth(): session = requests.Session() # 第一步:先获取登录页面,提取动态验证字段 login_page = session.get(login_url, headers=headers) soup = BeautifulSoup(login_page.text, 'html.parser') # 提取ASP.NET隐藏字段 viewstate = soup.find('input', id='__VIEWSTATE')['value'] viewstate_generator = soup.find('input', id='__VIEWSTATEGENERATOR')['value'] event_validation = soup.find('input', id='__EVENTVALIDATION')['value'] # 构造登录数据,包含动态字段和你的凭据 login_data = { '__VIEWSTATE': viewstate, '__VIEWSTATEGENERATOR': viewstate_generator, '__EVENTVALIDATION': event_validation, 'ctl00$ctl00$ContentPlaceHolder1$MainContent$login': '你的邮箱', 'ctl00$ctl00$ContentPlaceHolder1$MainContent$password': '你的密码', # 需匹配页面登录按钮的name属性,可查看页面源码确认 'ctl00$ctl00$ContentPlaceHolder1$MainContent$btnLogin': 'Login' } # 第二步:提交登录请求 login_response = session.post(login_url, data=login_data, headers=headers) # 验证登录是否成功:可通过响应内容中的关键字判断 if "Welcome" in login_response.text: print("登录成功") # 第三步:访问套餐页面 profile_response = session.get(profile_url, headers=headers) print(profile_response.text) else: print("登录失败,检查凭据或字段是否正确") check_auth()
额外注意事项
- 需要先安装
BeautifulSoup:执行pip install beautifulsoup4即可,也可用正则表达式提取字段,但解析库更可靠。 - 登录按钮的字段名需和页面源码一致:打开登录页面源码,找到登录按钮的
name属性,替换代码中对应的字段。 - 若遇到验证码,还需额外处理验证码识别逻辑,部分网站会通过验证码拦截自动化请求。
内容的提问来源于stack exchange,提问作者Inside
相关产品推荐
相关产品推荐

