杭州电子科技大学图书馆预约与自动签到工具。项目使用 Bun + TypeScript + React 构建 Web 工作台,并提供 Tauri v2 Windows 桌面端。
桌面端和容器端都由同一个本地后台服务负责预约、签到、审计和会话保持。登录凭据只提交给本机服务,不会上传到第三方服务器。
- 登录杭电数字杭电账户,保存本地会话 Cookie
- 创建、启用和管理图书馆预约方案
- 按预约时间自动提交预约,并复核预约结果
- 每天 20:00 程序内卡点抢座:被拒不间断重试(请求间隔 1.1s 防风控),幂等去重不会重复预约
- 在签到窗口自动签到,支持手动签到和结果复核
- 审计日志记录预约、签到及后台错误
- Windows 系统通知:预约完成、签到结果和后台错误
- Windows 开机自启:MSI 安装阶段写入当前用户启动项,UI 不再提供开关
- Tauri 自动更新:从 GitHub Releases 检查并安装签名更新
- SQLite 本地持久化,容器部署使用命名卷保存数据
Windows x64 MSI 安装包:
启动后,在登录页输入学号和数字杭电密码。进入工作台后创建预约方案,选择房间类型、校区、楼层、日期、时间段和座位规则,再启用方案即可。
Windows 桌面端安装完成后即默认开机自启(由 MSI 写入,UI 不提供开关)。关闭窗口只会隐藏到系统托盘;从托盘选择退出时,后台服务会一并停止。
预约和签到结果会显示在工作台中。Windows 桌面端还会发送系统通知,浏览器开发模式不会调用系统通知 API。
推荐环境:
- Bun 1.2+
- Windows 桌面端开发需要 Rust、Cargo 和 Visual Studio Build Tools(MSVC)
- 容器部署需要 Docker Compose 或 Podman Compose
安装依赖并启动 Vite 开发服务器:
bun install
bun run dev浏览器开发模式需要同时启动后台服务:
bun run server:dev后台默认监听 http://localhost:8000。生产模式构建并启动:
bun run build
bun run server常用检查命令:
bun run typecheck
bun run test
bun run build学号、数字杭电密码和会话 Cookie 由登录页保存在本地 SQLite 数据库中,首次使用时在登录页登录即可;Cookie 失效时会使用已保存的凭据自动重新登录。退出登录只清除会话,不会清除已保存凭据。
如需自定义部署参数,复制 .env.example 为本地未跟踪的 .env.local,按需填写:
HDU_SNIPER_HOME=/path/to/hdu-library-sniper
HDU_WEB_PORT=8000凭据和 SQLite 数据库会明文保存在数据目录中,请确保设备、容器数据卷和数据卷权限仅限当前用户访问。不要提交 .env.local、密码、Cookie 或 SQLite 数据库。
准备配置文件:
cp .env.example .env.local确认 .env.local 中的部署参数后构建并启动:
docker compose up -d --build访问 http://localhost:8000。查看日志和停止服务:
docker compose logs -f hdu-sniper
docker compose down数据保存在 Docker 命名卷 hdu-sniper-data 中,包含 SQLite 数据库、Cookie 和预约审计记录。删除容器不会删除该卷;如需清空数据,确认后再执行:
docker compose down -v项目提供了 Podman 脚本:
cp .env.example .env.local
bun run podman:build
bun run podman:up默认情况下 podman:up 还会安装宿主机 systemd 开机自启服务 hdu-library-sniper.service,开机时自动拉起容器(预约由容器内常驻服务在 20:00 程序内触发,与桌面端一致)。如不需要开机自启:
HDU_SKIP_SYSTEMD_AUTOSTART=1 bun run podman:up脚本是按 rootful Podman 设计的;rootless Podman 需要自行配置 enable-linger 与用户级 unit。也可以用 bun run autostart:install / autostart:uninstall 单独管理。
bun run podman:down如需让宿主机自动跟踪 GitHub 仓库 origin/main 并更新容器,可安装 systemd 定时器:
sudo bun run podman:auto-update:install安装后,宿主机每天凌晨 03:15(Asia/Shanghai)检查一次更新,并随机延迟最多 15 分钟,避免固定时间集中执行。检查服务会:
- 从
origin/main拉取最新代码; - 在临时 Git worktree 中构建候选镜像;
- 使用临时数据卷启动候选容器并检查
/api/health; - 健康检查通过后替换生产容器;
- 替换失败时恢复旧容器。
生产数据继续保存在 hdu-sniper-data 命名卷中,不会因更新删除。自动更新配置位于:
/etc/default/hdu-library-sniper-auto-update
默认配置跟踪当前仓库的 origin/main,也可以编辑该文件修改 HDU_SNIPER_REMOTE、HDU_SNIPER_BRANCH、镜像名或端口。建议将仓库 remote 指向可信地址,并通过受保护的主分支发布更新。
查看状态或手动执行一次检查:
sudo bun run podman:auto-update:status
sudo bun run podman:auto-update卸载自动更新(不会删除应用容器或数据):
sudo bun run podman:auto-update:uninstall容器 WebUI 是单租户管理界面,不建议直接暴露到公网。请放在可信内网或已认证的反向代理之后。
直接下载上方 MSI,双击安装即可(安装位置为 Program Files,首次安装可能需要管理员确认)。如果电脑上已经安装了旧的 MSI 版本,新版本会自动覆盖;如果旧版本来自更早的 Setup(.exe)/NSIS/Inno 安装包,MSI 安装时也会先将其卸载,避免新旧两套程序同时存在导致点开仍是旧版本。
开机自启由 MSI 在安装阶段写入当前用户的启动项(HKCU\Software\Microsoft\Windows\CurrentVersion\Run),以 --background 参数在登录时启动后台预约、签到和托盘服务;UI 不提供开关。升级/重装会重写该启动项(保证指向最新安装路径),卸载时自动清除。查看或手动删除:
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "HDU-Library-Sniper"
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "HDU-Library-Sniper" /f关闭主窗口不会停止任务;请从托盘菜单退出应用后再卸载。
自动签到要求应用全天常驻(默认开机自启,关闭窗口只是隐藏到系统托盘),因此抢座调度直接由常驻的后台服务在程序内完成:每天 20:00(Asia/Shanghai)发起抢座 burst,抢的是次日(自习室)或后两日(其他房型)的座位。仅锚定整点触发,不做事后补偿。
抢座是幂等的:已存在同一开始时段的预约会自动跳过;请求被馆方拒绝(如整点瞬间窗口尚未切换)会按 1.1s 间隔持续重试,直到成功或超时。容器部署与桌面端一致,由容器内常驻服务的程序内锚点触发;宿主机 systemd 只负责开机自启拉起容器。
在 Windows 上安装 Rust/Cargo 和 Visual Studio Build Tools(勾选 Desktop development with C++),然后执行:
bun install
bun run build:server
bun run tauri build --bundles msi生成的 MSI 位于:
src-tauri/target/release/bundle/msi/
项目只发布 MSI,不发布 NSIS 安装包。MSI 使用 WiX hook 在安装时先清理旧版安装、再覆盖新文件,避免新旧版本并存导致点开仍是旧版本。
自动更新读取:
https://github.com/AlaIchhe/HDU-Library-Sniper/releases/latest/download/latest.json
发布前只需在 GitHub Actions Secrets 配置:
TAURI_SIGNING_PRIVATE_KEY:完整的 Tauri updater 私钥TAURI_SIGNING_PRIVATE_KEY_PASSWORD:私钥密码
公钥是非敏感信息,已写入 src-tauri/tauri.conf.json。私钥只应保存在 GitHub Actions Secret,不能提交到仓库。
正式发布版本时推送 v* 标签:
git tag -a v2.0.9 -m "Release v2.0.9"
git push origin v2.0.9.github/workflows/release.yml 会在 Windows runner 上完成依赖安装、Bun 后端编译、MSI 打包、签名并生成 latest.json。工作流会直接发布正式 Release,上传 MSI 后客户端即可通过 releases/latest 获取自动更新,无需再手动发布。
src/server/ Bun 后台服务、预约/签到调度和 API
src/web/ React WebUI、通知和自动更新封装
src-tauri/ Tauri v2 桌面端、托盘、Windows 自启命令
src-tauri/wix-fragments/ MSI WiX 安装/卸载 hook
scripts/ Podman 和 systemd 定时器脚本
tests/ 前端和服务测试
本项目仅用于学习和个人效率工具开发。请遵守学校图书馆服务条款和相关法律法规,合理设置预约方案,不要频繁请求或影响他人正常使用。使用本项目产生的账号、预约和签到结果由使用者自行负责。
详见 LICENSE。