大麦自动抢票: 从 Appium 环境搭建到自动提交订单的完整链路
2026/9/24 14:12:45 网站建设 项目流程

大麦自动抢票: 从 Appium 环境搭建到自动提交订单的完整链路

【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase

这个仓库是一套大麦抢票自动化工具,双端实现:Selenium 驱动 Chrome 完成网页端购票,Appium 驱动 Android 设备完成 App 端购票,程序自动进入演出详情页,依次完成城市、场次、票档、观演人选择并提交订单,解决手动抢购时秒级的反应延迟问题。

📋 能力速览:双端抢票能做什么

功能点对应实现适用场景
App 端自动抢票damai_appium/damai_app_v2.py,基于 Appium + UiAutomator2 驱动大麦多数热门演出票只能在 App 内购买
Web 端抢票damai/damai.py,Selenium 驱动 Chrome支持 PC 网页购票的演出
Cookie 缓存登录登录态存入damai_cookies.pkl首次扫码登录后,后续免登录直接进入页面
快速点击mobile: clickGesture坐标点击,单次点击 50ms库存放出瞬间完成购买按钮点击
自动重试run_with_retry,3 次尝试、间隔 2 秒、重建驱动容忍单步失败与网络波动
环境自检check_environment.shdamai/check_environment.py开抢前一次性核对 Python、Node、Appium、设备状态

⚙️ 工作原理:从 Appium 服务到订单提交

以移动端主链路(damai_appium/damai_app_v2.py)为例,执行过程分五步:

  1. 加载配置:Config.load_config()读取damai_appium/config.jsonc,取出观演人、城市、price_index等字段。
  2. 连接 Appium:通过webdriver.Remote连到本地 4723 端口。Appium 是基于 WebDriver 协议的移动端 UI 自动化框架,可以理解为"让程序替你操作手机";capabilities 中指定大麦包名cn.damai与启动 Activity,驱动使用 UiAutomator2。
  3. 快速定位:App 端很多票在 App 内下单,V2 版假设设备已被手动停在演出详情页,直接跳过"输入关键词搜索"步骤,依次点击城市、购票按钮、票档、数量、确定购买、观演人、立即提交。
  4. 点击提速:全部点击走mobile: clickGesture(duration 50ms),并把waitForSelectorTimeout压到 300ms、waitForIdleTimeout设为 0。这样设计的原因是大麦放票时按钮状态瞬间变化,每一步的等待开销都要压到最低。
  5. 失败重试:run_with_retry最多执行 3 次,每次失败后重建 driver、间隔 2 秒再试。

Web 端链路在damai/concert.py:首次运行提示手动扫码登录,成功后把 Cookie 写入damai_cookies.pkl,之后直接复用;主循环在 fast 模式下每 0.2 秒轮询一次按钮文本(立即预订、立即购买、选座购买),检测到跳转订单确认页后自动勾选观演人并提交。程序监控的目标页面如下:

🚀 从零到出票:Appium 环境搭建与 Android 设备连接

前提:Python 3.9+、Node.js 20.19.0+ / 22.12.0+ / 24.0.0+、已安装 Android SDK 的设备或模拟器。

1. 克隆项目

git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase

2. 安装 Python 依赖

pip install -r damai/requirements.txt

3. 安装 Appium 与驱动

npm install -g appium appium driver install uiautomator2

4. 配置 Android 环境变量(路径换成你本机的 SDK 实际位置)

export ANDROID_HOME=/path/to/android/sdk export ANDROID_SDK_ROOT=$ANDROID_HOME

5. 连接 Android 设备

adb devices

看到设备序列号后跟device字样,表示 Android 设备连接成功。设备需开启 USB 调试,模拟器则先启动。在设备上安装大麦 App 并登录账号、添加好观演人。

6. 启动 Appium 服务

./start_appium.sh

注意:仓库里的start_appium.shcheck_environment.sh是作者 macOS 环境写死的 SDK 路径,在其他系统上建议手动执行appium --port 4723。启动后用下面命令验证,返回"ready":true即服务可用:

curl http://127.0.0.1:4723/status

7. 手动停在详情页:打开设备上的大麦 App,搜索关键词,进入目标演出详情页并保持前台。

8. 执行抢票

./start_ticket_grabbing.sh

等价于cd damai_appium && python damai_app_v2.py。做对了的标志:控制台先打印"开始抢票流程...",结束时打印"抢票流程完成,耗时: x.xx秒"。

Web 端则配置好damai/config.json后运行cd damai && python damai.py,首次会提示手动扫码登录。

大麦抢票参数逐项配置:config.jsonc 字段拆解

移动端配置在damai_appium/config.jsonc,Web 端配置在damai/config.json(仓库未附带,需在damai/下自建;damai.py在文件缺失时会打印字段模板)。

移动端config.jsonc:

参数名类型含义常见错误值出错现象
server_urlstringAppium 服务地址端口写错或服务未启动Connection refused
keywordstring演出关键词与目标演出无关V2 不再在 App 内搜索,该字段目前仅作手动预停参考
usersarray观演人姓名与 App 内实名不一致、含多余空格控制台"超时未找到用户",订单停在选择页
citystring详情页城市文字写"广州站"(页面只显示"广州")精确与包含匹配都失败,提示"城市选择失败"
datestring场次日期,如12.06与页面格式不一致V2 流程未使用该字段,场次由进入哪个详情页决定
pricestring票档文字App 更新后票档文本为空串,该字段目前仅作备注
price_indexnumber票档在页面中的位置,从 0 起与实际顺序差一位选中错误票档(程序按索引而非文字定位)
if_commit_orderboolean是否提交订单Web 端据此提交;移动端 V2 提交流程当前未引用该字段(以实际仓库为准)

