前几天我做了一个 OpenWrt 的 LuCI 插件江西师大校园网,它的目标很直接:把江西师范大学校园网的 SRun 认证流程搬到路由器上,让登录、保活、定时上下线这些事情自动完成,而不是每天手动切换设备折腾。

项目目标

这个项目一开始的目标其实很朴素:

  • 在 OpenWrt 上实现校园网自动认证
  • 提供 LuCI 页面,方便直接在网页里配置账号密码
  • 支持查看在线状态和手动立即登录
  • 支持定时上下线
  • 在特定时段自动切换到手机热点,恢复后再切回校园网
  • 最终能直接通过 GitHub Actions 构建出 .ipk,方便安装

也就是说,项目从一开始就不是“先写脚本再说”,而是直接按“可安装、可配置、可运行”的插件形态去做的。

一些思路

如果只是写一个校园网登录脚本,其实不难,难的是把它做成一个“能长期跑”的 OpenWrt 插件。

因为一旦上了路由器,问题就不只是“能不能登录”了,还包括:

  • OpenWrt 环境里 Python 依赖是否稳定
  • 后台脚本是否能长期运行
  • 网络断开时如何恢复
  • LuCI 配置和后台逻辑怎么对齐
  • 打包流程能不能复现
  • 别人能不能方便地安装

所以这个项目后面的很多提交,实际上都在解决“工程化”问题,而不是单纯补功能。

踩坑记录

有一个很关键的提交是 Minor Update for http request error。这说明最开始的认证请求并没有稳定到“一把过”。

后来的处理方式很实用:

  • 优先尝试 urllib
  • 失败后再退回到系统命令行工具
  • 同时兼容 wgetuclient-fetch
  • 请求失败时把不同来源的错误信息都收集起来

这个坑让我意识到,OpenWrt 上“请求能发出去”和“请求逻辑写对了”是两回事。
桌面环境里理所当然的东西,到了路由器上可能就得准备多套 fallback。

体会

这个项目最开始看起来像是一个“小插件”,但真正做起来,问题远比“写登录脚本”复杂。

  • 路由器环境比本地开发环境更脆弱
  • 网络状态本身就不稳定
  • 前端配置和后台行为必须一致
  • 自动化构建要考虑依赖、缓存和目录注入
  • 很多 bug 都不是“写错了”,而是你自己定了一个错误预设

换句话说,这个项目让我更明显地意识到:
能跑只是第一步,稳定、可配、可构建、可维护,才是一个插件真正麻烦的地方。

这篇记录主要是想把这个项目做下来的过程留个痕迹。对我来说,这种开发过程本身就挺值得记下来。

最后修改:2026 年 03 月 07 日
如果觉得我的文章对你有用,请随意赞赏