XDU 体育馆自动抢票助手 | Automated Ticket Grabber for Xidian University
一个为西安电子科技大学学生开发的自动抢票工具,支持定时抢票、自动登录、微信通知和在线验证码平台。
关键特性: 自动登录 | 定时抢票 | 微信通知 | 验证码处理 | Node.js | 轻量服务器部署
Keywords: 抢票, 预约, 自动化, 体育馆, 西电, XDU, ticket grabbing, appointment, automation
众所周知,西电人的体育热情非常高,体育场馆席位常常在中午 12:00 放票的一瞬间就被一抢而空。即使你相信自己的手速,也无法保证每天都能记得抢票。本项目旨在自动化抢票流程,让你无需蹲点抢票,你只需要在收到微信里抢票成功通知后于 30 分钟内进入体育场馆预约系统完成支付即可。
本项目能维持校园账户登录,对于验证码的问题,项目会维持一个在线的验证码输入平台,如果登录信息过期,会通过微信提示你前往该平台输入验证码完成登录。
- ✅ 自动登录校园统一认证系统
- ✅ 定时抢票,无需人工蹲点
- ✅ 微信通知抢票结果
- ✅ 在线验证码输入平台,方便手动处理验证码
- ✅ 支持多种体育场馆类型
- ✅ 可配置的抢票时间和参数
本例在 fly.io 上部署我们的应用。fly.io 是一个云服务器提供商,提供免费额度,像我们这种轻量级的项目可以免费部署。本例使用 Server 酱来发送微信通知,一天有 5 次的免费额度,对于我们的项目也完全够用。
你也可以使用其他的云服务器和通知方式。前者不需要修改项目主体,但如果使用其他的通知方式,/src/utils/wechat-notifier.js 模块需要重写。
我们将通用配置放在 config.json 中,而将对安全性有要求,或是可能需要修改的配置放在环境变量中。
在项目根目录下创建名为 config.json 的文件,内容如下,其中 location 项待定,之后应输入你在下一步部署的云服务器地址(如 https://your-app-name-123.fly.dev):
{
"ticket": {
"dateadd": 2,
"TimePeriod": 2,
"VenueNo": "01",
"FieldTypeNo": "006",
"targetTime": "12:00",
"stopTime": "13:00",
"stopTimeDateAdd": 0,
"retryInterval": 2000
},
"notification": {
"SendKey": null,
"title": "抢票系统通知",
"enable": false
},
"server": {
"location": ""
}
}在 fly.io 中,当你完成部署后,将以上变量输入到项目 Dashboard 的 Secrets 中即可,也可以使用命令行,如
fly secrets set NOTIFICATION_ENABLE=true
fly secrets set SEND_KEY=your_send_key_here
fly secrets set IDS_USERNAME=your_username
fly secrets set IDS_PASSWORD=your_password注意所有的环境变量都不需要加引号。
必须设置的环境变量:
NOTIFICATION_ENABLE:建议设置为true,用于 Server 酱发送微信通知SEND_KEY:Server 酱的凭证IDS_USERNAME:统一认证账号IDS_PASSWORD:统一认证密码
可选择设置的环境变量,如不设置为默认值:
STOP_TIME:停止抢票时间,默认为13:00FIELD_TYPE_NO:场馆类型,默认为006,场馆对应编号如下
| 场馆 | 编号 |
|---|---|
| 羽毛球(远望谷) | 001 |
| 乒乓球(远望谷) | 002 |
| 篮球(远望谷) | 003 |
| 健身房(远望谷) | 006 |
| 北校区羽毛球 | 007 |
| 北校区乒乓球 | 008 |
| 北校区篮球 | 009 |
备注:场地类型信息可能会更新,可以在浏览器中进入体育馆系统页面,进入开发者模式,选择 Network 项,打开对应场地,找到开头是 https://tybsouthgym.xidian.edu.cn/Field/GetVenueStateNew? 的请求,其中 FieldTypeNo 后面的值就是场地编号。
考虑到晚上的票比较难抢,而周末白天的票比较容易抢到这一情况,目前仅支持提前两天抢晚上的票,如有需求,可联系作者增加功能。
- 注册 fly.io 账号
- 安装 flyctl 命令行工具:
# macOS/Linux curl -L https://fly.io/install.sh | sh # Windows (使用 PowerShell) iwr https://fly.io/install.ps1 -useb | iex
- 登录 fly.io:
fly auth login
-
在项目根目录下创建
fly.toml文件,内容如下,其中app项是你自定义的应用名称,建议加入一些随机字符,避免重名的同时增加安全性:app = '' primary_region = 'iad' [build] dockerfile = 'Dockerfile' [env] NODE_ENV = 'production' [http_service] internal_port = 8080 force_https = true auto_stop_machines = 'off' auto_start_machines = false min_machines_running = 1 # 更宽松的健康检查 [[http_service.checks]] interval = '30s' timeout = '5s' grace_period = '60s' method = 'GET' path = '/health' [[vm]] memory = '1gb' cpu_kind = 'shared' cpus = 1
-
部署应用:
fly launch
按照提示完成部署,选择免费计划。
-
在 Dashboard 中查看你的应用地址,或使用命令行:
fly status
更新
config.json和环境变量(见配置)。 -
启动服务,并将实例数量设置为 1:
fly deploy fly scale count 1
- 访问 Server 酱官网
- 根据提示完成微信登录、关注服务号和测试等操作
- 将你的
SendKey(开头是SCT)写入环境变量
当登录信息过期时,系统会通过微信发送通知,提示你前往验证码输入平台。点击通知中的链接或直接访问你的应用地址,根据提示完成验证码输入即可。应用当前设置了在抢票前半小时检查登录状态,不过还是建议在部署完应用时就前往验证码平台完成首次登录。
通知提醒抢到票后,在体育馆系统中,打开“我的-场地订单”,支付或取消订单,注意 30 分钟的订单有效时间。
查看日志:
fly logs应用运行时会有心跳指示。
重启应用:
fly apps restart修改代码后重新部署:
fly deploy- 登录时需要等待响应,请耐心等待 3 秒左右
- 登录偶尔不稳定,重新尝试即可
- 任何时候都可以重新登录