campus-imaotai 实战教程:如何用 Docker 快速搭建 i茅台自动预约系统
【免费下载链接】campus-imaotaii茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法)项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai
早上 8 点 55 分,服务器上的 i茅台自动预约工具 Campus-imaotai 已经刷新完当天的预约商品与门店数据;9 点整,它开始按每个账号设定的分钟批量发起预约请求;当晚 18:05,申购结果被自动查出并推送。这就是这套系统一天的完整工作节奏。作者本人在 README 里坦承"本项目不提供成品,使用的是已淘汰的算法",这反而让它更适合作为一份能跑通、能读透的"后台管理 + 定时任务 + 容器化部署"工程范例,比一个黑盒脚本更有参考价值。
项目定位:把每日茅台预约变成后台流程
Campus-imaotai 是一个基于 Java Spring Boot 的 i茅台预约辅助系统,面向想在服务器端托管多个 i茅台账号预约动作的个人用户。它拆成四个模块:campus-common(公共组件)、campus-framework(框架与安全)、campus-admin(管理后台接口)、campus-modular(i茅台业务逻辑),前端是一套 Vue 管理界面,整体用 Docker 一键拉起。
| 日常麻烦 | 手动操作的方式 | 本项目给出的做法 |
|---|---|---|
| 每天卡点操作 | 定闹钟、守在 App 前 | Spring@Scheduled定时任务批量执行 |
| 多账号重复登录 | 逐个切换、逐个点击 | 后台统一维护 token,9 点分批预约 |
| 不知选哪家门店 | 凭感觉挑 | shop_type字段切换"出货量最大 / 附近门店"两种策略 |
| 晚上等开奖 | 手动刷新 App | 18:05 自动查询结果并通过 PushPlus 推送 |
工作原理:8:55 到 9 点之间发生了什么
所有时间规则集中在 CampusIMTTask.java 这一个类里,用 cron 表达式驱动,共四个关键节点:
- 数据刷新(7:10、7:55、8:10、8:55):拉取最新版本号、预约商品(i_item)和门店列表(i_shop)。效果是 9 点预约时用的都是当天最新的商品编码与门店数据,而不是缓存里的旧数据。
- 随机分钟改写(1:10):批量重算每个用户的预约分钟。效果是各账号请求错开,避免同一秒集中打向接口。
- 批量预约(9:00–9:59 每分钟一次):按
minute字段把账号分到对应分钟执行,@Async异步跑批。效果是一个小时内把当天所有账号的预约全部提交完毕。 - 结果查询与推送(18:05):查询当天申购结果并写入 i_log、通过 PushPlus 发通知。效果是当天 18:05 之后就能确认中没中,不用守着 App。
管理侧的用户配置长这样,左侧菜单还能看到预约项目、门店列表等入口:
部署上手:Docker 一键启动命令
部署前确认环境满足:
- 已安装 Docker 与 Docker Compose
- 宿主机 3306(MySQL)、6379(Redis)、8160(后台服务)端口未被占用,因为 compose 里所有服务都用了 host 网络模式
- 宿主机时钟准确,定时任务依赖系统时间
- 能访问外网拉取镜像
启动流程只有三步,配置细节见 docker-compose.yml:
# 克隆项目代码 git clone https://gitcode.com/GitHub_Trending/ca/campus-imaotai cd campus-imaotai/doc/docker # 一键启动 MySQL 5.7、Redis 6.2、Nginx 1.23 与 campus-server 四个服务 docker-compose up -d# 导入初始化脚本,创建 i_user、i_shop、i_item、i_log 等表 docker exec -i mysql mysql -uroot -p123456789 campus_imaotai < ../sql/campus_imaotai-1.0.5.sql完成后在浏览器打开http://服务器IP:8160即可进入管理后台(端口来自 compose 中的SERVER_PORT: 8160)。
关键配置:预约分钟与门店策略参数
账号级配置主要落在 i_user 表上,字段含义可直接参考 campus_imaotai-1.0.5.sql 的注释:
| 配置项 | 默认值 | 推荐值 | 适用场景 |
|---|---|---|---|
minute预约分钟 | 5 | 5–30 内按账号错开 | 指定 9 点档内的具体分钟 |
random_minute随机分钟 | 0(随机模式) | 保持默认 | 避免账号全挤在 9:00:00 |
shop_type门店策略 | 1(本市出货量最大门店) | 1 | 不关心门店位置、只想要大概率有货的门店 |
lat/lng经纬度 | 空 | 用策略 2 时必填 | 想固定约离自己近的门店自提 |
push_plus_token | 空 | 申请后填入 | 接收申购结果推送 |
SERVER_PORT | 8160 | 8160 | 管理后台访问端口 |
两条场景化建议:
- 自提场景:如果你固定去附近门店提货,把
shop_type改为 2 并填上经纬度,系统才会走"附近门店"逻辑,否则默认按出货量最大门店选择。 - 多账号场景:给每个账号设置不同的
minute,让 9 点档的请求在时间上散开,减少同一时刻的并发压力。
门店列表页可以按省份、城市、地区筛选,确认你的目标门店是否已被刷新进来:
实战场景:从添加账号到确认结果
场景:为两个不同城市的账号配置错峰预约
- 背景:你持有 A、B 两个 i茅台账号,希望都参与当天预约,但又不想两个账号在同一分钟发起请求。
- 操作:在"用户管理"点"添加账号",输入手机号后由系统发送验证码,填回验证码并点"登录",后台即完成登录态(token、cookie、设备 id)的采集入库;随后把 A 的
minute设为 5、B 设为 25,shop_type按各自城市情况选择。 - 结果:9 点档 A、B 分属不同分钟批次执行;18:05 系统查询结果后,操作日志页会出现"i茅台预约 / 预约成功"这类带状态标记的记录,同时 PushPlus 把结果推到你的手机。
避坑与常见问题:排查命令清单
- 现象:后台页面打不开,8160 端口无响应
- 排查:
docker ps -a看 campus-imaotai 是否 running;docker logs campus-imaotai查启动报错(常见为端口冲突或/docker/server/conf下缺少 application-prod.yml) - 解决:释放宿主机 8160 端口,按 compose 注释把生产配置文件放到挂载目录后重启容器
- 排查:
- 现象:9 点过后日志里没有预约动作,或门店列表为空
- 排查:
docker logs campus-imaotai | grep 刷新数据看 8:55 的刷新任务是否执行、是否报错 - 解决:刷新失败通常是网络或服务端接口变更所致;先用浏览器确认 8:55 前后日志有"开始刷新版本号"输出,再查账号 token 是否过期(i_user 表有
expire_time字段)
- 排查:
- 现象:任务没有在预期时间触发
- 排查:
timedatectl status核对宿主机时间与TZ(compose 已为容器设置Asia/Shanghai,但宿主机时钟错误仍会导致整体偏移) - 解决:校准系统时间后重启容器
- 排查:
写在最后
Campus-imaotai 适合两类人:想系统了解 Spring Boot 定时任务、后台管理后台如何组织的开发者,以及想在自己服务器上跑一遍容器化完整链路的实践者。需要清醒的是:作者声明算法已淘汰、不提供成品,预约成功率不作任何保证;本项目内容定位是学习与研究,账号凭证、手机号等数据由使用者自行保管,使用自动化工具前请确认符合 i茅台平台规则与当地法规,并控制请求频率,避免给账号带来风险。
【免费下载链接】campus-imaotaii茅台app自动预约,每日自动预约,支持docker一键部署(本项目不提供成品,使用的是已淘汰的算法)项目地址: https://gitcode.com/GitHub_Trending/ca/campus-imaotai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考