1. 校园网自动登录的需求与实现思路每次开机后手动打开浏览器、输入账号密码登录校园网这种重复性操作既浪费时间又容易让人烦躁。特别是赶着上课或者开会时这种繁琐的登录流程简直让人抓狂。作为一名经常需要连接校园网的学生我决定用Python来解决这个痛点。实现自动登录校园网的核心思路其实很简单用程序模拟人类在浏览器上的操作。具体来说就是自动打开校园网登录页面自动填写账号密码自动选择运营商如电信、移动等自动点击登录按钮听起来是不是很像我们平时手动操作的步骤只不过现在把这些操作交给Python脚本来完成。这种自动化方式特别适合校园网这种基于Web页面的认证系统因为它不需要破解任何协议只是忠实地模拟人类操作完全合法合规。2. 环境准备与依赖安装2.1 Python环境配置首先确保你的电脑已经安装了Python环境。推荐使用Python 3.7及以上版本因为我们要用到的Selenium库在这些版本上运行最稳定。如果你还没安装Python可以去官网下载安装包记得勾选Add Python to PATH选项这样可以直接在命令行使用python命令。安装完成后打开命令提示符cmd输入以下命令检查是否安装成功python --version如果看到类似Python 3.9.7的输出说明安装成功。2.2 安装Selenium库Selenium是一个强大的Web自动化测试工具我们可以用它来控制浏览器自动完成各种操作。安装Selenium非常简单只需在命令行运行pip install selenium这个命令会自动下载并安装最新版的Selenium库及其依赖。2.3 下载浏览器驱动Selenium需要通过浏览器驱动来控制浏览器。不同浏览器需要不同的驱动ChromechromedriverEdgemsedgedriverFirefoxgeckodriver这里以Edge浏览器为例你需要下载与你的Edge浏览器版本匹配的msedgedriver。可以在Edge浏览器地址栏输入edge://settings/help查看版本号然后去Microsoft的EdgeDriver下载页面获取对应版本的驱动。下载后建议将驱动文件如msedgedriver.exe放在一个固定目录比如D:\Webdriver方便后续脚本调用。3. 编写自动登录脚本3.1 基础脚本框架我们先搭建脚本的基本框架导入必要的库并定义关键变量from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 配置信息 YOURusername 你的学号 # 替换为你的校园网账号 YOURpassword 你的密码 # 替换为你的密码 your_services stu # 运营商选择dxwx(电信) stu(学生) yd(移动无线) ydyx(移动有线) # Edge驱动路径 webdriver_path rD:\Webdriver\edgedriver_win32/msedgedriver.exe service Service(webdriver_path) # 校园网登录页面URL url http://172.16.245.50/srun_portal_pc?ac_id1amp;srun_wait1amp;themebasic3.2 浏览器启动与页面加载接下来编写启动浏览器并加载登录页面的代码# 启动Edge浏览器 driver webdriver.Edge(serviceservice) driver.get(url) # 暂停几秒等待网页加载 time.sleep(3)这里使用time.sleep(3)让程序等待3秒确保页面完全加载。在实际应用中更推荐使用WebDriverWait来实现智能等待后面会讲到。3.3 定位页面元素并填写信息现在我们需要找到页面上的用户名输入框、密码输入框和运营商选择下拉菜单# 定位页面元素 username driver.find_element(By.ID, username) password driver.find_element(By.ID, password) select_service Select(driver.find_element(By.ID, domain)) # 填写登录信息 driver.find_element(By.ID,username).click() username.send_keys(YOURusername) driver.find_element(By.ID,password).click() password.send_keys(YOURpassword) select_service.select_by_value(your_services)这段代码首先通过元素的ID属性定位各个输入框然后模拟点击和键盘输入操作填写账号密码最后选择对应的运营商服务。3.4 点击登录按钮填写完信息后最后一步就是点击登录按钮# 等待登录按钮可点击 login_button WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, login)) ) # 点击登录按钮 login_button.click() # 等待登录完成 time.sleep(3) # 关闭浏览器 driver.quit()这里使用了WebDriverWait来智能等待登录按钮变为可点击状态比固定的time.sleep更可靠。等待最多10秒如果10秒内按钮变为可点击就立即执行点击操作否则抛出超时异常。4. 脚本优化与增强4.1 添加异常处理网络环境不稳定时脚本可能会因为各种原因失败。添加异常处理可以让脚本更健壮try: # 启动浏览器 driver webdriver.Edge(serviceservice) driver.get(url) # 等待页面加载 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, username)) ) # 填写登录信息 username driver.find_element(By.ID, username) password driver.find_element(By.ID, password) select_service Select(driver.find_element(By.ID, domain)) username.send_keys(YOURusername) password.send_keys(YOURpassword) select_service.select_by_value(your_services) # 点击登录 login_button WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, login)) ) login_button.click() # 验证是否登录成功 WebDriverWait(driver, 10).until( EC.url_contains(success) # 假设登录成功会跳转到包含success的URL ) print(登录成功) except Exception as e: print(f登录过程中出错: {str(e)}) finally: # 确保浏览器总是会被关闭 if driver in locals(): driver.quit()4.2 添加日志记录为了方便排查问题我们可以添加简单的日志记录功能import logging from datetime import datetime # 配置日志 logging.basicConfig( filenamecampus_network.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) try: # ...之前的登录代码... logging.info(校园网登录成功) except Exception as e: logging.error(f登录失败: {str(e)})这样每次运行脚本都会在campus_network.log文件中记录运行结果方便后续查看。4.3 网络连通性检测在尝试登录前可以先检测网络是否已经连通避免不必要的登录操作import socket def is_network_available(): try: # 尝试连接一个知名网站 socket.create_connection((www.baidu.com, 80), timeout5) return True except OSError: return False if not is_network_available(): # 只有网络不通时才尝试登录 # ...执行登录代码... else: print(网络已连接无需登录)5. 打包为EXE并设置开机自启动5.1 使用PyInstaller打包脚本为了让脚本在没有Python环境的电脑上也能运行我们可以将其打包为独立的EXE文件。首先安装PyInstallerpip install pyinstaller然后使用以下命令打包pyinstaller -F --noconsole your_script.py参数说明-F打包为单个EXE文件--noconsole运行时不显示控制台窗口打包完成后在dist目录下会生成your_script.exe文件。5.2 通过任务计划程序设置开机自启Windows的任务计划程序可以让我们在开机时自动运行脚本按WinR输入taskschd.msc打开任务计划程序右侧点击创建任务在常规选项卡中输入名称如校园网自动登录选择不管用户是否登录都要运行勾选使用最高权限运行在触发器选项卡中点击新建选择登录时或启动时在操作选项卡中点击新建选择刚才打包的EXE文件在条件选项卡中取消勾选只有在计算机使用交流电源时才启动此任务在设置选项卡中可以设置任务失败时的重试策略设置完成后每次开机系统就会自动运行你的脚本完成校园网登录。5.3 添加延迟启动有时候系统刚启动时网络服务还没完全准备好可以给脚本添加延迟启动在任务计划程序中编辑你的任务在触发器选项卡中编辑现有的触发器勾选延迟任务时间设置为30秒或1分钟点击确定保存设置这样系统会在启动后等待指定时间再运行脚本确保网络服务已经可用。6. 安全注意事项虽然自动化登录很方便但也要注意账号安全不要硬编码密码上面的示例中直接在脚本中写密码是为了演示方便。实际使用时建议使用配置文件存储密码并设置适当的文件权限或者使用Windows凭据管理器存储密码更安全的做法是让脚本运行时提示用户输入密码保护脚本文件如果你把脚本分享给他人使用确保删除其中的敏感信息或者提供配置文件模板让他们自己填写定期检查脚本校园网登录页面可能会更新导致脚本失效。建议定期测试脚本是否仍然有效关注学校网络中心的通知在脚本中添加版本检查功能使用最小权限为任务计划程序任务使用普通用户账户避免使用管理员权限运行脚本7. 扩展功能与进阶玩法7.1 多设备同步登录如果你在宿舍有多个设备台式机、笔记本等可以创建一个简单的HTTP服务让其他设备通过它来触发登录from http.server import HTTPServer, BaseHTTPRequestHandler import threading class LoginHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path /login: # 在这里调用你的登录函数 success login() # 假设login()是你的登录函数 self.send_response(200) self.send_header(Content-type, text/plain) self.end_headers() self.wfile.write(bLogin triggered) else: self.send_response(404) self.end_headers() def start_server(): server HTTPServer((0.0.0.0, 8080), LoginHandler) print(Login server started on port 8080) server.serve_forever() # 在另一个线程中启动服务器 server_thread threading.Thread(targetstart_server, daemonTrue) server_thread.start()这样你可以在手机或其他设备上访问http://电脑IP:8080/login来触发登录。7.2 网络状态监听可以监听网络状态变化在检测到断网时自动重连import wmi import pythoncom import threading class NetworkWatcher: def __init__(self, callback): self.callback callback self.running True def start(self): thread threading.Thread(targetself._watch, daemonTrue) thread.start() def _watch(self): pythoncom.CoInitialize() c wmi.WMI() watcher c.Win32_NetworkAdapter.watch_for( notification_typeModification, delay_secs5 ) while self.running: try: adapter watcher() if adapter.NetEnabled: print(Network adapter changed, triggering login) self.callback() except Exception as e: print(fNetwork watch error: {e}) def stop(self): self.running False # 使用示例 def on_network_change(): print(Network state changed, attempting login) # 调用你的登录函数 watcher NetworkWatcher(on_network_change) watcher.start()7.3 添加系统通知为了让用户知道登录状态可以添加系统通知from win10toast import ToastNotifier def notify(title, message): toaster ToastNotifier() toaster.show_toast( title, message, duration5, threadedTrue ) # 登录成功后调用 notify(校园网登录, 自动登录成功)需要先安装win10toast库pip install win10toast