10分钟跑通大麦自动抢票:双端环境搭建到高成功率配置的完整指南
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
抢票靠手速的时代已经过去了。热门演唱会的票通常在一两秒内售罄,手动刷新加点击的极限操作成功率不足1%,而"ticket-purchase"项目通过 Python + Selenium 控制 Chrome 浏览器、Python + Appium 控制 Android 手机上的大麦 App,让机器替你完成"蹲守、点选、提交"一整条链路,把成功率拉高一个量级。本文带你从零搭建这套双端抢票系统,先跑起来,再讲原理,最后用真实踩坑经验帮你避开所有弯路。
从一个真实场景说起:我为什么需要一台"机器人"
想象这样的傍晚:你定好闹钟,提前十分钟打开演唱会详情页,手指悬在"立即购买"上方。开售瞬间,页面刷新,按钮还是灰色"缺货登记",你疯狂点了几十下,终于等到它变绿,却在选择观演人的弹窗里手忙脚乱,等选完人,票已经没了。
这套系统的价值就在于:它把你最慢的两个环节——"等待按钮变色"和"弹窗里逐个勾选观演人"——全部接管。你只需要提前配好目标演出信息,剩下的交给脚本。它像一位不知疲倦的购票助手,守在票务窗口前,按钮一变绿就以毫秒级速度完成点击、选人、提交。
项目由两个独立模块组成:
| 模块 | 技术栈 | 适用场景 |
|---|---|---|
damai/ | Selenium + Chrome | PC 浏览器端抢票 |
damai_appium/ | Appium + UiAutomator2 | Android 手机端抢票(推荐) |
最小可用体验:三条命令,先让脚本跑起来
先别急着研究原理,跟着下面走一遍,让成就感先到位。前提是:电脑上已有 Python 3.9+,且手机端方案需要一台开启 USB 调试的 Android 设备(模拟器也可以)。
第一步,克隆项目并安装依赖:
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase poetry install # 推荐,或使用 pip install -r requirements.txt第二步,一键体检环境:
./check_environment.sh这个脚本会依次检查 Python、Node.js、Appium、Android SDK、ADB 设备、大麦 App 是否安装、Appium 服务器是否在运行,最后还会顺带看一眼配置文件里的关键词和城市,相当于出发前的全套自检清单。哪一步打叉,照着提示补装即可。
第三步,启动服务并开抢(手机端):
./start_appium.sh # 启动 Appium 服务器(端口 4723) ./start_ticket_grabbing.sh # 启动抢票脚本两个启动脚本都内置了检查逻辑:Appium 未装、设备未连接、大麦 App 未安装,都会提前拦截并给出修复命令,不会让脚本跑一半才报错。运行抢票脚本前,记得先在手机上打开大麦 App、登录账号并进入目标演出的详情页。
Web 端则更简单:编辑damai/config.json填入演出 URL,然后cd damai && python damai.py。首次运行会让你扫码登录,登录态会存进damai_cookies.pkl,下次直接复用 Cookie,免去重复扫码。
核心原理拆解:一个"手速放大器"的内部构造
它本质上是个"预先排练好的操作流程"
抢票脚本做的事情,和你手动操作一模一样,只是把每个动作都排练成了固定步骤,并且速度更快。以移动端为例,完整流程如下:
大麦抢票流程:登录 → 进入详情页 → 选城市/场次/票价 → 轮询检测购票按钮 → 立即购买 → 选观演人 → 提交订单
用状态机来理解最清晰:脚本维护一个"当前进行到哪一步"的状态,每一步成功才推进到下一步,任何一步失败都可以回到起点重来。damai_app_v2.py中的run_ticket_grabbing()就是这个状态机的实体——城市选择、预约按钮、票价、数量、购买、选人、提交,一气呵成。
把点击速度榨到极限的三个技巧
移动端抢票的胜负手在速度,damai_app_v2.py里有三个值得学习的优化思路:
- 坐标点击代替元素点击:Appium 默认的
element.click()要走完整的事件协议,脚本改成先读取元素矩形,算出中心点坐标,再调用mobile: clickGesture直接按坐标点击,省掉了大量中间步骤。
rect = el.rect x = rect['x'] + rect['width'] // 2 y = rect['y'] + rect['height'] // 2 self.driver.execute_script("mobile: clickGesture", { "x": x, "y": y, "duration": 50 # 50ms 的极短点击 })让 UiAutomator2 不等页面"空闲":默认情况下 Appium 要等界面动画和空闲状态才返回,抢票时这就是致命的延迟。脚本通过
update_settings把waitForIdleTimeout、actionAcknowledgmentTimeout、keyInjectionDelay全部压到 0,等于告诉引擎"别等,立刻执行"。批量预收集坐标,连续点击:选择多个观演人时,逐个"查找→等待→点击"太慢。
ultra_batch_click()先一次性把所有观演人的坐标收集齐,再以 10ms 间隔连续触发点击,把原本可能几秒的操作压缩到毫秒级。
Web 端的轮询与登录态复用
Web 端(damai/concert.py)的核心是轮询检测:进入详情页后循环检查购票按钮的文本状态——"提交缺货登记"说明未开售,继续刷新等待;变成"立即预订"或"立即购买"就立刻点击。同时用 Cookie 文件复用登录态,避免每次启动都要扫码;如果演出需要"选座购买",脚本还会在选座完成后自动点击确认按钮。
配置与参数手册:一份配置文件说清所有选项
移动端配置(推荐使用)
编辑damai_appium/config.jsonc,这是目前项目里最常见的配置形态:
{ "server_url": "http://127.0.0.1:4723", "keyword": "周深", "users": ["王胜", "潘鸿运"], "city": "深圳", "date": "12.06", "price": "内场1199元", "price_index": 5, "if_commit_order": true }config.jsonc 配置文件:所有抢票参数集中在这里,改参数即可换目标演出
各参数的作用和注意点:
| 参数 | 作用 | 典型取值 | 注意事项 |
|---|---|---|---|
server_url | Appium 服务器地址 | http://127.0.0.1:4723 | 与start_appium.sh的端口保持一致 |
keyword | 演出搜索关键词 | "周深" | 需提前在 App 中完成搜索并进入详情页 |
users | 观演人名单 | ["王胜","潘鸿运"] | 姓名必须与 App 中的观演人信息完全一致 |
city | 演出城市 | "深圳" | 详情页里有该城市才会命中 |
date | 演出日期 | "12.06" | 格式参照详情页场次的显示文本 |
price | 票价描述 | "内场1199元" | 支持模糊匹配,写关键词即可 |
price_index | 票档在列表中的序号(从 0 开始) | 5 | 用于点击隐藏文本的票档,需对照页面数清楚 |
if_commit_order | 是否自动提交订单 | true | 建议先设false做一次试跑,确认无误再开启 |
Web 端配置
编辑damai/config.json,结构略有不同:
{ "index_url": "https://www.damai.cn/", "login_url": "https://passport.damai.cn/login", "target_url": "https://detail.damai.cn/item.htm?id=xxx", "users": ["张三", "李四"], "city": "广州", "date": "2023-10-28", "price": "1039", "if_commit_order": true }Web 端额外支持dates(多个场次)和prices(多个票档)数组,脚本会按配置顺序逐个尝试,自动跳过"缺货""售罄"状态的选项;max_retries控制轮询次数上限,fast_mode为true时大幅压缩等待时间并精简日志输出。
配置与页面的对应关系
example_detail.png:页面上的城市、日期、票价、观演人,与配置文件逐项对应
大麦演唱会详情页:票价档位、数量选择、总价一目了然,是配置参数的主要参照物
进阶玩法:三个让成功率翻倍的实战技巧
技巧一:预售开抢用"快速模式"
针对开售瞬间的高并发,Web 端推荐开启fast_mode,把轮询和刷新间隔压到最低,同时把max_retries提到几千次,让脚本在开售前后高频刷新、秒抢按钮。建议时间线:开票前 30 分钟完成环境检查,前 10 分钟完成登录验证,前 5 分钟进入详情页待命。
技巧二:回流票用"监听模式"
如果目标是随时可能释放的回流票,开if_listen: true并降低轮询频率,让脚本长时间蹲守。它的逻辑是:检测到可购买就立刻执行完整购买流程,检测到售罄就等待下一轮,检测到网络异常则短暂间隔后继续——三种状态三种策略,避免高频请求触发风控。
技巧三:多设备多账号协同
热度极高的演出,可以多开几台设备各配一个账号:一台主力设备开快速模式冲首轮,一台备用设备开监听模式盯回流,配置上互不干扰。注意start_ticket_grabbing.sh中有确认提示,正式开抢前先手动跑一次确认流程通畅。
踩坑指南:五个高频错误与解决办法
1. Node.js 版本不兼容
Error: Node version must be at least ^20.19.0 || ^22.12.0 || >=24.0.0原因:Appium 3.x 要求较新的 Node 运行时。 解法:nvm install 20.19.0或brew upgrade node,之后node --version复核。
2. Android 环境变量未设置
Error: Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported原因:Appium 找不到 Android SDK。 解法:把export ANDROID_HOME=/path/to/android/sdk和export ANDROID_SDK_ROOT=/path/to/android/sdk写入~/.bashrc,项目里的start_appium.sh也会自动设置。
3. 找不到设备或模拟器
Error: Unable to find an active device or emulator原因:设备未连接或 USB 调试未开启。 解法:
adb devices # 确认设备在列表中 adb kill-server && adb start-server # 重启 ADB 服务 adb shell getprop ro.build.version.release # 确认系统版本4. Appium 服务器连接被拒
Error: Connection refused原因:服务器没起来,或 4723 端口被占用。 解法:curl http://127.0.0.1:4723/status探活,lsof -i :4723查端口占用,最后用./start_appium.sh重新拉起服务。
5. 元素定位失败、观演人选不上原因:页面结构变动或网络延迟导致元素未加载。 解法:先确认观演人姓名与 App 内一字不差;再查看脚本的扫描日志,确认用户名元素确实存在;必要时调大等待时间。Web 端脚本为观演人选择准备了四种定位方法,会自动降级尝试,多数情况都能兜住。
项目结构与二次开发:想改哪一块,直接看这里
ticket-purchase/ ├── damai/ # Web 端抢票(Selenium) │ ├── damai.py # 入口:校验配置、加载配置、启动 │ ├── concert.py # 核心:登录、选票、轮询、提交订单 │ ├── config.py # Web 端配置类 │ └── check_environment.py # ChromeDriver 环境检查 ├── damai_appium/ # 移动端抢票(Appium) │ ├── damai_app_v2.py # 优化版主程序(坐标点击、快速模式) │ ├── damai_app.py # 原版主程序 │ ├── config.py # 移动端配置类 │ └── config.jsonc # 配置文件(改这里换目标演出) ├── tests/ # 单元测试与集成测试 ├── check_environment.sh # 一键环境体检 ├── start_appium.sh # 启动 Appium 服务 └── start_ticket_grabbing.sh # 启动抢票脚本做二次开发时,两条主线值得研究:
- 移动端:
damai_appium/damai_app_v2.py里ultra_fast_click、smart_wait_and_click这套"主选择器 + 备用选择器"的降级策略,是应对页面结构变化的核心思想。页面改版导致定位失效时,往备用选择器列表里追加新的 XPath 即可,无需改主流程。 - Web 端:
damai/concert.py的_submit_order依次尝试按文本、按属性、按 class、按原始 XPath 四种方式提交订单,这就是"多路兜底"的教科书实现,任何一步失败都不会让整个流程卡死。
规范与使用提醒:技术可以快,但要合规
自动化工具天然游走在规则边缘,以下几点请务必遵守:
- 仅用于个人学习和技术研究,遵守大麦网的用户协议与服务条款。
- 使用专门的测试账号,降低主账号风险。
- 合理设置请求频率和重试次数,避免对服务器造成压力、影响其他用户。
- 每次开抢前先小规模试跑,确认无异常再正式执行;完成购票后及时停止脚本。
收尾总结:从读文章到抢到票的行动清单
这套双端抢票系统把"等待、点击、选人、提交"这条完整链路交给了自动化,配合坐标点击、零等待配置、多路兜底选择器和登录态复用,把人工操作中被浪费的每一毫秒都省了下来。无论你是第一次接触 Appium 的新手,还是想研究自动化点击性能优化的进阶开发者,都能从中找到值得借鉴的思路。
现在就可以动手:
- 克隆项目并安装依赖
- 运行
./check_environment.sh完成体检 - 编辑
damai_appium/config.jsonc填入目标演出 ./start_appium.sh启动服务./start_ticket_grabbing.sh开始抢票
祝你在抢票路上旗开得胜。🎫
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考