
1. 为什么需要自动登录脚本每次连接校园网或者CMCC无线网络时最烦人的就是那个跳出来的认证页面。明明已经输入过无数次账号密码系统却像得了健忘症一样每次都要重新验证。特别是早上赶着上课或者开会的时候这个步骤简直能让人抓狂。我读研时就深受其害。实验室电脑需要24小时跑实验数据但校园网每隔12小时就会强制下线一次。有次半夜三点被导师电话叫醒就因为网络断开导致实验中断。后来我用PythonSelenium写了个自动登录脚本从此再也没为这个问题操心过。这类认证页面通常有以下几个特点每次连接WiFi后自动弹出需要重复输入相同的账号密码操作流程高度标准化输入账号→输入密码→选择套餐→点击登录页面元素结构相对固定这些特点正好适合用自动化工具来处理。相比手动操作自动登录脚本有三大优势省时省力无需反复输入凭证连接WiFi后立即完成认证稳定可靠避免因人为操作失误导致的登录失败可扩展性相同原理可适配不同场景如图书馆WiFi、公司内网等2. 环境准备与工具安装2.1 Python环境配置推荐使用Python 3.7及以上版本太老的版本可能会遇到库兼容性问题。我习惯用Anaconda创建独立环境conda create -n wifi_auto python3.8 conda activate wifi_auto如果不用Anaconda也可以用原生Python的venv模块python -m venv wifi_auto source wifi_auto/bin/activate # Linux/Mac wifi_auto\Scripts\activate.bat # Windows2.2 Selenium库安装Selenium是核心工具它能够模拟真实用户操作浏览器pip install selenium同时建议安装这几个辅助库pip install pyautogui # 备用方案模拟键盘操作 pip install requests # 检测网络状态 pip install psutil # 进程管理2.3 浏览器驱动配置这是最容易出问题的环节。以Chrome为例必须确保驱动版本与浏览器完全匹配查看浏览器版本地址栏输入chrome://version/到 ChromeDriver官网 下载对应版本将解压后的chromedriver.exe放到以下任一位置Python安装目录与python.exe同级Chrome安装目录与chrome.exe同级系统PATH包含的任意目录验证安装是否成功from selenium import webdriver driver webdriver.Chrome() driver.get(https://www.baidu.com) driver.quit()如果看到浏览器自动打开并访问百度说明环境配置正确。其他浏览器配置方法类似浏览器驱动名称下载地址Chromechromedriverchromedriver.chromium.orgFirefoxgeckodrivergithub.com/mozilla/geckodriverEdgemsedgedriverdeveloper.microsoft.com/en-us/...3. 编写自动登录脚本3.1 基础版校园网自动登录先看一个最简实现以某高校校园网为例from selenium import webdriver from selenium.webdriver.common.keys import Keys import time def campus_login(username, password): driver webdriver.Chrome() try: driver.get(http://172.30.0.12/) # 替换为你的认证页面URL # 定位元素并输入信息 username_field driver.find_element_by_xpath(//*[idusername]) username_field.send_keys(username) password_field driver.find_element_by_xpath(//*[idpassword]) password_field.send_keys(password, Keys.RETURN) time.sleep(3) # 等待登录完成 finally: driver.quit() # 使用示例 campus_login(你的学号, 你的密码)关键点解析find_element_by_xpath通过XPath定位页面元素send_keys模拟键盘输入Keys.RETURN模拟回车键time.sleep必要的等待时间避免操作过快3.2 增强版CMCC自动登录CMCC的认证流程稍复杂需要处理网络切换import os import time import socket from selenium import webdriver from selenium.webdriver.chrome.options import Options def cmcc_login(username, password): # 1. 断开当前网络 os.system(netsh wlan disconnect) time.sleep(2) # 2. 连接CMCC网络 os.system(netsh wlan connect nameCMCC) time.sleep(5) # 等待连接建立 # 3. 获取当前IP s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect((8.8.8.8, 80)) local_ip s.getsockname()[0] s.close() # 4. 构造认证URL login_url fhttp://211.138.1.149:8888/showLogin.do?wlanuserip{local_ip} # 5. 无头浏览器模式 chrome_options Options() chrome_options.add_argument(--headless) # 无界面模式 driver webdriver.Chrome(optionschrome_options) try: driver.get(login_url) driver.find_element_by_xpath(//*[idusername]).send_keys(username) driver.find_element_by_xpath(//*[idpassword]).send_keys(password) driver.find_element_by_xpath(//*[idloginBtn]).click() time.sleep(3) print(CMCC登录成功) except Exception as e: print(f登录失败: {str(e)}) finally: driver.quit()这个版本新增了以下功能自动切换WiFi网络动态获取本地IP无头模式运行不显示浏览器界面完善的异常处理4. 实用技巧与优化方案4.1 元素定位的多种方式XPath不是唯一选择Selenium提供了多种定位策略# 通过ID定位最快 driver.find_element_by_id(username) # 通过CSS选择器 driver.find_element_by_css_selector(#username) # 通过name属性 driver.find_element_by_name(user) # 通过链接文本 driver.find_element_by_link_text(立即登录) # 通过标签文本 driver.find_element_by_tag_name(input)实际项目中建议优先使用ID和CSS选择器它们的性能最好。当元素没有固定ID时可以这样构造可靠的XPath# 定位包含特定文本的按钮 //button[contains(text(),登录)] # 定位特定class的元素 //div[classlogin-box]//input # 层级定位 //form[idloginForm]/input[1]4.2 智能等待机制硬编码的time.sleep不够优雅推荐使用显式等待from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 10) # 最多等待10秒 element wait.until( EC.presence_of_element_located((By.XPATH, //*[idusername])) ) element.send_keys(username)常用等待条件visibility_of_element_located元素可见element_to_be_clickable元素可点击title_contains标题包含特定文本4.3 异常处理与重试机制网络环境不稳定时需要完善的错误处理from selenium.common.exceptions import NoSuchElementException, TimeoutException MAX_RETRY 3 def safe_login(): for attempt in range(MAX_RETRY): try: driver.get(login_url) # ...登录操作... if 认证成功 in driver.page_source: return True except (NoSuchElementException, TimeoutException) as e: print(f第{attempt1}次尝试失败: {str(e)}) time.sleep(2) return False4.4 多平台适配方案不同设备的认证页面可能有差异可以通过User-Agent伪装mobile_emulation { deviceMetrics: {width: 360, height: 640, pixelRatio: 3.0}, userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X)... } chrome_options Options() chrome_options.add_experimental_option(mobileEmulation, mobile_emulation)常见User-Agent字符串PC端ChromeMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit...iPhoneMozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X)...AndroidMozilla/5.0 (Linux; Android 10; SM-G981B)...5. 部署与自动化运行5.1 开机自启动配置Windows创建批处理文件startup.batecho off python D:\scripts\auto_login.py exit按WinR输入shell:startup打开启动文件夹将批处理文件放入该文件夹5.2 定时任务方案Mac/Linux使用crontab设置每分钟检查网络# 编辑crontab crontab -e # 添加以下行 * * * * * /usr/bin/python3 /home/user/auto_login.py /var/log/wifi.log 215.3 系统服务方式Linux创建systemd服务更可靠# /etc/systemd/system/wifi-auto-login.service [Unit] DescriptionAuto login for campus WiFi Afternetwork.target [Service] ExecStart/usr/bin/python3 /opt/scripts/auto_login.py Restartalways Userroot [Install] WantedBymulti-user.target然后启用服务sudo systemctl daemon-reload sudo systemctl enable wifi-auto-login sudo systemctl start wifi-auto-login6. 常见问题排查6.1 元素定位失败现象脚本报错找不到页面元素解决方案检查浏览器是否加载完成添加等待时间确认XPath是否正确使用浏览器开发者工具验证查看页面是否有iframe嵌套需要先切换iframe检查元素是否在新窗口需要切换窗口句柄6.2 浏览器驱动问题现象浏览器无法启动或版本不匹配解决方案确认驱动版本与浏览器完全一致将驱动放在PATH包含的目录尝试指定驱动路径driver webdriver.Chrome(executable_pathrC:\path\to\chromedriver.exe)6.3 认证页面不弹出现象连接WiFi后认证页面未自动显示解决方案手动访问认证IP通常显示在WiFi详情中使用强制跳转技巧driver.get(http://connect.rom.miui.com/generate_204) if portal in driver.current_url: # 跳转到了认证页面6.4 登录状态保持现象频繁掉线需要重新认证解决方案添加心跳检测import requests def check_online(): try: return requests.get(http://www.baidu.com, timeout3).status_code 200 except: return False设置定时任务每5分钟检查一次部分校园网需要定期访问特定URL保持活跃7. 安全注意事项密码存储不要将密码明文写在脚本中建议使用环境变量或加密存储import os from cryptography.fernet import Fernet # 加密 key Fernet.generate_key() cipher_suite Fernet(key) encrypted_pwd cipher_suite.encrypt(byour_password) # 解密 decrypted_pwd cipher_suite.decrypt(encrypted_pwd).decode()权限控制脚本文件应设置适当权限Linux示例chmod 700 auto_login.py网络审计部分单位可能禁止自动化登录使用前请确认相关规定代码混淆如需分享脚本建议删除敏感信息# 不安全 username 2019123456 # 更安全 username os.getenv(CAMPUS_USERNAME)8. 扩展应用场景8.1 图书馆预约系统同样的技术可用于图书馆座位预约def book_seat(seat_id): driver.get(http://lib.xxx.edu.cn) driver.find_element_by_id(username).send_keys(user) driver.find_element_by_id(password).send_keys(pwd) driver.find_element_by_xpath(f//div[seat-id{seat_id}]).click() # 选择时间段等后续操作...8.2 教务系统查分自动登录教务系统查询成绩def get_scores(): driver.get(edu_url) # ...登录过程... scores driver.find_elements_by_css_selector(.score-item) return [s.text for s in scores]8.3 企业内网应用适配公司VPN登录页面def vpn_login(): driver.get(vpn_url) if 双因素认证 in driver.page_source: # 处理2FA验证 token input(请输入验证码:) driver.find_element_by_id(2fa-code).send_keys(token)9. 性能优化技巧复用浏览器实例避免频繁启动/关闭浏览器# 启动时添加 chrome_options.add_argument(--remote-debugging-port9222) # 后续连接已有实例 driver webdriver.Chrome(optionschrome_options)禁用图片加载加快页面加载速度chrome_options.add_experimental_option( prefs, {profile.managed_default_content_settings.images: 2} )并行处理同时监控多个网络状态from concurrent.futures import ThreadPoolExecutor def monitor_networks(): with ThreadPoolExecutor() as executor: executor.submit(check_campus) executor.submit(check_cmcc)日志记录方便问题追踪import logging logging.basicConfig( filenamewifi.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: # 业务代码 except Exception as e: logging.error(f登录失败: {str(e)}, exc_infoTrue)10. 替代方案比较除了Selenium还有其他自动化方案可供选择方案优点缺点适用场景Selenium功能全面支持复杂交互需要浏览器驱动较重网页自动化测试/爬虫PyAutoGUI模拟真实键鼠操作依赖屏幕分辨率不够稳定桌面应用自动化Requests轻量高效无法处理JavaScript渲染简单API调用Playwright现代架构多浏览器支持较新社区资源少新一代网页自动化Browser自动化无需安装驱动功能有限简单页面操作对于校园网认证这种标准化的Web操作Selenium仍然是综合最优解。它的元素定位精准能处理各种页面跳转和表单提交而且有丰富的异常处理机制。11. 实际案例分享某高校研究生实验室部署的完整解决方案import sys import time from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class AutoLogin: def __init__(self): self.driver None self.log_file network.log def setup_driver(self): options webdriver.ChromeOptions() options.add_argument(--headless) options.add_argument(--disable-gpu) options.add_argument(--no-sandbox) self.driver webdriver.Chrome(optionsoptions) def check_network(self): try: response requests.get(http://www.baidu.com, timeout5) return response.status_code 200 except: return False def campus_login(self): try: self.driver.get(http://172.30.0.12) WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.ID, username)) ).send_keys(os.getenv(CAMPUS_USER)) self.driver.find_element(By.ID, password).send_keys( os.getenv(CAMPUS_PWD), Keys.RETURN) time.sleep(2) if 认证成功 in self.driver.page_source: self.log_status(校园网登录成功) return True except Exception as e: self.log_status(f登录失败: {str(e)}) return False def log_status(self, message): timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) with open(self.log_file, a) as f: f.write(f[{timestamp}] {message}\n) def run(self): self.setup_driver() while True: if not self.check_network(): self.campus_login() time.sleep(300) # 每5分钟检查一次 if __name__ __main__: login AutoLogin() login.run()这个方案实现了7×24小时不间断运行无头模式节省资源完善的日志记录环境变量存储敏感信息定时检测网络状态12. 进阶开发方向对于有兴趣深入研究的开发者可以考虑以下方向可视化配置界面用PyQt/Tkinter开发图形界面方便非技术人员使用多账号轮询支持多个账号自动切换解决单账号流量限制问题网络质量监测集成speedtest-cli自动选择最优网络跨平台支持使用PyInstaller打包为各平台可执行文件云端部署将脚本部署到云服务器远程管理多台设备一个简单的PyQt配置界面示例from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout) class ConfigWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle(自动登录配置) layout QVBoxLayout() self.user_label QLabel(用户名:) self.user_input QLineEdit() self.pwd_label QLabel(密码:) self.pwd_input QLineEdit() self.pwd_input.setEchoMode(QLineEdit.Password) self.save_btn QPushButton(保存配置) self.save_btn.clicked.connect(self.save_config) layout.addWidget(self.user_label) layout.addWidget(self.user_input) layout.addWidget(self.pwd_label) layout.addWidget(self.pwd_input) layout.addWidget(self.save_btn) self.setLayout(layout) def save_config(self): # 保存配置到文件或数据库 pass app QApplication(sys.argv) window ConfigWindow() window.show() sys.exit(app.exec_())13. 资源推荐想要进一步提升自动化技能可以参考这些资源官方文档Selenium Python文档ChromeDriver使用指南实用工具XPath Helper 浏览器插件快速测试XPathBrowserStack 跨浏览器测试平台学习资料《Python网络数据采集》Mitchell著《Selenium自动化测试实战》虫师著Udemy课程《Selenium WebDriver with Python》社区支持Stack Overflow的 selenium标签GitHub上的开源项目参考14. 写在最后技术应该服务于生活而不是制造麻烦。这个自动登录脚本虽然代码量不大但确实解决了我日常生活中的一个高频痛点。从第一次写这个脚本到现在我已经迭代了十几个版本过程中踩过的坑包括浏览器自动更新导致驱动失效学校突然改了认证页面布局无头模式下的证书错误中文路径导致的编码问题每次遇到问题都是一次学习机会。建议初学者可以从最简单的版本开始逐步添加功能。比如先实现基础登录再考虑异常处理最后完善部署方案。不要试图一步到位迭代开发才是正道。