大麦自动抢票教程:三步跑通环境、配置与开售
开售瞬间,票档按钮可能一秒钟内就变灰——打开页面、选票档、选场次、填观演人这一串动作,手动做往往来不及。ticket-purchase 是一个大麦自动抢票工具:两套脚本分别驱动 Chrome 和 Android 真机,自动完成选城市、选场次、选票档、填观演人、提交订单,你只需把演出信息写进配置文件。适合愿意自己搭环境、想抢热门场次的人。
先判断它适不适合你
跑之前先对一遍前提,缺哪端就只做哪端:
- 两端共用:Python 3.9+;Web 端另需最新版 Chrome;
- 移动端另需:Node.js 20.19.0+(22.12.0+ / 24.0.0+ 亦可)、Appium 3.1.0+ 并装好 uiautomator2 驱动、一台开了 USB 调试的 Android 真机或已启动的模拟器(大麦 APP 装好并登录)、ANDROID_HOME 配好且
adb devices能看到设备; - 系统上 macOS、Windows、Linux 均可,但仓库里的 shell 脚本是 bash 写的,Windows 下照着脚本里的等价命令手动执行即可。
三个第三方工具先说清楚:Selenium 是「用代码操控浏览器」的库,负责开页面和点按钮;Appium 是个「远程替你操作手机」的服务,脚本连上它,由它在手机上执行点击;uiautomator2 是 Appium 操作 Android 界面所需的驱动。
什么情况建议换方案:目标演出在大麦 Web 端能正常购买,就别折腾移动端,走 Web 端更省事;演出是「选座购买」类型时,Web 脚本到选座环节会停下来等你手点座位,做不到全自动。确认完这些,进入最短上手路径。
最短上手路径
以下按移动端(功能最全的一路)串成一条时间线,只走 Web 端的话,第 3~5 步可以整体跳过。
1. 拿代码并装 Python 依赖
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase
cd ticket-purchase
pip install -r requirements.txt
也可以 poetry install。做完后应看到安装完成、无报错。
2. 装 Node 与 Appium(仅移动端)
npm install -g appium
appium driver install uiautomator2
做完后 node --version 应显示 20.19.0 以上,appium --version 显示 3.1.0 以上。
3. 跑一次环境自检
./check_environment.sh
做完后应看到 Python、Node、Appium、ADB、设备、大麦 APP、配置文件逐项打勾。注意:check_environment.sh、start_appium.sh、start_ticket_grabbing.sh 里写死了作者的 macOS SDK 路径(/Users/... 开头),换机器先把这几处改成你自己的 SDK 路径,否则会误报失败。
4. 启动 Appium 服务(一个终端)
./start_appium.sh
启动前,手机里的大麦 APP 打开、目标演出搜好、页面停在详情页——脚本从详情页开始点,不会替你搜索。做完后应看到「服务器地址: http://127.0.0.1:4723」,这个终端保持运行。
5. 首跑(另一个终端)
./start_ticket_grabbing.sh
做完后应看到它先核对 Appium 状态与 config.jsonc,回显当前的 keyword / city / users,再问一句「确认开始抢票?(y/N)」,按 y 进场,控制台依次打印:选择城市 → 点击预约按钮 → 选择票价 → 选择数量 → 确定购买 → 选择用户 → 提交订单。脚本结尾的 python 路径也是作者 venv 的写死路径,可改成你自己的解释器,或直接 cd damai_appium && python damai_app_v2.py。跑通首跑后,下一步是把演出信息写进配置文件。
只需改动的地方:配置文件
换一场演出,代码一行不动,只改配置。两端的脚本瞄准的是同一个页面:大麦演出详情页,城市、场次、票档都是页面上的按钮。
移动端配置字段逐项说明(config.jsonc)
配置文件在 damai_appium/config.jsonc,共 8 个字段。首跑务必把 if_commit_order 留在 false——脚本选中票档后先停在订单确认页,人工核对无误再翻成 true:
{
"server_url": "http://127.0.0.1:4723",
"keyword": "周深",
"users": ["姓名1", "姓名2"],
"city": "深圳",
"date": "12.06",
"price": "内场1199元",
"price_index": 5,
"if_commit_order": false
}
| 字段 | 作用 | 怎么填 | 填错会怎样 |
|---|---|---|---|
server_url | Appium 服务地址 | 保持默认,4723 被占用才改 | 与服务端口对不上,连接被拒 |
keyword | 搜索词 | 歌手名或演出全名 | 搜到别的演出,整条流程跑偏 |
users | 观演人名单 | 与账号实名信息逐字一致,可填多人 | 差一个字就「超时未找到用户」,人数选不够 |
city | 演出城市 | 按页面文案写,如「深圳」,走模糊匹配 | 页面没有该城市按钮,第一步就失败 |
date | 目标场次日期 | 如 12.06 | 误中相邻场次 |
price | 目标票档 | 数字或完整票档文案均可 | v2 实际按 price_index 点击,此字段供人工核对,填错不会改变实际选择 |
price_index | 票档序号 | 从 0 开始,按页面票档排列顺序数 | 差一位就买到别的价位 |
if_commit_order | 是否自动提交订单 | ⚠️ 首跑 false,稳定后 true | true 时选中票档后直接提交,订单即真实订单,不可撤回 |
两点提醒:票档的实际点击由 price_index 定位(大麦 APP 改版后票档按钮文本可能为空,所以脚本按位置取),填配置时以页面顺序数一遍序号;date 是「月.日」格式,和 Web 端的完整日期不同,别混。
Web 端配置(config.json)
Web 端配置在 damai/config.json,比移动端多一个 target_url:先手动登录大麦、打开目标演出详情页,把地址栏完整 URL 粘进去。
{
"index_url": "https://www.damai.cn/",
"login_url": "https://passport.damai.cn/login",
"target_url": "目标演出详情页的完整URL",
"users": ["姓名1", "姓名2"],
"city": "杭州",
"dates": ["2026-04-11"],
"prices": ["680"],
"if_listen": true,
"if_commit_order": false,
"max_retries": 1000
}
必填的是 index_url、login_url、target_url、users 四个字段,缺一个脚本直接退出。其余几项:dates / prices 是数组,日期格式为 YYYY-MM-DD,可各填多个值;if_listen 控制缺货时是否点「缺货登记」;max_retries 是失败重试上限,默认 1000。首跑同样是 if_commit_order 保持 false。Web 端首次运行会弹窗让你扫码登录并把 cookie 存成 damai_cookies.pkl,之后复用免登。更多细节可看仓库里的完整使用指南(PC端).md.md)。配置改完,下一步是选定走哪一端。
Web 端和移动端怎么选
Web 端配置大致长这样,改的仍是同一个演出信息集合:
| 对比项 | Web 端(damai/) | 移动端(damai_appium/) |
|---|---|---|
| 驱动方式 | Selenium 驱动 Chrome | Appium + uiautomator2 驱动真机/模拟器 |
| 入口 | damai/damai.py | damai_appium/damai_app_v2.py |
| 配置文件 | damai/config.json,多 target_url | damai_appium/config.jsonc,多 price_index |
| 额外环境 | Chrome | Node + Appium + 设备 + 大麦 APP |
| 适合场景 | 演出在 Web 端可正常购买、电脑网络稳 | 演出只能在 APP 端买,或手机端信号更好 |
两端的公共设计一致:城市、日期、票档走模糊匹配,页面文案变一两个字流程不垮;内置循环重试,偶发失败自动重来;执行路径都是「登录/状态检查 → 选票档 → 选观演人 → 提交订单」。结论很简单:哪边网络条件好、环境更稳就用哪边,两套代码互不依赖,可以并行准备,先跑通哪端就先上哪端。选好端之后,重点看下面几个高频故障点。
最容易翻车的 5 个地方
- 现象:启动 Appium 报
Node version must be at least ^20.19.0 || ^22.12.0 || >=24.0.0→ 原因:Node 版本过旧 → 处理:升级 Node 到 20.19.0+,再跑./check_environment.sh复核。 - 现象:脚本报
Connection refused或「Appium服务器未运行」→ 原因:服务没起,或server_url与实际端口对不上 → 处理:重跑./start_appium.sh,用curl http://127.0.0.1:4723/status验证服务是否活着。 - 现象:
adb devices看不到设备 → 原因:USB 调试未开,或模拟器没启动完 → 处理:真机开调试重新插拔;模拟器等完全进系统再跑。 - 现象:报
Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported→ 原因:SDK 环境变量没配,或脚本里还是作者的写死路径 → 处理:export两个变量指向你的 SDK 目录,同时改脚本内路径。 - 现象:控制台打印「超时未找到用户」,或票档点错 → 原因:姓名与页面文案不一致,或
price_index与页面顺序对不上 → 处理:姓名逐字核对;按页面顺序从 0 重新数票档序号。移动端若import appium报错,说明 appium Python 包没装,执行pip install Appium-Python-Client。故障点清完,开跑前再做一轮检查。
三类演出,配置侧重点不同
- 演唱会:
users列全部常用观演人,price锁主档位、price_index做双保险; - 话剧 / 音乐剧:场次多、页面加载慢,
date对准目标那一场,票档文案不清时以price_index为准; - 体育赛事:同城多场,
city必填,页面变动大的场次prices只填数字。
开跑前的最后 3 项检查
- 试跑模式:两端
if_commit_order都保持 false,在非开售状态下把完整流程走一遍——脚本应依次命中城市、场次、票档、观演人,并停在订单确认页等你手动确认; - 页面就位:移动端确认大麦 APP 停在目标演出详情页,Web 端确认
target_url能打开且已登录; - 🚨 放开自动化:只有试跑稳定、每一环节都核对无误后,才把
if_commit_order翻成 true;开售瞬间保持两个终端稳定,别做其他操作。
以上三项全过,这套流程才算真正就绪。自动提交产生的是真实订单,请务必先以手动确认模式验证;选座购买类演出、以及依赖页面元素的自动化逻辑,在大麦页面改版后都可能需要重新核对。本工具仅供个人学习研究使用,请合理使用并遵守大麦平台规则。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






