大麦自动抢票: 从 Appium 环境搭建到自动提交订单的完整链路
大麦自动抢票: 从 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.sh、damai/check_environment.py开抢前一次性核对 Python、Node、Appium、设备状态⚙️ 工作原理:从 Appium 服务到订单提交以移动端主链路(damai_appium/damai_app_v2.py)为例,执行过程分五步:加载配置:Config.load_config()读取damai_appium/config.jsonc,取出观演人、城市、price_index等字段。连接 Appium:通过webdriver.Remote连到本地 4723 端口。Appium 是基于 WebDriver 协议的移动端 UI 自动化框架,可以理解为让程序替你操作手机;capabilities 中指定大麦包名cn.damai与启动 Activity,驱动使用 UiAutomator2。快速定位:App 端很多票在 App 内下单,V2 版假设设备已被手动停在演出详情页,直接跳过输入关键词搜索步骤,依次点击城市、购票按钮、票档、数量、确定购买、观演人、立即提交。点击提速:全部点击走mobile: clickGesture(duration 50ms),并把waitForSelectorTimeout压到 300ms、waitForIdleTimeout设为 0。这样设计的原因是大麦放票时按钮状态瞬间变化,每一步的等待开销都要压到最低。失败重试: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-purchase2. 安装 Python 依赖pip install -r damai/requirements.txt3. 安装 Appium 与驱动npm install -g appium appium driver install uiautomator24. 配置 Android 环境变量(路径换成你本机的 SDK 实际位置)export ANDROID_HOME/path/to/android/sdk export ANDROID_SDK_ROOT$ANDROID_HOME5. 连接 Android 设备adb devices看到设备序列号后跟device字样,表示 Android 设备连接成功。设备需开启 USB 调试,模拟器则先启动。在设备上安装大麦 App 并登录账号、添加好观演人。6. 启动 Appium 服务./start_appium.sh注意:仓库里的start_appium.sh、check_environment.sh是作者 macOS 环境写死的 SDK 路径,在其他系统上建议手动执行appium --port 4723。启动后用下面命令验证,返回ready:true即服务可用:curl http://127.0.0.1:4723/status7. 手动停在详情页:打开设备上的大麦 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 refusedkeywordstring演出关键词与目标演出无关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_url、city、date、price的取值位置):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_HOME3. 设备检测不到现象: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.py、damai/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 端轮询、选人与多策略提交的实现运行./check_environment.sh逐项核对环境(非 macOS 系统注意脚本内 SDK 路径写死,需自行调整或逐项手查)。打开damai_appium/config.jsonc,按详情页核对users、city、price_index三个最容易出错的字段。手动把设备停在目标演出详情页,大麦 App 保持登录与前台状态。运行./start_appium.sh启动服务,并用curl http://127.0.0.1:4723/status确认返回 ready。用一场非热门演出做完整演练,控制台打印抢票流程完成且订单状态正常后,链路即具备正式使用条件。【免费下载链接】ticket-purchase大麦自动抢票支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考