如何自动化大麦抢票:用配置文件快速跑通双端抢票流程
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
开售按钮变灰的那一瞬间,手动抢票的失败经历大概都一样。ticket-purchase 是一个大麦抢票自动化项目:Web 端用 Selenium,手机端用 Appium,把"选场次票价 → 选观演人 → 提交订单"这段操作自动跑完,你只改一份 JSON 配置。
能力总览:支持什么、不支持什么
先划清边界。该工具只覆盖大麦网内从演出详情页到订单确认页的购票动作,不含支付——订单停在"已提交",付款仍需手动完成。它提供两条独立执行路径:
| Web 端(Selenium) | 移动端(Appium) | |
|---|---|---|
| 运行依赖 | 最新版 Chrome,ChromeDriver 自动下载 | Android 模拟器或真机、Appium 3.1.0+ |
| 程序入口 | damai/damai.py | damai_appium/damai_app_v2.py |
| 配置文件 | damai/config.json(按模板创建) | damai_appium/config.jsonc(仓库自带) |
| 登录方式 | 浏览器扫码登录 | 设备上的大麦 App 保持登录 |
| 适合场景 | 无 Android 环境、便于观察调试 | App 端有票源、点击速度更快 |
上图就是脚本的操作对象:城市、场次、票价、数量都是页面上可点击的元素,脚本按配置逐项匹配后依次点击。
环境搭建与首次跑通
Web 端依赖最轻:Python 3.9+ 和最新版 Chrome 即可,macOS / Windows / Linux 都支持。移动端另外需要 Node.js 20.19.0+(或 22.12.0+/24.0.0+)、Appium 与 UiAutomator2 驱动、可用的 Android SDK。
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase pip install -r damai/requirements.txt # Web 端依赖 ./check_environment.sh # 移动端一键环境检查 ./start_appium.sh # 终端 1:启动 Appium 服务 ./start_ticket_grabbing.sh # 终端 2:开始抢票Web 端则进入damai/目录执行python damai.py(脚本按相对路径读配置,目录别跑错)。注意damai/config.json仓库里没有,脚本启动时会打印模板,你按模板在damai/下放一份并填值。最小可运行版本:
{ "index_url": "https://www.damai.cn/", "login_url": "https://passport.damai.cn/login", "target_url": "https://detail.damai.cn/item.htm?id=XXXX", "users": ["你的姓名"], "city": "广州", "dates": ["2023-10-28"], "prices": ["1039"], "if_listen": true, "if_commit_order": false }四个必填字段是index_url、login_url、target_url、users,缺任何一个脚本会直接退出。if_commit_order首次保持false,让订单停在确认页由你人工核对后再提交。
五个关键配置字段,值从哪里来
其余字段都对应详情页上的具体元素,取值不用查文档,直接看页面:
| 字段 | 作用 | 值从哪里来 |
|---|---|---|
target_url | 目标演出详情页地址,是脚本的起点 | 打开演出详情页后复制地址栏 |
users | 观演人名单,人数即购票张数 | 大麦账号里添加的观演人姓名,需实名一致 |
city | 多城市巡演时筛选场次 | 详情页"城市"一栏点亮的文案,如"广州" |
dates | 场次日期优先级列表,按顺序尝试 | "场次"一栏的日期,如2023-10-28 |
prices | 票价优先级列表,按顺序尝试 | 票价按钮上的数字,如1039 |
标注图与上表一一对应。dates、prices都支持往数组里放多个候选格式,匹配不上就换下一个,这是模糊匹配的由来。Web 端还有两个参数值得知道:max_retries(默认 1000)控制等待预订按钮的轮询上限,fast_mode控制各环节等待时长;if_listen开启后会关注"缺货登记"入口。
一个真实场景走查:移动端深圳站
以下参数全部取自仓库里 damai_appium/config.jsonc 的实际内容,不是编造的例子:
{ "server_url": "http://127.0.0.1:4723", "keyword": "周深", "users": ["王胜", "潘鸿运"], "city": "深圳", "date": "12.06", "price": "内场1199元", "price_index": 5, "if_commit_order": true }准备(开售前 30 分钟):启动 Android 模拟器,装好大麦 App 并登录;运行./start_appium.sh,服务监听 4723 端口;在 App 里搜索"周深"并停留在演出详情页。
执行:运行./start_ticket_grabbing.sh并输入y确认。脚本通过server_url连上模拟器,点击12.06场次,再按price_index(从 0 起)定位到第 6 个档位"内场1199元",随后批量选中两位观演人。核心函数ultra_fast_click不等元素进入可点击状态,直接取坐标用mobile: clickGesture发一次 50ms 点击,单次点击开销因此更低。
结果:预订点击成功即跳到订单确认页,if_commit_order为true时自动提交订单,剩余动作是支付。移动端与 Web 端互不依赖,哪端跑通则用哪端,也可以按各自配置分别试。
调优与踩坑笔记
按"现象 → 原因 → 处理"排了 6 条,前 5 条是实际会报错的场景,第 6 条是参数取舍。
- 现象:脚本秒退并打印一份配置模板。原因:Web 端缺少
damai/config.json或四个必填字段不全。处理:按模板补齐后放入damai/目录,并从该目录内启动脚本。 - 现象:
Node version must be at least ^20.19.0。原因:Appium 3.x 对 Node 版本有硬性要求。处理:升级 Node 到 20.19.0+ 后重跑./start_appium.sh。 - 现象:
Neither ANDROID_HOME nor ANDROID_SDK_ROOT。原因:移动端脚本读取 SDK 路径失败。处理:在 shell 配置文件里补export ANDROID_HOME和export ANDROID_SDK_ROOT两条后重新加载。 - 现象:检测不到设备或 Connection refused。原因:模拟器未启动,或 Appium 没在 4723 监听。处理:先
adb devices确认设备在线,再curl http://127.0.0.1:4723/status确认服务存活,最后才跑抢票脚本。 - 现象:Web 端提示"未找到观演人"。原因:订单确认页没加载完,或姓名与账号不一致。处理:
page_load_delay从 2 提到 3–5 秒,fast_mode临时改false看扫描输出;用户元素本身有 5 次、每次 0.5 秒的自动重试,仍失败就核对姓名是否有尾随空格或后缀。 - 调优:大麦抢票自动化的响应比预期慢。
fast_mode把轮询间隔从 1 秒压到 0.3 秒并缩减各处等待,单轮流程约省 5–8 秒;移动端显式等待默认只有 2 秒,随意加长反而会错过开售时间窗。
源码导读与合规边界
- damai/damai.py:Web 端入口,负责校验配置文件,随后交给
Concert类执行完整流程; - damai/concert.py:Web 端核心逻辑,扫码登录、选场次票价、选观演人、提交订单的 Selenium 步骤都在这里;
- damai_appium/damai_app_v2.py:移动端优化版,含 Appium 连接参数与快速点击、批量点击逻辑。
两端的配置读取分别在同目录的config.py里,都是一个Config类加一次文件解析,阅读成本很低。
合规边界:这个工具仅限本人购票自用,遵守大麦的用户协议,不得用于倒卖或批量代购,也不建议多开实例刷接口。仓库声明项目仅供学习研究、勿作商业用途;首次运行时把if_commit_order留在false,人工核对一次订单再交给脚本,是成本最低的保险。
收尾
该项目的价值不在保证抢中——那取决于网络和票源——而在于把"手动点一遍"改写成"一份配置加持续轮询",双端跑通后,Selenium 与 Appium 的用法也就顺带理解了。入门按 QUICK_START.md 走,参数细节查 README.md,Web 端完整行为另有 完整使用指南(PC端).md.md)。
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考