ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

为什么不让 Selenium 点到底?大麦抢票脚本 Automatic_ticket_purchase.py 拆解:只让浏览器干一件事的 300 余行设计

为什么不让 Selenium 点到底?大麦抢票脚本 Automatic_ticket_purchase.py 拆解:只让浏览器干一件事的 300 余行设计 为什么不让 Selenium 点到底大麦抢票脚本 Automatic_ticket_purchase.py 拆解只让浏览器干一件事的 300 余行设计【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase模拟鼠标点击抢票速度永远赢不过真实用户。大麦抢票脚本 Automatic_ticket_purchase 的核心文件 Automatic_ticket_purchase.py 用纯 HTTP 请求替代了整条购买链路只给浏览器留了一件任务一次性登录。一、定位它是什么、怎么被调用这是个无框架、无配置文件的单入口 CLI 脚本全部路由只是一个 argparse 参数。Automatic_ticket_purchase.py 的__main__直接实例化DaMaiTicket()并调用run()调用方式见 README.mdpython Automatic_ticket_purchase.py # 账号/密码登录 python Automatic_ticket_purchase.py --mode qr # 扫码登录脚本的元数据是构造函数里的参数摘录关键字段Automatic_ticket_purchase.pyself.item_id: int 610820299671 # 商品id self.viewer: list [viewer1] # 在大麦网已填写的观影人 self.buy_nums: int 1 # 购买影票数量, 需与观影人数量一致 self.ticket_price: int 180 # 购买指定票价逐字段看设计意图item_id 脚本唯一的目标坐标。原文写着『item_id根据地区来确定,每一个城市对应不同的item_id』README.md意思就是大麦商品页地址栏里的那个id参数见下图viewer 不是任意姓名必须与在大麦网提前登记的购票人一致脚本提交前会逐项比对服务端返回的列表Automatic_ticket_purchase.py。buy_nums 数量run()开头强制与len(viewer)相等不等立即返回Automatic_ticket_purchase.py。ticket_price 一参两用在 step1 里从skuList匹配skuIdAutomatic_ticket_purchase.py选座链路里再按它过滤价位Automatic_ticket_purchase.py。构造函数里的login_id/login_passwordAutomatic_ticket_purchase.py 占位默认值仅在 account 登录模式下被填入 selenium 表单tools.py。仓库四个文件的分工DaMaiTicket类是主流程tools.py 是登录、cookie、取参、签名、选座的功能库signcode.js 是接口签名算法requirements.txt 只有 4 个依赖requests、selenium、beautifulsoup4、pyexecjs。知道了怎么调用只是入口更重要的是它画了哪条能力线——这条线由 V2.0 的改造说明定下。二、边界管什么、不管什么V2.0 的设计线写在 README.md『之前的版本通过按钮操作还要等待页面元素加载效率低下。此版本仅需登录时用到页面……其余操作均通过 requests 进行请求』。意思是浏览器从主角降级为登录守门员换来的是功能范围被明确划线。管什么4 件事登录selenium 打开登录页account / qr 两种模式tools.py取参与签名从线上 JS 刮 API 参数本地生成 signtools.py状态轮询反复请求商品接口直到按钮状态变为立即购买Automatic_ticket_purchase.py提交订单POST createOrder 接口成功后打印支付宝订单号Automatic_ticket_purchase.py。不管什么负向边界不支持连坐购买选座仅支持单一价位README.md 写明『暂时只支持抢购指定价格下的座位且暂不支持连坐购买』pick_seat按迭代顺序取前 N 个座位即返回没有任何相邻判定逻辑tools.pycreateOrder 没有重试单次 POST按结果直接结束不做并发提交只复刻 PC Web 接口移动端链路不覆盖——README.md 已声明『大部分购买方式已迁移至手机端需配合抓包处理。暂无更新计划』。主循环的核心分支就是按钮文案btnText的 4 态状态机脚本对每种状态行为不同按钮状态 (btnText)含义脚本行为位置即将开抢未开售continue继续轮询L256-L257立即购买正常开售进入orderConfirm后breakL261-L264选座购买需先选座拉座位 JSON → 选座 → 提交L265-L302缺货登记已售罄打印手慢了并退出L258-L260范围确定之后剩下的问题只有一个触发之后这 7 步按什么顺序运转。三、机制数据入口与执行顺序脚本的数据全部来自 4 类入口每类的拆包方式不同输入类型对应数据入口可回答范围易错提醒item_id 请求参数detail.damai.cn/subpageskuList、按钮状态响应被null(...)/__jp0(...)包裹须剥壳再json.loadsL58-L59exParams buyParambuy.damai.cn/orderConfirmwindow.__INIT_DATA__订单数据须剥掉前缀window.__INIT_DATA__ 与结尾分号L103-L106h5_token 时间戳 api_parammtop.damai.cn 座位系列接口standId、座位价格、可售座位sign 是tokentimestamp12574478params的本地 MD5token 取自_m_h5_tkcookietools.pyresourcesPath stand_id.jsonseatsvc 资源地址全场座位清单带签名拉取后还要按 price_id 与可售状态二次过滤L272-L297完整流程 7 步参数自检len(viewer) ! buy_nums直接返回L228-L230三级登录cookies.pkl存在则直接回放否则按args.mode走 selenium 账号登录或扫码L231-L237主动验证登录带 cookie 请求passport.damai.cn/accountinfo/myinfo页面标题等于我的大麦-个人信息才算登录成功tools.py验证通过且本地无缓存则 pickle 落盘L244-L245动态取参get_api_param()抓取线上 JSvue-pc/0.0.70用两组正则抽出commodity_param与ex_paramstools.py轮询GETdetail.damai.cn/subpage按ticket_price匹配skuId读btnText决定分支L253-L257两条购买路径普通票走step2_click_buy_nowbuyParam按固定约定拼成item_id_buy_nums_sku_idL262-L263选座票先取standId、拉全场座位 JSON经format_valuable_seatid过滤、pick_seat选座L267-L299提交step3_submit_order比对观演人、置isUsed、选座时逐一写seatIdPOSTbuy.damai.cn/multi/trans/createOrder成功则打印alipayOrderId与支付链接L190-L225。优先级关系很明确cookie 回放是首选路径省去 selenium 启动与反自动化对抗selenium 登录是兜底接口结构变化时脚本不盲目重试而是把现场交给使用者——打印原始响应后退出。如果不把参数做成动态刮取大麦一升级 JS 版本脚本会静默失败且无从查起。顺路跑通的流程之外真正决定这类脚本能不能用的是每一步出错时的行为。四、护栏抓取失败与信息过时怎么办脚本没有异常重试框架但每个失败点都有显式的退出条件和人话提示cookie 回放后验证不过『登录失败, 请检查登录账号信息。若使用保存的cookies则删除cookies文件重新尝试』L241-L243——这一条的设计意图是把提示直接指向最可能的故障源本地缓存的 cookies 过期而不是笼统的登录失败selenium 流程走完后仍用接口复核标题不符则打印『登录异常请检查页面登录提示信息』tools.py——原文写着标题必须等于damai_title才继续意思是页面看起来过了与真的过了分开判定防止假阳性放行__INIT_DATA__解析失败『获取购买必备参数异常请重新解析response返回的参数』随后把原始响应完整打印L108-L111)——解析失败就把现场交给使用者接口变更从此是 5 分钟的定位问题而不是盲查观演人不匹配『请检查输入的观演人信息与大麦网观演人信息是否一致』L196-L198——与服务端实际返回的名单逐项比对一个字的错别名不会浪费一次 createOrder 请求售罄『手慢了该票价已经售空』L258-L260——缺货登记是终态立即退出不继续轮询登录前主动去掉自动化指纹excludeSwitches: [enable-automation]加--disable-blink-featuresAutomationControlledtools.py注释直说『若关闭会导致出现滑块并无法进入』——这一条的设计意图是把登录页识别 selenium 的门槛挡在流程之外。这些护栏背后是同一件事出错时把现场完整交给使用者并快速退出。能搬走的是下面这组通用模式。五、启示可以搬走的 5 条设计模式接口优先HTTP over UI只在接口替代不了的环节登录保留 UI 自动化。可迁移做法写自动化前先抓包目标页面的点击实际发出哪些请求用 requests 复刻selenium 只留给登录与滑块。cookie 持久化 轻量探针cookie pickle 落盘tools.py每次运行先做一个最轻的带认证 GET 验证会话是否有效tools.py。可迁移做法任何长任务自动化进入主流程前先用最轻认证请求验证会话别让过期会话跑完全程才发现。动态取参代替硬编码原文写着『可能大麦网js代码更新后需要修改此函数内的代码以重新获得参数信息』tools.py意思是把维护成本直接写进函数注释里而不是藏起来。可迁移做法可能会变的参数结构写成抓取代码并在 docstring 标注参数来源与失效条件。原样搬走站点签名函数signcode.js是标准 MD5 的纯 JS 实现初始向量1732584193等常量见 signcode.js拼接h5_tokentimestamp12574478params后由execjs调用原函数名calcaulate执行tools.py。可迁移做法接口要求 sign 时先看前端 JS 里是否就是标准算法是就搬函数、用 JS 引擎本地跑不自己重写也不逆向猜。轮询状态机穷举终态while True主循环显式枚举 4 种按钮状态每种都有 continue / break / 退出L252-L302。可迁移做法写轮询前先穷举所有可能状态并逐个写出口缺货登记这类终态分支不能被默认分支吞掉。阅读入口主文件Automatic_ticket_purchase.py登录 → 轮询 → 提交主流程调用方式与参数说明README.md登录、签名、选座辅助函数tools.py签名算法纯 JS 实现的 MD5signcode.js依赖清单共 4 个requirements.txt以上结论仅基于本仓库 V2.1.0 的代码与 READMEREADME.md 已声明已停止维护线上 JS 版本vue-pc/0.0.70与 mtop 接口结构会随时间变化脚本中的取参与解析逻辑在后续版本中可能失效请以运行时的实际代码与接口行为为准。【免费下载链接】Automatic_ticket_purchase大麦网抢票脚本项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表