Web 端config.json:

参数名类型含义常见错误值出错现象
target_urlstring演出详情页 URL复制了手机 H5 链接(m.damai.cn)页面元素结构不同,选择器匹配不到
usersarray观演人姓名与站内实名不一致打印"未找到用户",停在提交页
datesarray场次日期列表,可多备与页面格式不一致该场次选不中,回退到列表下一项
pricesarray票档列表,可多备写入售罄票档程序自动跳过含"缺货""无票"的项
if_commit_orderboolean是否自动提交误设为false选完人停在订单确认页,不点提交

页面信息与配置项的对应关系,参考下图(红框标注了target_urlcitydateprice的取值位置):

Web 端配置文件长这样(字段与上文表格一一对应):

🐛 实战踩坑:5 个高频报错的定位与解法

1. Node 版本不兼容现象:启动 Appium 时输出

Error: Node version must be at least ^20.19.0 || ^22.12.0 || >=24.0.0

原因:Node 版本低于 Appium 3.x 要求。解法:升级到兼容版本,macOS 执行brew upgrade node,其他系统从 Node 官网下载对应版本安装包。

2. Android 环境变量缺失现象:

Error: Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported

原因:当前 shell 未导出 SDK 路径。解法:

export ANDROID_HOME=/path/to/android/sdk export ANDROID_SDK_ROOT=$ANDROID_HOME

3. 设备检测不到现象:adb devices无输出或设备显示offline。原因:USB 调试未开启、未授权或模拟器未启动。解法:执行adb kill-server && adb start-server,重新插拔数据线并点击弹窗授权;模拟器从 SDK 的emulator目录启动。

4. Appium 连接被拒现象:脚本报Connection refused。原因:服务未启动或端口被占用。解法:先curl http://127.0.0.1:4723/status确认;端口被占用时用lsof -i:4723找到进程,改用空闲端口并同步修改server_url

5. 票档选错现象:提交的是相邻价位,而非目标票档。原因:App 更新后票档文本为空串,V2 改用price_index按位置定位,页面票档顺序一变索引就错位。解法:开抢前在详情页人工数清目标票档是第几个(从 0 起),写入price_index并核对,说明见 damai_appium/app.md。

6. Web 端反复要求扫码现象:每次都停在登录页。原因:damai_cookies.pkl不存在或 Cookie 过期。解法:删除旧 pickle 文件,跑一次python damai.py完成扫码,成功后登录态会自动写入该文件。

⚡ 性能与体验:自动化 vs 手动

维度手动操作自动化(本项目)数据来源
检测到可买到实际点击1~3 秒单次点击 duration 50ms代码配置值
点击前等待开销显式等待 2s、选择器超时 300ms代码配置值
详情页到提交订单全程数十秒秒级,日志打印"耗时: x.xx秒"程序日志/量级参考
开售前守株待兔人盯屏幕Web 端 fast 模式 0.2s 轮询按钮代码配置值
失败恢复手动重来自动 3 次重试并重建驱动代码

仓库未发布 benchmark 数据,表中"手动"列为量级估算;自动侧数值均取自damai_app_v2.pydamai/concert.py中的实际配置,可对照源码核对。

边界与合规:能做什么、不能做什么

  • 平台条款:大麦用户协议对自动化下单有约束,使用本工具可能违反平台规则,产生的账号与订单后果需自行承担。
  • 账号风险:高频轮询与异常操作可能触发风控,导致验证、限制下单;README 建议用专门的测试账号运行。
  • 法律边界:项目声明仅供学习和研究使用,不得用于商业用途;借此批量囤票、倒卖可能触及法律风险。
  • 能力边界:App 端 V2 只实现"购买"链路,"预约"流程未处理(见 damai_appium/app.md);Web 端遇到"选座购买"时,选座动作需人工完成,程序会等待。

延伸阅读

  • QUICK_START.md:三步启动流程与一键脚本说明
  • 完整使用指南(PC端).md.md):Web 端从登录到提交的分步教程
  • damai_appium/app.md:V2 版设计取舍与提速手段的原始说明
  • damai_appium/damai_app_v2.py:移动端抢票入口,含 capabilities 与点击优化细节
  • damai/concert.py:Web 端轮询、选人与多策略提交的实现
  1. 运行./check_environment.sh逐项核对环境(非 macOS 系统注意脚本内 SDK 路径写死,需自行调整或逐项手查)。
  2. 打开damai_appium/config.jsonc,按详情页核对userscityprice_index三个最容易出错的字段。
  3. 手动把设备停在目标演出详情页,大麦 App 保持登录与前台状态。
  4. 运行./start_appium.sh启动服务,并用curl http://127.0.0.1:4723/status确认返回 ready。
  5. 用一场非热门演出做完整演练,控制台打印"抢票流程完成"且订单状态正常后,链路即具备正式使用条件。

【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询