资讯动态

写好一个自动化抢票脚本要跨几道坎?大麦抢票项目 Automatic_ticket_purchase 的实践解读

发布时间:2026/10/15 3:16:21 来源:尧图企业网站定制
写好一个自动化抢票脚本要跨几道坎大麦抢票项目 Automatic_ticket_purchase 的实践解读【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchaseAutomatic_ticket_purchase 是一个基于 Python 的大麦网自动化抢票工具Selenium 只负责登录其余全部走接口请求覆盖登录态维护、购票接口参数构造、订单提交三个环节。想研究抢票脚本怎么写的同学这是一个麻雀虽小五脏俱全的样本。这个项目解决什么问题把流程从屏幕挪到请求层在页面上手动点立即购买热门场次几乎没有胜算——页面加载、验证、点击全都在毫秒级赛跑而热门票源的库存往往几秒内见底。这个项目的思路是把进详情页→看票价→确认订单→提交整条链路从浏览器屏幕挪到请求层浏览器只在登录那一步出现之后的请求全部由代码直接构造。整个仓库只有 4 个核心文件能力覆盖如下登录与会话支持账号密码和扫码--mode qr两种方式cookies 落盘后跨次运行复用参数构造解析前端 JS 包拿到 SKU 查询和确认订单所需的参数再用本地 JS 文件为 mtop 接口生成签名购买执行立即购买轮询和选座购买两条路径V2.1 新增后者成功后打印支付宝支付链接结果校验购票人数量必须与票数一致姓名必须与大麦账户里已填的购票人完全相同先泼一盆冷水README 开头就写明已停止维护。项目写于 2022 年大麦的购买流程后来大幅迁向手机端。把它当作票务接口逆向的学习样本来读比当成开箱即用的工具更合适。三个文件怎么分工一条数据流转链路主控制器 DaMaiTicket 是全项目唯一的类相当于总调度DaMaiTicket持有账号密码、item_id、购票人列表、票数、目标票价五项配置按step1查 SKU、step2确认订单、step3提交订单三步执行run()是入口方法负责登录、轮询和选座分支的分发。工具函数库七个函数覆盖四类能力——cookies 存取save_cookies/load_cookiespickle 落盘、Selenium 登录account_login、登录态校验check_login_status、参数提取与签名get_api_param、get_sign_code外加选座分支的四个 mtop 接口封装。signcode.js一份纯 JS 的 MD5 实现函数名拼写为calcaulate签名时由execjs加载执行。数据流一句话概括__init__里的配置先交给get_api_param()取出两套请求参数随后run()串联三个接口createOrder的响应决定成败。跟着一张票走完全流程登录 → 参数 → 下单登录态怎么保持两次校验加一个同步细节大麦登录页托管在阿里 passport 体系下登录表单嵌在 iframe 里且会识别 Selenium 痕迹触发滑块。account_login()的处理分三步创建 ChromeOptions 时加上excludeSwitches: [enable-automation]和--disable-blink-featuresAutomationControlled目的是隐藏navigator.webdriver标记然后switch_to.frame(alibaba-login-box)切入内层框架填入账号密码回车扫码模式则等待页面标题变化超时 180 秒最后把浏览器里的 cookies 全部抓进一个字典。拿到 cookies 不直接信还要过check_login_status()一关带 cookies 请求passport.damai.cn/accountinfo/myinfo个人信息页用 BeautifulSoup 取页面标题等于我的大麦-个人信息才算有效。有效后save_cookies()将其 pickle 成cookies.pkl下次run()优先读文件文件缺失才重新走浏览器登录。还有一个容易漏看的细节step2_click_buy_now每次请求完成后都有一行self.login_cookies.update(self.session.cookies)。订单页的 cookie 会被服务器动态下发必须合并回供下一次请求使用的字典里否则提交订单会失败。requests.Session和 cookie 字典两个载体每次请求后要手动双向同步。服务端认的参数怎么生成JS 解析加 MD5 签名整个流程的起点是item_id——演出详情页 URL 里的 id 参数每个场次、每个城市各有一个服务端要的参数分两类都由tools.py里的函数负责。第一类靠解析前端 JS。get_api_param()从 g.alicdn.com 拉取 vue-pc 的 JS 包用两组正则提取commodity_paramdetail.damai.cn/subpage查 SKU 所需参数和ex_params点立即购买所需参数。这一步相当于把前端写死的请求体抠出来变成动态模板。原作者在 docstring 里也留了话大麦 JS 更新后这个函数里的正则要跟着改。第二类是 mtop 接口签名。选座分支走mtop.damai.cn请求里的sign用经典算法生成取_m_h5_tkcookie 的第一段h5_token、毫秒时间戳、appKey12574478、业务参数 JSON拼接后做 MD5。项目没有用 Python 重写算法而是让execjs直接执行 signcode.js 里的calcaulate()h5_token cookies.get(_m_h5_tk).split(_)[0] # 从cookie里取token段 time_stamp int(datetime.now().timestamp() * 1000) raw {}{}12574478.format(h5_token, time_stamp) api_param sign js_exec.call(calcaulate, raw) # MD5与前端结果一致响应解析也有两个小坑subpage接口返回的是 JSONP要剥掉null(或__jp0(前缀和结尾的)再json.loads确认订单页把数据塞在window.__INIT_DATA__变量里step2用正则抓出这段 JS 再解析。请求发出去之后按钮文本轮询与三段式下单参数齐了不等于能买热门票是整点放票run()先进入轮询循环等按钮亮起while True: # 轮询到开抢为止 ticket_info, seq, sku_id self.step1_get_order_info( self.item_id, commodity_param, ticket_priceself.ticket_price) btn_text ticket_info[skuPagePcBuyBtn][skuBtnList][seq][btnText] if btn_text 即将开抢: # 未开售继续等 continue elif btn_text 立即购买: # 已开售进入下单 break本质是把按钮文本当状态用即将开抢继续等缺货登记说明售罄直接退出立即购买走买流程选座购买走选座分支。传给step2的buyParam是item_id_票数_skuId拼成的字符串。每一步请求都带了完整的 Chrome 桌面请求头authority、sec-ch-ua、referer、user-agent一个不少其中referer与真实页面的跳转路径对齐详情页→订单页→提交。step3_submit_order提交前做最后一道校验在订单数据里找到dmViewerPC_xxx字段把服务端返回的购票人列表dmViewerList与用户填的viewer逐一比对全部命中才把要买的人标上isUsedTrue选座场次再按序写入seatId然后POST到buy.damai.cn/multi/trans/createOrder。响应里出现success和alipayOrderId即抢票成功程序打印支付链接。选座分支则按顺序串了四个 mtop 接口取cityId/projectId/performId→ 取standId与价格列表 → 取座位区域 JSON 地址 → 查询可售座位最后pick_seat()从可售座位里按顺序摘buy_nums个不支持连坐。这条分支代码最长但不改变整体骨架。值得展开的两个设计点cookie 的双向同步加磁盘缓存。这个项目里 cookies 同时存在于两处requests.Session内部和login_cookies字典。前者服务同一步骤内的请求后者跨步骤共享并持久化到磁盘。两者默认互不同步全靠代码手动update()。字典为主、session 为镜是 Selenium 登录转 requests 请求时常见的处理方式很多抢票脚本死在订单环节往往就漏了这一步。签名交给 JS 执行而不是 Python 重写。signcode.js里的 64 轮压缩是标准 MD5 实现手工翻译成 Python 可行但验证成本高。execjs直接加载 JS 文件调用保证签名结果与前端逐字节一致。代价是绑死了一条依赖链get_api_param()解析的 JS 包和signcode.js都会在前端版本升级时失效——这也是项目停止维护的根源。接口逆向类项目的脆弱性就在这里且无法在代码内部解决。另外两点一笔带过这里的状态机只是按钮文本的四分支判断不是完整 FSM失败处理也只到打印报错后退出为止仓库里没有自动重试和限频逻辑别按生产工具的预期去用它。上手要点与避坑提醒⚠️ 运行前先摆正四件事。环境侧pip install -r requirements.txt装四个依赖Selenium 需要一个配套的 ChromeDriver代码按系统定位驱动文件重命名为chromedriver_linux/chromedriver_windows/chromedriver_mac后放进项目根目录即可。配置侧改DaMaiTicket.__init__里的五项self.item_id: int 610820299671 # 商品id每场次每城市唯一 self.viewer: list [viewer1] # 须与常用购票人中的姓名一致 self.buy_nums: int 1 # 购票数量 self.ticket_price: int 180 # 目标票价buy_nums必须等于len(viewer)否则run()开头就拦截退出viewer的姓名要和大麦账户里常用购票人逐字一致step3会逐一校验入口只有两条命令python Automatic_ticket_purchase.py走账号密码登录加--mode qr走扫码本地存在cookies.pkl时直接复用不再开浏览器。其余坑位item_id不通用多城巡演要逐个从详情页 URL 里取大麦前端 JS 一变先检查get_api_param()的正则项目已停止维护且流程迁移到手机端想实际跑通需要自行抓移动端包改接口。合规上多说一句仓库是 MIT 协议明确仅供个人学习高频轮询本身对服务器有压力不要把它扩展成倒票行为。这个项目的价值不在于今天还能不能抢到票——流程已经变了——而在于它展示了一套完整做法从 JS 里逆向参数、用 JS 原版算法签名、用按钮文本驱动流程、用字典加 pickle 固化 cookies。下次大麦改版时要修的是正则和 JS 文件三段式请求的骨架依然可以照着搭。【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