大麦自动抢票指南:Python Selenium + Appium 双端抢票脚本完整教程
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
ticket-purchase 是一个 Python 大麦自动抢票脚本:Web 端用 Selenium 驱动浏览器,移动端用 Appium 做大麦 APP 自动化,通过一份配置文件锁定艺人、城市、场次和票价。本文按选型、环境、配置、运行、排障的顺序讲清楚它怎么用。
脚本功能清单:工具替你自动做了哪几件事
工具覆盖"定位演出 → 选场次 → 选票价 → 选观演人 → 提交订单"整条链路,每一步都有对应参数可控。
- 登录态复用:Web 端首次扫码后把 Cookie 存入
damai_cookies.pkl,再次运行时自动恢复,不用重复扫码 - 场次锁定:城市、场次日期、票价三个字段与页面一一对应,移动端另用
price_index按序号(从 0 开始)精确定位第 N 个票价卡片 - 观演人自动勾选:
users列表指定姓名,移动端先逐个采集屏幕坐标再连续点击,间隔 10ms - 数量联动:配置 2 名观演人时,脚本自动把数量加号点 1 次
- 订单提交:
if_commit_order为 true 时,选完观演人后自动点击"立即提交" - 重试兜底:移动端单次失败后重建 Appium 会话、隔 2 秒重试,上限 3 次;Web 端
max_retries默认 1000 次
大麦抢票端选型:Web 端与移动端对比表
两端都是完整链路,但前置条件不同:移动端单次动作更快(显式等待被压到 2 秒),Web 端更适合长驻监听开售前状态。
| 维度 | Web 端(damai/) | 移动端(damai_appium/) |
|---|---|---|
| 自动化框架 | Selenium + Chrome | Appium + UiAutomator2 |
| 运行前提 | 最新版 Chrome,ChromeDriver 自动下载 | Android 真机/模拟器 + Appium 服务(默认 4723 端口) |
| 登录方式 | 脚本引导扫码,Cookie 存文件复用 | 设备内提前手动登录,脚本不处理登录 |
| 脚本启动时的状态 | 自行打开target_url | 必须已打开大麦 APP 并停在目标演出详情页 |
| 配置文件 | damai/config.json | damai_appium/config.jsonc(JSONC 格式,支持注释) |
| 适合场景 | 电脑可长时间挂着,开售前持续轮询 | APP 端链路更稳定、或 Web 端被限制时 |
环境准备:版本要求与检查命令
版本要求仓库里写得很明确,没有模糊空间:Python ≥ 3.9;Node.js 为 20.19.0+ / 22.12.0+ / 24.0.0+;Appium ≥ 3.1.0;移动端另需 Android SDK 并导出ANDROID_HOME,Web 端需最新版 Chrome。
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase && poetry install ./check_environment.sh移动端还需执行npm install -g appium和appium driver install uiautomator2。check_environment.sh会依次检查 Python、Node、Appium、ADB、设备连接、大麦 APP 是否安装(包名cn.damai)、4723 端口状态与配置文件,随时可重复执行。
配置字段对照表:每个参数对应页面上哪个位置
所有字段都对应页面上"看得见的文字",建议对着真实演出详情页逐项填写。
移动端damai_appium/config.jsonc各字段:
| 字段 | 对应页面位置 | 说明 |
|---|---|---|
server_url | 非页面元素 | Appium 服务地址,默认http://127.0.0.1:4723 |
keyword | APP 顶部搜索框 | 用来定位演出的关键词 |
users | 观演人选择列表 | 姓名需已在大麦 APP 观演人列表中提前添加 |
city | 详情页顶部城市栏 | 脚本按文本精确匹配 |
date | 场次日期区 | 格式为"月.日",如12.06 |
price | 目标票价卡片文字 | 供核对用,如"内场1199元" |
price_index | 票价卡片序号 | 从 0 开始计数,实际用于点击定位 |
if_commit_order | "立即提交"按钮 | true 时自动点击 |
{ "server_url": "http://127.0.0.1:4723", "keyword": "周深", "users": ["观众甲", "观众乙"], "city": "深圳", "date": "12.06", "price": "内场1199元", "price_index": 5 }Web 端damai/config.json结构不同:target_url(演出详情页直链)、users、city、dates、prices(后三项均为列表,可配置多个场次和多个价格),另有三个控制开关:if_listen(是否进入监听状态)、max_retries(最大重试次数,默认 1000)、page_load_delay(订单页加载等待秒数,默认 2)。
运行流程:从 Appium 会话到订单提交的 7 步
移动端脚本启动后在一个会话内按固定顺序执行 7 步,每步都有超时,超时先换备用选择器,全部失败则本次尝试终止并进入重试。
- 建会话:以 UiAutomator2 能力连接
server_url,禁用窗口动画,显式等待设为 2 秒 - 选城市:1.5 秒超时,依次尝试 text 精确匹配、textContains、XPath,全失败即终止
- 点预约入口:先按容器 ID 定位,备用方案是匹配"预约 / 购买 / 立即"文本
- 选票价:尝试点击票价容器中
price_index位置的 FrameLayout 坐标(页面上该卡片 text 可能为空),失败则等容器出现后重试 - 选数量:存在数量控件时,按 n 人点 n−1 次加号
- 选观演人:每人最多等 2 秒采集坐标,随后连续执行
mobile: clickGesture,间隔 10ms - 提交订单:
if_commit_order为 true 时点击"立即提交",备用 XPath 匹配"提交/确认"
一次尝试失败后,脚本quit()会话、重建后隔 2 秒再来,最多 3 次。Web 端流程不同:先自动检查 ChromeDriver,再恢复 Cookie(没有则引导扫码并保存),打开target_url后进入轮询,直到目标票价可点,循环上限即max_retries(默认 1000),订单页加载等待page_load_delay2 秒。
故障自查:4 个常见报错与检查命令
排障按"报错原文 → 原因 → 单条命令验证"的顺序走,多数问题一条命令即可定位。
| 现象 | 可能原因 | 检查命令 |
|---|---|---|
| Node version must be at least ^20.19.0… | Node 版本过低 | node --version,确认后升级 |
| Unable to find an active device or emulator | adb 下没有可用设备 | adb devices;adb shell getprop sys.boot_completed确认完全启动 |
| Connection refused(4723) | Appium 未启动或端口被占 | curl http://127.0.0.1:4723/status;lsof -i :4723 |
| Neither ANDROID_HOME nor ANDROID_SDK_ROOT exported | SDK 环境变量未设置 | export ANDROID_HOME=<SDK路径>后重跑adb devices |
设备在线但脚本超时的情况,用adb shell pm list packages \| grep damai核对 APP 包名与脚本能力里写的appPackage(cn.damai)是否一致。
进阶参数:多设备并行与等待超时的调整
可调参数集中在damai_appium/damai_app_v2.py的能力字典和等待常量里,Web 端只有max_retries与page_load_delay两个。
- 多设备并行:每台设备起一个 Appium 实例(4723 / 4724 / 4725 依次递增),每份脚本的
server_url指向各自端口 - 会话空闲超时:
newCommandTimeout默认 6000 秒,超时自动断开 - 速度类参数:显式等待 2 秒、快速点击等待 1.5 秒、
waitForSelectorTimeout300ms;设备老、页面慢时把它们放宽,减少误判失败 - 性能类参数:
mjpegServerFramerate=1与disableWindowAnimation=true用于降低截图开销,保持默认即可
合规边界:个人使用的前提
这个工具的定位是个人账号下的自动化练习,使用前要守住几条边界。
- 遵守大麦网用户协议,仅用于个人合理购票,不做倒卖等商业用途
- 脚本只模拟正常页面的点击操作,不调用私有接口,不绕过风控校验或验证码
- 建议用专门账号运行,网络保持稳定,开售前 30 分钟启动并确认会话建立
- 若账号触发平台风控或受到限制,先停止使用
项目许可限定于学习与研究用途,商用不受许可保护。
收尾:去哪读源码
移动端主逻辑集中在 damai_appium/damai_app_v2.py(约 290 行),Web 端逻辑分布在 damai/concert.py,想逐步核对每步选择器写法时按这两个文件顺序读即可。
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考