如何使用Python Requests实现路由器弹出式登录认证(无需Selenium)及解决连接报错问题
不用Selenium实现路由器登录的解决方案
嘿,我来帮你搞定这个问题!你的代码之所以没反应还报错,核心问题有两个:一是你用了requests的auth参数(这是HTTP基础认证),但绝大多数路由器的登录根本不是用这种方式;二是你直接POST到根路径,而路由器的登录接口通常是专门的地址,比如/cgi-bin/login.cgi这类,根路径根本不处理登录请求,所以服务器才会断开连接。
下面是具体的解决步骤和改进方案:
第一步:先搞清楚登录的真实请求细节
先用浏览器的开发者工具(按F12打开)抓包分析:
- 打开路由器登录页面,切换到「Network」标签
- 输入账号密码点击登录,仔细看捕获到的POST请求:
- 记下来请求的目标URL(比如
http://192.168.1.1/cgi-bin/login) - 查看表单参数:通常会有
username、password,还可能有隐藏字段比如csrf_token、session_id或者固定的action=login这类参数 - 注意请求头里的Cookie:很多路由器会在你打开登录页时设置会话Cookie,必须带着这个Cookie才能提交登录请求
- 记下来请求的目标URL(比如
第二步:重写你的登录代码
用requests.Session()来自动管理Cookie,先获取登录页面的Cookie和必要参数,再提交登录表单。这里给你一个示例框架:
import requests from fake_useragent import UserAgent # 如果需要解析页面提取隐藏字段,就装BeautifulSoup:pip install beautifulsoup4 # from bs4 import BeautifulSoup def router_login(login_url, username, password): # 创建会话,自动处理Cookie session = requests.Session() # 生成随机User-Agent,避免被识别为爬虫 headers = {"User-Agent": UserAgent().random} # 先访问登录页面,获取必要的Cookie和可能的隐藏字段 try: get_resp = session.get(login_url, headers=headers, timeout=10) get_resp.raise_for_status() # 检查请求是否成功 # 如果页面有隐藏字段(比如csrf_token),用BeautifulSoup提取 # soup = BeautifulSoup(get_resp.text, "html.parser") # csrf_token = soup.find("input", attrs={"name": "csrf_token"})["value"] except requests.exceptions.RequestException as e: print(f"获取登录页面失败:{str(e)}") return False # 构造登录表单数据,完全按照抓包结果来填 login_form = { "username": username, "password": password, # 如果有隐藏字段,就加上,比如: # "csrf_token": csrf_token, # "action": "login" # 很多路由器会有这个固定参数 } # 提交登录请求 try: post_resp = session.post(login_url, headers=headers, data=login_form, timeout=10) print(f"[{login_url}] 响应状态码:{post_resp.status_code} 凭证:{username}-{password}") # 验证是否登录成功:可以检查响应内容里的关键词,比如"仪表盘"、"已登录"、"dashboard" if "dashboard" in post_resp.text.lower() or "已登录" in post_resp.text: print("登录成功!") return True else: print("登录失败,可能是凭证错误或者请求参数不全") return False except requests.exceptions.RequestException as e: print(f"登录请求失败:{str(e)}") return False # 调用的时候替换成你抓包得到的真实登录URL router_login("http://<IP>/cgi-bin/login.cgi", "admin", "admin")
第三步:处理可能遇到的特殊情况
- 密码加密:有些路由器会在前端对密码加密(比如MD5、Base64或者自定义加密),这时候你需要看前端JS代码,用Python实现相同的加密逻辑,再把加密后的密码传给后端
- AJAX登录:如果登录是通过AJAX发送的,那就要找对应的XHR请求,按照它的参数和URL来提交
- 那个alert弹窗:完全不用管它!
alert("hello")只是前端的提示框,和后端的认证逻辑没有关系,只要你的登录请求参数正确,就能成功登录
内容的提问来源于stack exchange,提问作者tokenjunkie




