大麦抢票脚本完整指南:如何用 3 个接口请求完成抢票
【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase
Automatic_ticket_purchase 是一个大麦网抢票脚本,登录后通过 HTTP 请求完成整个购票流程,不再逐页点击。核心数据点:从查询票档到提交订单只经过 3 次接口调用,全程不渲染页面、不点按钮。
它解决什么问题:手动点击是抢票的瓶颈
手动抢票输在页面加载时间上。开售瞬间,人要先刷新页面、找到票价档位、点“立即购买”、填观演人、再点确认,任何一步页面没加载出来,票就没了。以仓库截图里的周杰伦太原站演唱会为例,页面列出 2000 元起的多个票价档位,从点到“立即购买”到订单确认至少跨 2 次页面跳转。
这个项目早期版本(V1)也用按钮点击,作者自己承认“还要等待页面元素加载,效率低下”。V2 的重构思路是:只在登录时打开一次浏览器页面,之后所有动作都改为接口请求。区别类似“亲自跑柜台取餐”和“直接打餐厅点单接口”:人手的变量是页面速度,接口请求的变量只剩网络延迟。
三步跑起来:安装、配置、启动
跑通的最短路径就三步:装依赖、配驱动和参数、运行登录,不需要额外构建步骤。
第一步:克隆并安装依赖。依赖只有 4 个:requests、selenium、beautifulsoup4、execjs。
git clone https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase cd Automatic_ticket_purchase pip install -r requirements.txt注意 requirements.txt 把 selenium 钉死在 3.141.0 这个老版本,需要搭配较老的 Chrome 浏览器,新浏览器大概率不兼容。
第二步:配置 ChromeDriver 与 4 个抢票参数。下载与本机 Chrome 版本匹配的 ChromeDriver,按系统重命名为 chromedriver_windows、chromedriver_linux 或 chromedriver_mac,放到项目根目录(tools.py 的 account_login 按系统分支读取驱动路径)。然后在 Automatic_ticket_purchase.py 里填 4 个必填参数:
self.item_id: int = 610820299671 # 商品id,来自演出页地址栏 self.viewer: list = ['viewer1'] # 大麦已登记的常用购票人 self.buy_nums: int = 1 # 数量,必须与观演人数量一致 self.ticket_price: int = 180 # 目标票价档位item_id 是打开演出详情页后地址栏里 id= 后的那串数字,每个城市站对应不同值:
第三步:首次运行。
python Automatic_ticket_purchase.py # 默认账号密码登录 python Automatic_ticket_purchase.py --mode qr # 或扫码登录首次会弹出 Chrome 窗口完成登录,登录态保存到 cookies.pkl,之后运行就不再打开浏览器。
登录态是整条流水线的入口,拿到它之后,脚本进入真正的抢票决策环节。
它是怎么工作的:凭证缓存、状态轮询、接口签名三层
整个抢票流程可以拆成三层:凭证获取、抢票决策、订单提交,每层都对应一个可独立替换的模块。
第一层:凭证获取与缓存。Selenium 只出现在登录这一步。登录成功后抓取 cookies 存入 cookies.pkl,后续 check_login_status 通过请求个人信息页、比对页面标题是否为“我的大麦-个人信息”来验证凭证是否仍然有效。类比酒店入住:拿到房卡后不用每次走前台,卡失效了再重新办一次入住。
第二层:抢票状态机。DaMaiTicket.run 的核心是一个 while 轮询循环,不断查询目标价位的按钮状态,分支只有 4 种:
if ticket_sku_status == '即将开抢': continue # 未开售,继续轮询 elif ticket_sku_status == '缺货登记': return False # 已售空,终止 elif ticket_sku_status == '立即购买': submit_order_info = self.step2_click_buy_now(ex_params, buy_serial_number) break # 开售,进入下单像门铃一样:一直问“开售了吗”,回答“即将开抢”就继续按,回答“缺货登记”就挂电话,回答“立即购买”立刻冲进去。提交订单前,step3_submit_order 还会把填的观演人姓名和大麦后台的常用购票人做交叉校验,对不上直接报错退出:
第三层:接口参数生成与签名。前两层依赖的请求参数并不是写死的。tools.py 的 get_api_param 会实时拉取演出页的 JS 文件,用正则解析出两组下单必备参数,相当于“从餐厅内部系统里学会点暗号”,页面升级后暗号变了也能重新学。选座接口还多一道门槛:请求必须携带 sign 签名。signcode.js 是一个自包含的 MD5 变体算法,通过 execjs 引擎按时间戳每次现算一份签名,相当于“口令会随时变化的通行证”。
三层里任何一层断掉,脚本都会在明确的分支处停下并打印原因,这比黑盒工具更便于排查问题。
实测数据与适用边界:没有基准测试,状态分支表更诚实
本项目没有公开的基准测试或成功率数据,适用性要靠下面的状态分支表加 4 条已知局限来判断。
| 票档状态 | 脚本行为 | 说明 |
|---|---|---|
| 即将开抢 | 继续轮询 | 等待开售,循环不退出 |
| 立即购买 | 进入下单流程 | 核心抢票路径 |
| 选座购买 | 拉取座位列表自动选座 | V2.1 新增,不支持连坐 |
| 缺货登记 | 直接终止 | 该价位已售空 |
局限需要如实说明:README 明确写着“已停止维护,暂无更新计划”,且大部分购买方式已迁移至手机端,PC 端接口可能已失效;选座仅支持单一价位、不支持连坐,buy_nums 必须与观演人数一致;selenium 3.141.0 年代久远,新版 Chrome 与 Selenium 4 生态下元素定位 API 会直接报错;get_api_param 里写死了 vue-pc/0.0.70 的 JS 地址,站点 JS 一升级,正则解析就会失败。
还需要注意:源码的轮询循环没有 sleep,提前运行过久等于高频打接口,有触发风控的可能;账号登录遇到滑块需要人工介入。
边界说完,这个项目仍然有明确的高价值用途,下面按场景拆解。
落地场景与进阶调优:3 个高频用例
项目的价值集中在 3 个场景,前两个是功能场景,第三个是学习场景。
- 不选座抢票(演唱会)。填好 item_id 和票价档位,开售时脚本自动完成查询、下单、提交,人不用守在页面前。
- 选座抢票(话剧、体育)。通过带签名的 mtop 接口拉座位列表,按“楼层-排-列”顺序自动挑前 buy_nums 个可售座位,适合不在意具体座位只求有票的场景。
- 接口自动化学习样例。登录、JS 参数解析、签名生成、订单提交是一条完整链路,适合学习如何把一个网页流程改造成接口流程。
常见坑可以对照 3 项检查:
| 检查项 | 期望状态 | 异常时处理 |
|---|---|---|
| cookies.pkl | 文件存在且登录态有效 | 删除后重新运行,触发重新登录 |
| chromedriver | 版本与 Chrome 一致 | 浏览器白屏或崩溃,重下驱动并重命名 |
| 启动时机 | 开售前 1~2 分钟 | 过早启动等于高频轮询,风控风险上升 |
另有两条建议:开抢前先在页面核对 item_id 与观演人姓名,参数错配会直接报错退出;建议用 --mode qr 扫码登录,避免把账号密码明文留在代码里。若确实需要提前预热,建议在轮询循环里自行补一个 sleep,把请求频率降下来。
选型建议与展望
一句话结论:想学接口自动化、或以学习为目的验证 PC 端抢票链路的开发者值得读;需要持续维护、手机端购票或商业用途的团队,不建议使用。
这个项目的价值在于“代码极少、链路极全”:700 多行 Python 加一个 JS 签名文件,完整演示了“登录→选价位→填观演人→下单”这个网页全流程如何收敛成 3 次接口调用。其中 get_api_param 的 JS 动态参数解析和 signcode.js 的签名生成,是两个可以平移到其他同类站点上的动手点,也是普通爬虫教程里很少覆盖的部分。使用前请确认目标演出仍支持 PC 端购票,遵守平台条款;仓库定位是个人学习参考,把它当作一份可读的接口自动化教材,比当作生产工具更合适。
【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考