开发随记-记AHU校园网静默连网小工具的诞生
天下苦校园网久矣。
每次电脑刚从休眠中唤醒,系统就会迫不及待地弹出一个又丑又慢的 Dr.COM 认证网页。最搞心态的是,有时候你手速极快地点了登录,它还幽幽地给你吐出一句“AC认证失败”,逼着你刷新重来。
为了这种毫无营养的操作每天浪费十几秒,简直是对计科人的一种侮辱。既然忍不了,那就动手把它扬了。今天没闲着,顺手把安大的校园网认证逻辑扒了个底朝天,搓了个插网线即刻连网的小玩意儿。
1. 遇事不决,抓个包先
一开始,我脑子里闪过一个极其暴力的念头:用 Selenium 搞个无头浏览器,模拟人工去点击那个“登录”按钮。但转念一想,为了发这么小的一个认证请求,去跑几十兆的浏览器内核?纯粹大炮打蚊子。
任何华丽的 Web 前端,扒掉那层 HTML/CSS 的皮,本质上都是在向服务器发送 HTTP 请求。
于是,我连上校园网,面对那个万恶的登录弹窗,果断按下了 F12 打开开发者工具,切到 Network (网络) 面板,勾选上 Preserve log(保留日志,防止页面跳转把抓包记录冲掉)。
接着,输入账号密码,点击登录。
果不其然,在眼花缭乱的网络请求列表里,一条状态码为 200 的 GET 请求暴露了它的底牌。点开这条请求的 Payload(载荷)一看,里面的参数直白得让人发笑:
DDDDD: 我的宽带账号upass: 我的明文密码wlan_user_ip: 我电脑当前的内网 IP- 还有几个看着像时间戳和固定签名的无聊参数。
原来如此。 这套老旧的计费系统为了规避浏览器的一些跨域限制,在 801 端口开放了一个基于 JSONP 的接口。所谓点击登录,其实就是浏览器把你的账号密码拼接成了一段超长的 URL 网址,然后向这个端口发了个快递而已。
既然看破了手脚,接下来的事情就太简单了。几十行 Python 代码,引入 requests 库,先用一个底层 socket 探针拿到本机的内网 IP,然后把参数按照抓包抓到的格式用字典拼好,requests.get(url, params=payload) 一发入魂。终端里立刻返回了 {"result": 1} 的成功响应。
根本不需要什么网页,一个简单的发包脚本,网络就通了。
2. 扔掉死循环,寻找最优雅的“扳机”
发包脚本写好了,怎么让它自动运行?
网上一搜“校园网自动登录”,一堆教程都在教你写个脚本常驻后台,里面套一个无尽的死循环 while True,每隔 5 秒去 ping 一下百度,ping 不通就触发登录脚本。
这方法管用,但极其难看。这种粗暴的轮询不仅一直占用系统的后台进程,还会无端消耗内存和 CPU。
真正的自动化,应该是“事件驱动”的。
我去翻了翻 Windows 的系统底层机制。发现当你插上网线,或者电脑连上路由器的瞬间,Windows 的内核是知道的。它会在系统的事件查看器(Event Viewer)里,往 Microsoft-Windows-NetworkProfile/Operational 这个日志路径下,精准地拍下一条 Event ID 10000 的记录,代表“网络链路已建立”。
这就好办了。这就相当于系统自带了一个极其灵敏的传感器。
我写了个几十行的 .bat 部署脚本,利用 Windows 自带的任务计划程序(Task Scheduler),把刚刚写好的 Python 发包程序直接绑在这个 Event ID 10000 上。
最终的效果爽到起飞:平时,这个工具的 CPU 和内存占用严格等于 0,因为它根本就没在运行。只有在网卡亮起的那几毫秒内,系统感应到了变化,瞬间拉起引擎,在黑面把认证包扔过去。等你慢吞吞打开浏览器的时候,底层网络早就绿灯放行了。
3. 踩坑过程与后续思考
代码写完准备开源的时候,惊出一身冷汗——我差点把写着自己账号密码的 Python 源码直接 git push 上去给全网发福利了。
为了安全,我重构了一下,把账号密码从代码里抽离了出来。在运行 .bat 部署脚本时,会让用户自己输入密码,然后生成一个本地的 .env 环境变量文件藏在文件夹里。Python 脚本只管读取,不负责存储,顺手把 .env 加进了 Git 的忽略名单。
为了让非计算机专业的小白同学也能直接用,最后请出了 PyInstaller,加上 --noconsole --onefile 参数,把 Python 环境和代码全压成了一个不用安装任何依赖、连运行黑框都没有的单体 .exe 文件。
4. 尾声
把所有东西打包扔上了 GitHub Release,顺便补了个 README 说明。
写代码的过程中就在想,这套思路其实绝不仅限于安大。国内大批采用类似 Dr.COM 网页认证的高校,其实底子都一样。只要稍微改一下那个 Python 的抓包请求体,这套“Windows 事件监听 + 局域网物理隔离凭证 + 单体发包”的骨架,可以直接套用到任何学校的头上去。
后来在 GitHub 上搜了一下,发现早在 22 年就有学长用类似的思路搞过工具了。不过没事,权当是一次从协议逆向到系统底层接口调用的全栈练习。折腾了一下午,换来以后每天顺畅无感的开机体验,这波绝对不亏。
代码在 GitHub 存了个档,各位师傅如果遇到 bug,欢迎来提 Issue。
🔗 项目地址:AHU_AutoLogin