公司动态

大麦自动抢票实战:我用手边的安卓机,搭了一个全天候盯票机器人

📅 2026/8/14 7:33:46
大麦自动抢票实战:我用手边的安卓机,搭了一个全天候盯票机器人
大麦自动抢票实战我用手边的安卓机搭了一个全天候盯票机器人【免费下载链接】ticket-purchase大麦自动抢票支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase大麦自动抢票一直是技术圈里热度不减的话题——热门场次开售即罄手动刷新拼不过手速和网速。我研究并跑通了一套基于 Python 与 Appium 的开源方案另有 Selenium 的 Web 端实现用一台安卓机挂机盯票从城市、场次、票价到观演人自动全选实测把开售瞬间的成功率提了几个量级。这篇文章记录我的完整实操过程包括配置里那些没人告诉你的坑。抢了三次没抢到我决定写个程序替我点先说背景。为了给朋友抢一场演唱会门票我提前半小时坐在电脑前把身份证号、观演人信息全部预填好就等开售那一秒。结果呢倒计时一结束页面卡了十几秒等我能点到立即购买看到的已经是缺货登记。同一晚试了三场全军覆没。后来我复盘了一下手动抢票的死穴手动操作的瓶颈实际影响页面加载 人脑反应开售头 2 秒基本抢不到频繁刷新被风控越刷越慢甚至要验证码观演人逐个勾选选完人票早没了单点单设备失败一次就要从头再来于是我开始找现成方案最终锁定这个项目ticket-purchase。它把两条路都给你铺好了——Web 端用 Selenium 驱动 Chrome适合电脑前蹲守移动端用 Appium 控制安卓设备上的大麦 APP适合挂机。我两套都跑了移动端体验更稳下面也以它为主线讲。获取代码很简单git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase cd ticket-purchase开工前先跑一遍体检check_environment.sh 到底查了什么这个项目贴心的点是它把环境检查写成了一个脚本。你不需要逐条手动验证直接跑./check_environment.sh它会像体检一样逐项排查一项不过就会亮红灯并告诉你怎么办Python 是否安装要求 3.9Node.js 是否安装、版本是否够新项目要求 20.19.0 或 22.12.024也行Appium 是否全局安装要求 3.1.0Android SDK 路径是否存在脚本里硬编码了~/Library/Android/sdkmacOS 用户一般就是这个位置ADB 是否可用是否有安卓设备连接模拟器或真机大麦 APP包名cn.damai是否已安装Appium 服务器http://127.0.0.1:4723是否在跑damai_appium/config.jsonc配置文件是否存在把需要准备的东西列成一张清单照着准备就行组件要求验证命令Python3.9python3 --versionNode.js20.19.0node --versionAppium3.1.0appium --versionAndroid SDK配置好环境变量adb devices大麦 APP已登录账号adb shell pm list packages \| grep damai我当时的体检结果Node 版本太低18appium直接装不上驱动。升级之后重跑全绿。真正决定生死的是 config.jsonc 里那几行环境是地基但决定你能不能抢到票的是配置文件。移动端的配置在 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 }每个参数的含义我整理成了一张表参数含义填写要点server_urlAppium 服务地址本地默认http://127.0.0.1:4723不用改keyword搜索关键词填艺人名/演出名如周深users观演人名单必须与大麦账号里的实名观演人逐字一致顺序就是勾选顺序city演出城市要与页面上的城市文案完全匹配date演出日期按页面显示的格式写如12.06price票价描述页面显示什么就抄什么如内场1199元price_index票价索引从 0 开始这是最容易踩的坑if_commit_order是否自动提交订单true全自动false停在确认页让你人工复核配置时的关键点是把参数和 APP 页面上的元素一一对应起来。页面长什么样、哪个数字对应哪个票价项目文档里有一张标注图可以对着看这里必须单独讲一下price_index的坑。项目作者在代码注释里写得很直白票价列表里某些档位的文字是隐藏的直接按文案找会失败所以脚本换了个思路——在票价容器里按索引定位FrameLayout要求它clickabletrue。也就是说price_index填的是第几个可点击的票价框而不是第几档票价。比如页面从上到下第 6 个可点击框就填5。我第一次就是没搞懂这个填成了页面上的档位序号结果每次都点到错误票价直到对着 damai_appium/damai_app_v2.py 里的注释才恍然大悟。机器人是怎么点点点完成抢票的配置填好环境就绪接下来就是重头戏——看它怎么自动跑完整条抢票链路。核心逻辑在 damai_appium/damai_app_v2.py主流程run_ticket_grabbing有清晰的七步选择城市 → 点击预约按钮 → 选择票价 → 调整数量 → 确定购买 → 勾选观演人 → 提交订单下面这张流程图是整个系统的全局视图从登录到提交订单的分支都画出来了具体执行时有几处设计值得说道说道1. 每个关键步骤都准备了备用选择器。大麦 APP 的页面经常改版按钮文字可能从立即购买变成立即预订。脚本用smart_wait_and_click把多个选择器排队试先按 UI 元素 ID 找找不到就按文字正则匹配.*预约.*|.*购买.*再不行就按 XPath 模糊匹配。相当于给每个按钮买了三份保险。2. 用坐标点击代替元素点击快一个数量级。这是它高性能的核心。ultra_fast_click拿到元素后不直接.click()而是取出元素矩形坐标算中心点再调mobile: clickGesture以极短时长50ms点下去绕过了 Selenium/Appium 那一堆等待和确认逻辑。抢票场景下这几十毫秒的差距就是有票和没票的差距。3. 观演人是批量快点的。勾选多个观演人是手动抢票最耗时的一步。脚本用ultra_batch_click先把所有用户的坐标一次性收集好再以 10ms 间隔连续点全程不到 0.1 秒。4. 整个流程套了重试壳。run_with_retry(max_retries3)会在失败后自动重连驱动再来一轮间隔 2 秒相当于给你留了两次复活机会。跑完一圈控制台会打出每步的执行结果和总耗时。我实测从选城市到提交订单顺利时 3 秒内完事。这是脚本运行时的票务页面我踩过的坑希望你绕开配置对、脚本也熟不代表万事大吉。把我在真机上遇到的坑和官方文档里的常见问题汇总一下按排查顺序排好坑一Node 版本不兼容Error: Node version must be at least ^20.19.0 || ^22.12.0 || 24.0.0升级到兼容版本即可brew upgrade node坑二安卓设备连不上Error: Unable to find an active device or emulator先看设备状态再重启 ADBadb devices # 有没有 device 前缀 adb shell getprop ro.build.version.release # 安卓版本 adb kill-server adb start-server项目里的启动脚本 start_appium.sh 会顺带检查模拟器和大麦 APP没检测到会直接给出启动模拟器的完整命令。坑三Appium 服务器连接被拒Error: Connection refused先确认服务活着没curl http://127.0.0.1:4723/status项目也帮你兜底了抢票脚本 start_ticket_grabbing.sh 启动前会用 curl 探一次 4723 端口没跑就提示你先执行./start_appium.sh。坑四抢到一半报点击失败大多是页面结构变了或者元素没加载出来。我的经验是先看控制台日志里是哪一步失败再对着 damai_appium/damai_app_v2.py 里对应的选择器用 Appium Inspector 确认新页面上的真实 ID/文案改掉那一处选择器就行。另外提一句登录移动端是设备里已登录的大麦 APP 你手动进到演出详情页脚本只负责后面的操作所以开抢前务必确认 APP 登录态有效别在最后关头弹个登录页。进阶玩法多设备协同、回流票监控与几句提醒把单机跑通只是起点。真正热门的场次我建议这样布局设备角色配置侧重用途主控设备快速模式、重试拉满开售瞬间主攻备用设备标准配置主设备失败后顶替监听设备开启回流监控蹲守退票回流如果你蹲的是不定时释放的回流票Web 端有个专门的监听开关if_listen。开了之后脚本会持续轮询票态看到缺货登记就说明还没票继续等看到可抢按钮立刻下手。配合max_retries调大比如 10000可以挂一整天不歇。Web 端的配置和主程序在 damai/config.json 与 damai/damai.py登录走 Cookie 机制首次扫码后会存成damai_cookies.pkl复用。想再压榨一点性能可以把安卓动画关掉减少渲染延迟adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 adb shell settings put global animator_duration_scale 0最后是几句过来人提醒网络尽量用有线系统时间务必与北京时间同步差一秒就可能错过开售节点账号建议用专门的小号而不是主号脚本只在开售前后必要的时间段运行。这套系统本质是把你从重复劳动里解放出来——技术可以帮你抢到票但也请守住合理使用的边界别影响其他观众正常购票。祝你下次开售一次成功。【免费下载链接】ticket-purchase大麦自动抢票支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考