校园网认证系统是高校信息化建设的基础设施,但繁琐的登录流程常常影响用户体验。以深圳大学为例,师生每次连接校园WiFi都需要手动打开浏览器输入账号密码,在实验室、图书馆等需要频繁切换网络环境的场所尤其不便。这个Python脚本正是为解决这个痛点而生——通过自动化技术实现静默认证,让联网过程"无感化"。
传统校园网认证通常采用Portal认证方式,用户设备连接网络后会被重定向到认证页面。深大的系统在此基础上还加入了会话保持机制,默认每12小时强制下线一次。这就导致师生每天至少需要重复认证两次,长期积累的时间损耗相当可观。
程序采用requests库模拟浏览器表单提交,关键技术点包括:
python复制import requests
from bs4 import BeautifulSoup
session = requests.Session()
login_url = "https://auth.szu.edu.cn/cas/login"
portal_test = "http://connect.rom.miui.com/generate_204" # 用于检测网络状态
def check_online():
try:
return session.get(portal_test, timeout=3).status_code == 204
except:
return False
通过浏览器开发者工具分析认证流程,发现深大系统采用CAS协议,主要参数包括:
execution:服务端生成的会话标识_eventId:固定为"submit"username/password:Base64编码的认证信息重要提示:密码字段虽然在前端显示为明文,但实际传输时会经过RSA加密。直接模拟提交需要先调用/js/encrypt.js提供的加密方法。
python复制def campus_login(username, password):
# 首次请求获取execution参数
first_resp = session.get(login_url)
soup = BeautifulSoup(first_resp.text, 'html.parser')
execution = soup.find('input', {'name': 'execution'})['value']
# 构造表单数据
payload = {
'username': username,
'password': encrypt_password(password), # 需实现RSA加密
'execution': execution,
'_eventId': 'submit',
'geolocation': ''
}
# 提交认证
post_resp = session.post(login_url, data=payload)
return "success" in post_resp.url # 认证成功会跳转到包含success的URL
为实现全天候自动认证,需要添加以下功能:
python复制import time
import configparser
def daemon_loop():
config = configparser.ConfigParser()
config.read('accounts.ini')
retry_count = 0
while True:
if not check_online():
for section in config.sections():
user = config[section]['username']
pwd = config[section]['password']
if campus_login(user, pwd):
retry_count = 0
break
else:
retry_count += 1
sleep_time = min(2 ** retry_count, 300) # 最大间隔5分钟
time.sleep(sleep_time)
else:
time.sleep(300) # 正常状态每5分钟检测一次
针对不同操作系统推荐以下部署方式:
bash复制# Linux系统服务示例
[Unit]
Description=SZU Auto Login
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/szu_login/main.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 400错误 | 表单参数缺失 | 检查execution参数获取逻辑 |
| 403禁止访问 | 请求头被拦截 | 添加User-Agent模拟浏览器 |
| 重复跳转 | Cookie失效 | 清除旧会话重新初始化 |
| 密码错误 | 加密异常 | 验证RSA公钥是否匹配 |
python复制def check_quota():
quota_url = "http://self.szu.edu.cn/portal/quota"
resp = session.get(quota_url)
soup = BeautifulSoup(resp.text, 'html.parser')
quota = soup.find('span', {'class': 'quota-num'}).text
return float(quota.split('GB')[0])
虽然自动登录带来便利,但需要注意:
实际部署时,建议添加以下安全措施:
这个项目最有趣的部分在于如何平衡自动化与稳定性——太频繁的检测会增加服务器压力,间隔太长又会影响使用体验。经过实测,5分钟的检测间隔配合异常时的指数退避机制,能在用户体验和系统负载间取得良好平衡。对于需要更高可靠性的场景,可以考虑结合网络状态变更事件(如DHCP续期)来触发检测,这需要更底层的网络编程知识。