寒假在家也能猛猛科研?UESTC 校园网自动保活方案(牛马专用版)

写在前面

放寒假了,作为一名致力于为祖国科研事业添砖加瓦的优秀研究生(指我),回家自然也是要远程控制教研室电脑“猛猛学习”的。但众所周知,学校不仅放假偶尔会断电,那个深澜校园网认证也是个时不时抽风的“磨人小妖精”。

这就导致了一个经典的死循环:

  1. 师弟帮忙开了机(或者配置了 BIOS 上电自启)。
  2. 你满怀期待打开 ToDesk/RayLink/Tsun。
  3. 显示设备离线
  4. 因为校园网登录过期或者断网了,此时你只能对着屏幕流下悔恨的泪水,痛斥为什么不能通过意念写 Paper。

为了保障各位英才的科研之路畅通无阻,不再被这点小事绊倒,特写了此脚本为祖国未来的人才保驾护航。

(注:断电重连的前提是你得先配置好 BIOS 的“来电自启/Restore on AC Power Loss”,这个大家根据自己的电脑品牌自行 Google,我就不展开了)

它能干啥?

简单来说,这就是个帮你“盯梢”的脚本,主打一个死缠烂打,永不掉线

  1. 开机自动认证:电脑只要一通电启动,脚本立马在后台静默运行,自动完成校园网认证。
  2. 掉线自动重连:它会每隔几十秒(可配)悄悄 ping 一下外网。一旦发现网断了,立马触发重连机制,直到连上为止。
  3. 微信状态通知:由于人在千里之外,看不见电脑屏幕。所以我加了企业微信通知。连上了、断开了、重连成功了,手机上都能第一时间收到消息,心里稳得一批。

实测效果

  1. 断开校园网
    image-20260202232705190

  2. 启动一次性登录脚本
    image-20260202232713619

  3. 持续监控
    image-20260202232722139

核心原理

虽然初心是为了“牛马”方便,但代码写都写了,还是稍微正经聊两句实现逻辑。

1. 登录协议逆向

其实深澜(Srun)的认证系统虽然前端花里胡哨,核心就是几个 HTTP 请求。我们只需要抓包分析一下它的挑战(Challenge)过程和加密算法。

主要流程大概是:

  • get_challenge: 获取 token 和 client ip。
  • hmd5/chksum: 根据 token 对密码进行一顿加密操作(魔改的 MD5 和 Base64)。
  • srun_portal: 带着加密后的 info 字段去请求登录接口。

本项目对应的 LoginManager 封装了所有复杂的加密逻辑,你只需要填账号密码就行。

2. 状态监测 Daemon

光能登录不行,关键是得“保活”。写了个简单的死循环监控(Daemon):

  • 检测策略:优先 ping 指定 IP(比如阿里的 DNS),如果 ping 不通,再尝试 HTTP 请求(防止被 portal 劫持误判)。
  • 防抖动:不会一断网就疯狂请求,设置了重试阈值,只有连续几次失败才判定为真·断网,发起重连。

3. 开机自启方案

为了让大家(包括我自己)用得爽,我写了个批处理脚本 install_autostart.bat

它会调用 Windows 的 schtasks 命令,创建一个任务计划(名为 UESTC-NET)。

  • 触发器:用户登录时(OnLogon)。
  • 权限:最高权限运行(防止部分系统权限限制导致从脚本无法执行)。
  • 隐蔽性:配合 pythonw.exe,后台静默运行,平时你根本感知不到它的存在。

image-20260203000709246

怎么用?

代码我已经开源了,直接整就行。

第一步:准备工作

  1. 下载项目GitHub 链接,把代码拉到本地(建议放在非 C 盘目录下)。

  2. 安装环境:你需要有 Python。然后运行 pip install -r requirements.txt 装一下依赖。

  3. 填配置
    复制 config.example.pyconfig.py,主要修改以下几项:

    1
    2
    3
    'user': User('202xxxxxxxx', 'Password'),  # 你的学号和密码
    'ac_id': '1', # 主楼/实验室填 1,寝室填 3
    'domain': '@dx-uestc', # 默认校园网不用动(或者直接不填),电信改成 @dx

第二步:一键完成 (推荐)

直接双击项目目录下的 install_autostart.bat

  • 如果你有管理员权限,它会自动帮你建好任务计划。
  • 如果没有,它会自动生成一个 VBS 脚本丢到启动文件夹里(也能用,就是没那么优雅)。

看到“成功”俩字,这事就算成了。

image-20260202233159011

第三步:手动挡(硬核玩家可选)

如果你喜欢自己动手,或者脚本运行失败,可以用命令行手动配置:

方案 A:任务计划程序 (推荐)

1
schtasks /create /tn "UESTC-NET" /tr "\"<Python路径>\pythonw.exe\" \"<项目路径>\\always_online.py\"" /sc onlogon /rl HIGHEST /f

image-20260202233536593

(注:请将 <Python路径> 替换为你的 python.exe 所在目录,<项目路径> 替换为代码实际路径)

方案 B:NSSM 服务
如果你有洁癖,想把它做成系统服务:

1
2
3
nssm install UESTC-NET "<Python路径>\pythonw.exe" "<项目路径>\\always_online.py"
nssm set UESTC-NET AppDirectory "<项目路径>"
nssm set UESTC-NET Start SERVICE_AUTO_START

常见问题 (Q&A)

Q: 运行报错“缺少 requests 模块”?
A: 请确保你运行了 pip install -r requirements.txt,并且 always_online.py 使用的 Python 环境和你安装依赖的环境是同一个。

Q: 怎么看它有没有在运行?
A: 打开任务管理器,找找有没有 pythonw.exe 进程。或者去 logs/ 目录下看看有没有当天的日志文件。

Q: 我想卸载怎么办?
A: 项目里贴心地准备了 uninstall.bat,双击运行即可一键清理任务和文件。清理完后,整个文件夹直接删掉就行。

结语

工具是造出来了,至于有没有由于网络过于通畅,导致寒假真的写了很多代码/论文…那就是另一个悲伤的故事了。

希望能帮到同样需要在假期远程“搬砖”的各位。为了科研(毕业),冲!


项目地址:https://github.com/psmarter/UESTC-NET
如果觉得好用,点个 Star 也是极好的。