大麦抢票总差一秒?这套开源自动抢票工具帮你把手速变成代码速度
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
你有没有过这样的体验:演出开售前5分钟就蹲在屏幕前,把鼠标悬停在"立即预订"上,倒计时归零的瞬间狂点,结果页面转了一圈,弹出来的是"缺货登记"。而朋友圈里有人晒出订单截图,用的就是自动化脚本。今天要介绍的这个开源项目,就是一套基于 Python 的大麦自动抢票工具,支持 Web 端和移动端双平台,从登录、选场次、选票价、勾选观演人到提交订单,全程替你完成。它适合所有被"秒光"伤过的人,也适合想了解爬虫与浏览器自动化的小白。
读完这篇文章,你会得到三样东西:一份环境搭建清单、一份能直接套用的抢票配置模板、以及一份避开常见坑的操作地图。
它到底能做什么:相当于给你雇了个"无影手"
简单说,这个工具就是一个不知疲倦的机器人,替你把抢票流程里的每个动作拆开、加速、循环执行。
第一件事:自动选场次和票价。你提前告诉它"我要 10 月 28 日广州站、1039 元档",它会在页面上逐个扫描日期和票档卡片,跳过标记了"售罄""缺货"的选项,命中目标就立刻点下去。什么时候用得上?当一场演出同时开了四五个城市、七八个场次,而你只想要特定那一场时,人工眼睛找都要找两三秒,脚本一秒内完成。
第二件事:自动勾选所有观演人。配置里写几个名字,它就帮你勾几个,还会自动把购票数量调到对应张数。什么时候用得上?帮家人朋友一起抢票时,手动勾选三四个观演人再加校验,是抢票流程里最容易被拖慢的环节。
第三件事:循环刷新 + 智能重试。票没开售就持续刷新页面;开售瞬间按钮变成"立即预订",立刻点击并进入订单确认页。网络波动、页面卡顿也不用怕,内置的重试机制会自动重来。什么时候用得上?抢回流票、蹲退票时,这种"机器人式盯梢"正是你需要的。
整套抢票流程的运作逻辑,可以用项目里自带的这张流程图一目了然:登录校验、状态检测、抢购、提交订单,四个环节全部自动化。
动手前的准备清单:先照单打勾再动手
在跑脚本之前,先确认环境是否就绪。Web 端和移动端的要求不同,按需准备:
| 检查项 | Web 端 | 移动端(Appium) |
|---|---|---|
| Python | 3.9+ | 3.9+ |
| 浏览器 | Chrome 最新版 | 无需 |
| ChromeDriver | 自动安装/校验 | 无需 |
| Node.js | 不需要 | 20.19.0+ / 22.12.0+ / 24.0.0+ |
| Appium | 不需要 | 3.1.0+,安装 uiautomator2 驱动 |
| Android 环境 | 不需要 | SDK + 环境变量 + 真机或模拟器 |
依赖安装也很简单,项目根目录提供了check_environment.sh一键检查脚本,damai/目录下也有对应的 Python 版本check_environment.py,运行后它会自动检测缺失项并给出提示。
# 克隆项目到本地(仓库地址:https://gitcode.com/GitHub_Trending/ti/ticket-purchase) git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase && cd ticket-purchase # 安装 Web 端 Python 依赖 pip install -r damai/requirements.txt如果你只用 Web 端,到这里环境就齐了;移动端还要额外装 Appium 和 Android SDK,流程较长,建议新手先从 Web 端跑通。
核心配置一图看懂:先认识这八个参数
Web 端的配置文件是damai/config.json,移动端是damai_appium/config.jsonc。两者结构相似,这里以 Web 端为主讲透参数含义:
| 参数名 | 作用 | 示例值 |
|---|---|---|
target_url | 目标演出详情页地址,从浏览器地址栏复制 | https://detail.damai.cn/item.htm?id=xxx |
users | 观演人姓名列表,决定买几张票 | ["张三", "李四"] |
city | 目标城市,用于城市切换 | "广州" |
dates | 目标日期,支持多种写法 | ["2023-10-28", "10月28日"] |
prices | 目标票价,支持数字和带单位 | ["1039", "¥1039", "1039元"] |
fast_mode | 快速模式,开启后大幅缩短等待时间 | true |
if_listen | 是否监听"缺货登记"按钮(蹲回流票) | true |
if_commit_order | 是否自动提交订单,新手建议先关掉 | false |
下面是一份带注释的完整配置示例,直接复制改值即可:
{ "index_url": "https://www.damai.cn/", "login_url": "https://passport.damai.cn/login", "target_url": "https://detail.damai.cn/item.htm?id=123456789", "users": ["张三", "李四"], "city": "广州", "dates": ["2023-10-28"], "prices": ["1039", "¥1039"], "fast_mode": true, "if_listen": true, "if_commit_order": true, "max_retries": 1000 }项目仓库里的img/config_json.png就是配置文件的实际截图,字段和你看到的一一对应。
这里要特别提醒:target_url、city、dates、prices这四个值必须和演出页面上实际显示的内容对应上,否则脚本会找不到目标。下面这张标注图直观演示了"页面信息 → 配置值"的对应关系,照葫芦画瓢就不会错。
从零到跑通:三步实战
以 Web 端为例,跑通最小可用流程只需要三步。
第一步:填好配置文件。打开damai/config.json,把目标演出的 URL、城市、日期、票价、观演人填进去。怎么拿这些值?打开大麦网找到演出详情页,页面标题、日期、票价列表就是答案,参照上一节的标注图逐项对照填写。
第二步:运行环境检查。执行下面的命令,脚本会自动校验 Chrome 和 ChromeDriver 的匹配情况,缺什么会自动装:
# 一键检查 Web 端运行环境(Chrome 与 ChromeDriver 版本匹配) python damai/check_environment.py第三步:启动抢票程序。首次运行会让你扫码登录,之后 Cookie 会被保存在本地damai_cookies.pkl,下次运行自动复用,不需要重复扫码:
# 进入 Web 端目录并启动抢票脚本 cd damai && python damai.py每步成功后你会看到什么?环境检查通过会输出 ChromeDriver 就绪的提示;脚本启动后浏览器自动打开大麦网;登录成功后终端出现"登录成功";开售瞬间你能看到"检测到按钮: 立即预订"的日志,紧接着是"进入订单确认页"。看到这些字样,说明整条链路已经打通。如果你把if_commit_order设为false,脚本会在订单确认页停住,让你手动核对后提交——新手强烈建议先这样跑一次。
踩坑避雷区:四个高频问题速查
1. 症状:找不到用户元素,勾选观演人失败原因:页面还没加载完,脚本就去找元素了。 解法:把page_load_delay调大到 3~5 秒,或者暂时关闭fast_mode,给页面留出渲染时间。
2. 症状:ChromeDriver 报版本不匹配原因:浏览器自动更新后,驱动版本对不上了。 解法:重跑一次damai/check_environment.py,项目内置了驱动自动安装逻辑,一般能自动修复。
3. 症状:移动端提示 Node 版本不兼容原因:Appium 3.x 对 Node 版本有硬性要求。 解法:升级 Node.js 到 20.19.0 及以上版本,再用node --version确认。
4. 症状:移动端连不上设备原因:ANDROID_HOME环境变量没设置,或设备没开 USB 调试。 解法:先用adb devices确认设备在线,再设置export ANDROID_HOME=/path/to/android/sdk并启动 Appium 服务。
进阶玩法与效率技巧
跑通基础流程之后,这几个进阶姿势能明显提高命中率:
| 场景 | 普通用法 | 进阶用法 |
|---|---|---|
| 抢票时机 | 开售后手动启动 | 提前 30 分钟启动,max_retries拉到 5000+,开售瞬间自动响应 |
| 票价策略 | 只配一个票价 | prices多写几个档位,售罄自动换下一个 |
| 回流票 | 抢完就关 | if_listen设为true,持续监听"缺货登记"按钮,等待退票回流 |
| 移动端 | 手动执行整套命令 | 用项目自带的start_appium.sh和start_ticket_grabbing.sh一键启动 |
另外一个小建议:多账号分开跑、多场次分散配置,都能在不增加复杂度的前提下扩大覆盖面。
源码浅探:两处值得一看的设计
如果对实现好奇,不用啃完整源码,只看damai/concert.py里的两处即可。
第一处是智能按钮识别。脚本轮询页面时,会把"立即预订""立即购买""选座购买"等按钮文本统一处理,命中任何一个就立刻点击。你抢票时最怕按钮文案临时变化,这套设计把常见的几种写法都覆盖了,相当于给按钮做了"多义词匹配"。
# 把常见的可点击按钮文本统一处理,命中即点击 clickable_actions = [("立即预订", buy_button, 'buy__button__text'), ("立即购买", buy_button, 'buy__button__text')]第二处是安全点击封装。页面元素偶尔会被弹窗或遮罩层挡住,直接点击会抛异常中断整个流程。项目里把"找元素 + 点击"包成了_click_element_safe,失败时静默跳过、不中断,配合外层重试循环,让脚本在真实网络环境下更抗造。
# 封装点击操作:失败不抛异常,交给外层重试机制处理 def _click_element_safe(self, locator, by=By.CLASS_NAME): try: element = self.driver.find_element(value=locator, by=by) element.click() return True except Exception: return False这两处设计合在一起,就是"抢票脚本必须稳"这个朴素道理的代码化体现。
什么时候别用它
说句公道话,这个工具不是万能的,有几种情况你要冷静评估:
- 座位需要自己挑时。需要选座的场次,脚本只能帮你抢到入口,选座还得手动完成,抢座速度依然拼手速和网速。
- 大麦页面结构变动时。自动化依赖页面元素的 class 和文案,一旦官网改版,脚本需要跟着适配,否则会失效。
- 合规风险要自担。自动化抢票可能违反平台服务条款,有封号风险。项目本身仅供学习研究,请务必遵守大麦网规则、使用合规账号,不要用于商业倒票。
- 性能上限客观存在。再快的脚本也拼不过官方服务器的流量管控,它提升的是你的"手速下限",不是玄学。
结尾行动清单:三步就能开始
现在你离"抢到票"只差三个动作:
- 克隆仓库并安装依赖:
git clone https://gitcode.com/GitHub_Trending/ti/ticket-purchase - 对着演出页填好
damai/config.json,把if_commit_order先设为false试跑一遍 - 确认
check_environment.py通过后,开售前 30 分钟启动damai.py,然后耐心等日志刷出"进入订单确认页"
更详细的说明可以查阅项目里的README.md和QUICK_START.md,移动端配置参考damai_appium/config.jsonc的注释字段。首次跑通后,记得回来把fast_mode打开、if_commit_order打开,让脚本替你全权接管。
祝你在下一个开售日,收获的不再是"缺货登记",而是那张等待已久的订单。🎫
【免费下载链接】ticket-purchase大麦自动抢票,支持人员、城市、日期场次、价格选择项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考