我用Python写了个大麦自动抢票助手:从开票前10分钟焦虑到开票3秒出票
2026/8/21 18:04:50 网站建设 项目流程

我用Python写了个大麦自动抢票助手:从开票前10分钟焦虑到开票3秒出票

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

写在前面:ticket-purchase 是一个同时支持 Web 端(Selenium)与移动端(Appium)的大麦自动抢票开源项目,核心能力是自动选择人员、城市、日期场次与票价并提交订单。这篇文章不聊空洞的"效率革命",只讲我从第一行命令到真实抢到票的完整经历,以及那些没人提醒你、但一定会踩的坑。


一次真实的开票现场,我做了什么

周五 19:58,距离某歌星上海站开票还有两分钟。我左手端着手机,右手悬在鼠标上,页面已经提前刷到详情页——结果一开票,座位图转了三圈,再一刷新,"已售罄"三个字静静躺在屏幕上。

那是我第三次手动失败。第三次之后我意识到:问题从来不是手速,而是我永远比服务器慢半拍。于是那个周末,我找到了这个叫 ticket-purchase 的开源项目,用了一晚上跑通,下一次开票,从点击"立即购买"到订单提交成功,大约 3 秒。


先搞清楚它到底能替你做什么

项目根目录下有两个平行模块,对应两条不同的抢票路线:

模块技术栈适用场景
damai/Selenium + Chrome电脑上跑,适合桌面党
damai_appium/Appium + UiAutomator2连接 Android 真机或模拟器,当前主力方案

它的工作方式简单说就四步:登录(优先 Cookie,失效则扫码)→加载购票参数轮询票源状态(未开售就一直等,开售立刻抢)→自动选择城市/场次/票价/观演人并提交订单

整个执行链路在项目的流程图里画得很清楚,我放一张你感受下:

这套逻辑让我可以提前配好所有参数,开票那一刻它负责手速,我只负责盯着控制台输出。


最小跑通路径:从克隆到第一次运行

如果你是第一次接触这类工具,别急着读源码,按下面这条最短路径走,20 分钟内能见到脚本动起来。

第一步:克隆项目

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

第二步:环境一键体检

项目自带一个check_environment.sh,它会依次检查 Python、Node.js(需 20.19.0+)、Appium、Android SDK、ADB、设备连接状态、大麦 APP 是否安装以及 Appium 服务器是否在跑,每一项给出明确 ✅/❌ 提示:

./check_environment.sh

这一步能省掉你 80% 的排查时间。缺哪项补哪项,脚本会直接告诉你安装命令。

第三步:填一份最小配置

编辑damai_appium/config.jsonc,只改 5 个字段就够跑:

{ "server_url": "http://127.0.0.1:4723", "keyword": "周深", "users": ["王胜", "潘鸿运"], "city": "深圳", "date": "12.06", "price": "内场1199元", "price_index": 5, "if_commit_order": true }

第四步:两个脚本按顺序启动

./start_appium.sh ./start_ticket_grabbing.sh

第一个脚本拉起 Appium 服务器并做设备预检,第二个脚本会读取配置、二次确认后进入自动抢票循环。前提是手机上已经打开大麦 APP 并停留在目标演出的详情页。

依赖安装方面,项目推荐 Poetry(poetry install),用 pip 装requirements.txt也一样能跑。


配置文件的每个字段,我都替你踩过坑

配置是整个工具的大脑,config.jsonc里每个字段都有讲究。我逐个拆给你看。

server_url:Appium 服务器地址,默认http://127.0.0.1:4723,一般不用动。改动它之前,先确认curl http://127.0.0.1:4723/status有返回。

keyword:搜索关键词,用于脚本定位演出。建议写全名,比如"周杰伦"比"周董"稳。

users:观演人名单,数组格式,必须与大麦账号里已添加的观演人姓名逐字一致,多一个字少一个字都会导致勾选失败。

city:城市名,格式要和页面完全一致。这是一个高频踩坑点,详见下一节。

date:移动端格式是MM.DD(如12.06),Web 端则是YYYY-MM-DD(如2023-10-28)。两个端格式不同,混用必挂。

price:票价档位文本,移动端建议带档位名(如内场1199元),Web 端直接写价格数字(如1039)。

price_index:同价位的索引,从 0 开始。同一场次可能有多个同价位座位区,用这个字段指定选第几个。

if_commit_order:是否自动提交订单。新手建议先设false跑一次完整流程,确认每一步都选对了再开 true,否则可能误提交。

下面这张图是我当时对照页面填配置时的真实截图,字段和页面元素的对应关系一目了然:

再看一张完整的演出详情页,你就明白这些参数从哪来了:

页面上标注了 target_url、city、date、price 对应位置的增强版示例,配置前建议先看这张:


四个新手必踩的坑,我全部踩过

这一节写给我自己,也写给马上要上手的你。全部是"错误示例 → 正确做法"的对比。

坑一:城市名跟页面差一个字

  • ❌ 页面显示"深圳",配置写"深圳市"
  • ✅ 严格照抄页面上的城市文本,连空格都不要多

脚本按文本精确匹配,差一个字就找不到元素,卡在选城市这一步,眼睁睁看着票卖完。

坑二:日期格式写错端

  • ❌ 移动端写成2023-10-28,Web 端写成10.28
  • ✅ 移动端MM.DD10.28),Web 端YYYY-MM-DD2023-10-28

坑三:设备没连上就开跑

  • ❌ 模拟器没启动,直接./start_appium.sh,报Unable to find an active device or emulator
  • ✅ 先adb devices确认设备在线,再启动 Appium

坑四:开了if_commit_order又没提前试跑

  • ❌ 配置完直接true上真场次
  • ✅ 先用一场已售罄/未开售的演出、false跑通全流程,确认无误再开 true

想让成功率再高一点?三个进阶思路

跑通基础流程后,以下三点是我实测对结果影响最明显的,点到为止,你可以自己深挖。

1. 多账号并行:在users里配多个账号的观演人,或在不同设备各跑一个实例。同一场次多个账号同时提交,概率叠加。注意每个实例用独立的配置文件。

2. 卡点启动:脚本的轮询会一直等到开售瞬间。把server_url、设备、配置全部提前半小时就位,开票前保持页面活跃,别让会话过期。

3. 性能调优damai_app_v2.py里内置了极短的显式等待和坐标点击,damai/config.py还提供fast_modemax_retries等开关。抢票场景下,等待时间越短越有利,但调太小也可能漏掉元素,需要按设备性能微调。


写在最后:工具替你手速,但请保持清醒

这个项目对我最大的意义,是把"开票瞬间的焦虑"替换成了"提前配置时的从容"。它同时覆盖 Web 和移动双端,配置驱动、参数透明、重试机制内置,作为一个学习 Selenium/Appium 自动化实战的案例也相当完整。

想上手的话,按这条路线走:

  1. 克隆项目,跑./check_environment.sh补环境
  2. 用一场非目标演出 +if_commit_order: false完整试跑一次
  3. 确认无误后,替换成真正的演出配置,开票前 30 分钟就位
  4. 详细文档在项目内的README.mdQUICK_START.md,源码按damai/damai_appium/目录分得很清楚

最后两句实在话:请遵守平台使用条款,建议用专门的账号操作,别在短时间内高频重复请求。自动抢票工具优化的是"执行效率",不是"合理性的豁免"——把技术用在刀刃上,享受演出的那一刻,才是我们折腾这些代码的全部意义。

祝你的下一次开票,也能在 3 秒内出票。🎫

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

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

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

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

立即咨询