大麦自动抢票怎么跑:3 个 Shell 脚本跑通移动端购票(附配置参数与排障表)
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
ticket-purchase 用 Python 做双端抢票:Web 端靠 Selenium 驱动 Chrome 浏览器,移动端靠 Appium(一种在电脑上驱动手机 App 的框架)驱动安卓大麦 App,从选票档到提交订单全自动。三个 Shell 脚本串起自检、启动、执行的全流程,这篇帮你把环境、配置、排障一次理顺。
先做决定:两条路线怎么选
仓库里有两套互相独立的实现,按设备条件二选一即可:
- Web 端:damai/damai.py 基于 Selenium(一个控制浏览器的 Python 库)操作网页。
- 移动端:damai_appium/damai_app_v2.py 基于 Appium 操作安卓客户端,作者文档里注明大麦的大部分票只能在 App 端购买,因此移动端是被主推的路线。
| 对比维度 | Web 端 | 移动端 |
|---|---|---|
| 环境成本 | 只需 Chrome,ChromeDriver 自动下载 | Node.js + Appium + Android SDK + 真机或模拟器 |
| 上手时间 | 改完配置直接跑 | 还要把设备、详情页全部就位 |
| 覆盖场景 | 网页端可见的购票功能 | App 端票源,覆盖更广 |
| 已知限制 | 无额外说明 | 预约类演出未实现;price_index必须预先手动数好 |
🔍 环境自检脚本:check_environment.sh 与从零到就绪
第一步永远是先跑仓库自带的体检,别手动装环境:
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase ./check_environment.shcheck_environment.sh 会逐项核对:Python、Node.js(并检查版本是否够新)、Appium、Android SDK、ADB、已连接的设备、大麦 App 是否安装、4723 端口的 Appium 服务、config.jsonc是否存在。缺什么直接打印安装命令,按提示补齐即可。
缺依赖时按顺序装:
pip install -r damai/requirements.txt # Python 依赖(selenium==4.18.1) npm install -g appium # 全局安装 Appium 服务 appium driver install uiautomator2 # 安卓 UI 自动化驱动版本红线:Python 3.9+;Node.js 需 20.19.0+ / 22.12.0+ / 24.0.0+(低于这个范围 Appium 会直接报错,见后文排障表);Appium 3.1.0+。
一个容易踩的坑:仓库脚本里硬编码了作者本机的路径。start_appium.sh、start_ticket_grabbing.sh 和 check_environment.sh 中写死了/Users/shengwang/Library/Android/sdk,start_ticket_grabbing.sh 末尾还写死了一个 pypoetry 虚拟环境的 Python 路径。首次使用要全部改成你机器上的实际路径,否则脚本会在环境设置和解释器调用两处失败。
配置参数速查:移动端 config.jsonc 与反直觉字段
移动端的全部参数集中在 damai_appium/config.jsonc:
| 字段 | 示例值 | 作用与坑点 |
|---|---|---|
server_url | http://127.0.0.1:4723 | Appium 服务地址,默认本机 4723 端口 |
keyword | 演出关键词 | App 内搜索用;v2 版假设你已站在详情页,此值主要供核对 |
users | ["观演人A", "观演人B"] | 观演人姓名,脚本按文本精确匹配勾选,须与账号内信息一字不差 |
city | 城市名 | 必须与详情页显示逐字一致,见下文 |
date | 12.06 | 演出日期,月.日格式 |
price | 票档描述 | 仅人类核对用,脚本不读它定位 |
price_index | 3 | 票档在列表中的位置,从 0 数起,须手动数好 |
if_commit_order | true | 新版主程序中该开关实际不生效(提交步骤无条件执行),旧版 damai_app.py 才读取它 |
两个反直觉项值得单独说:
price_index为什么要手动数?新版 App 界面上票档按钮的文本是空字符串,文字定位失效,脚本改成了"在票档容器里取第 N 个可点击元素"(app.md 原话:缺点是需要预先手动写进去)。所以你得打开详情页,从 0 开始数到目标票档,把数填进配置。city为什么必须逐字一致?脚本第一动作就是用UiSelector().text("城市名")精确匹配点击,全半角、繁简差一个字都点不中。
Web 端配置在 damai/config.json,img/config_json.png 是它的一个真实示例:
| 字段 | 说明 |
|---|---|
index_url/login_url/target_url | 首页、登录页、演出详情页地址(即下图红字处要填的 URL) |
users | 观众姓名列表,必填 |
city/dates/prices | 城市、场次、票面价,均为数组,可多值 |
if_listen/if_commit_order | 监听模式 / 是否提交订单开关 |
max_retries/fast_mode/page_load_delay | 可选;默认分别为 1000 次、True(快速模式)、2 秒 |
🚦 跑一遍:从开售前准备到触发抢票
移动端完整走一遍是三步(顺序不能乱):
- 开售前准备。启动模拟器或连接开启 USB 调试的真机,装好大麦 App 并登录;在大麦 App 里搜索
keyword对应的演出,让页面停在演出详情页——v2 脚本的起点就是"人已经站在详情页上",这一步不能省。脚本和配置此时也要全部就绪。 - 启动服务。
./start_appium.sh:脚本设置 ANDROID_HOME、检查设备与大麦 App,然后在 4723 端口拉起服务。 - 触发抢票。
./start_ticket_grabbing.sh:先验证 4723 服务在线和config.jsonc存在,打印当前配置,等你输入y后才真正开跑。
跑起来后,damai_app_v2.py 内部按固定顺序执行:选城市 → 点预约/购买按钮 → 按索引选票档 → 点加号把数量加到users人数 → 确定购买 → 坐标批量勾选观演人 → 提交订单。任一步失败自动重来,默认最多 3 次、间隔 2 秒,每次重试会重建驱动;整轮结束打印本次流程耗时。
附注:Web 端流程短得多——填好
damai/config.json后cd damai && python damai.py,浏览器自动打开并进入target_url,完成流程后页面会停留 5 分钟。
调优:监听模式、重试次数与多设备
- Web 端监听模式:
if_listen设为true后,脚本在等待阶段(比如"缺货登记"按钮)持续守候,适合开售前后蹲守回流票。想更快轮询就调小page_load_delay(默认 2 秒),网络一般再适当调低max_retries(默认 1000)。 - 移动端没有监听模式:重试次数写死在 damai_app_v2.py 入口的
run_with_retry(max_retries=3),想多试几轮直接改这一行。 - 多设备并行:仓库没有多设备调度,且 capabilities 里
deviceName固定为emulator-5554。要并行得改好 capabilities 分别起多个实例,属于自行改造,不在项目文档覆盖范围内。
高频报错排查:现象、原因、解法速查表
| 现象(报错原文) | 原因 | 解法 |
|---|---|---|
Error: Node version must be at least ^20.19.0 \|\| ^22.12.0 \|\| >=24.0.0 | Node.js 版本低于 Appium 要求 | 升级 Node(macOS 可brew upgrade node),再node --version确认 |
Error: Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported | 环境里没有安卓 SDK 变量 | export ANDROID_HOME=/你的sdk路径,并同步ANDROID_SDK_ROOT |
Error: Unable to find an active device or emulator | 模拟器没开、真机未授权或 USB 调试未开 | adb devices确认列表中有device状态;真机重新插拔并点授权 |
Error: Connection refused | Appium 服务没起或端口被占 | 先./start_appium.sh,再curl http://127.0.0.1:4723/status验证 |
| 日志停在"城市选择失败"或票价报错 | city与页面文字不一致,或price_index数错(从 0 起数) | 对照详情页逐字核对city,重新数一遍票档位置 |
边界与建议:使用限制与开售前演练
先认清边界,再谈合规:
- 预约类演出覆盖不了。app.md 写明"只处理了抢票的,预约的暂未考虑",预约票没有现成路径。
- 无多设备调度,
deviceName写死emulator-5554,并行需要自行改造。 - 脚本对网络和设备状态不做兜底,网络不稳或设备卡顿只能靠重试机制兜住一部分失败。
- 仓库声明仅供学习和研究使用,请勿用于商业用途,使用时请遵守大麦网的使用条款。
开售前按这份清单过一遍,开售时基本只剩按y:
./check_environment.sh无 ❌ 项- 模拟器或真机就位,大麦已登录
- App 停在目标演出详情页
city、date、users与页面逐字一致,price_index刚数过curl http://127.0.0.1:4723/status有响应
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考