Back to projects
Mar 22, 2026
2 min read

BatchMortal: 绕过cf盾,实现雀魂牌谱批量提交分析

一款基于 API 请求与浏览器自动化技术的雀魂麻将牌谱批量分析工具。通过自动化流水线替代繁琐的人工作业,实现从对局数据拉取、全自动绕过人机验证提交分析,到生成数据可视化报告的一站式闭环。项目开源后在玩家社区内取得了积极反响并切实帮助了玩家群体。

BatchMortal:绕过cf盾,实现雀魂牌谱批量提交分析的项目说明待补充。

我构建了

  • 获取玩家记录
  • 构造牌谱 URL
  • 自动提交分析
  • 等待并提取结果
  • 持久化保存结果
  • 生成可视化报告

模块划分

  • main.py:主入口,负责参数解析、任务组织和流程调度
  • batchmortal/api.py:负责玩家搜索、记录拉取和牌谱 URL 构造
  • batchmortal/browser.py:负责浏览器自动化、提交协调、失败恢复
  • batchmortal/results.py:负责结果写入、去重和已处理任务识别
  • batchmortal/visualize.py:负责图表和报告生成

亮点

1. 做通了完整链路

项目将一整条手工流程完全打通:

  1. 查玩家
  2. 拉牌谱
  3. 打开分析网站
  4. 提交分析
  5. 等待结果
  6. 保存结果
  7. 输出报表

2. 重点解决了

项目把精力集中在了最现实的问题上:

  • Cloudflare Turnstile 验证
  • 提交节奏控制
  • 浏览器页面失效
  • token 超时与拒绝
  • 远端站点限流
  • 重试与冷却策略

3. 数据的结构化处理

  • 牌谱链接
  • 模式
  • 开始结束时间
  • rating
  • AI 一致率
  • 温度
  • 对局长度
  • 玩家 ID
  • 审查耗时
  • 结果截图路径

设计考虑

1. 稳定性优先

项目提供了 3 种运行模式:

  • 默认模式:单窗口串行,最稳
  • --prewarm-standby:实验性的双窗口轮转
  • --unsafe-parallel-review:高风险并发,不推荐

默认模式即自然思路单窗口串行运行,运行若干示例数据发现,每两个任务间有较大的空档期,因此考虑了线程池加速技术。而cf的验证策略是根据系统ip来的,对于单ip系统代理而言多线程反而降低了其自然访问验证速度,推荐搭配代理池使用(作者也没有用过/(ㄒoㄒ)/~~), 而后研制出了单系统代理目前最优解:开2个窗口,串行运行但将静默资源消耗放在后台运行:A 窗口运行完毕后,返回分析页,立刻切换到 B 窗口,此时 B 窗口的验证已过,只需要消耗数十毫秒的表单填写时间即可。

()🙏升天🙏()

2. 重复执行成本

项目考虑了重复运行成本:

考虑了批量场景和重跑成本:

  • 读取已有结果文件
  • 根据 UUID 识别已完成任务
  • 跳过已成功处理的牌谱
  • 避免重复写入

3. 考虑了部署与使用门槛

项目提供了配置模板(yaml/toml),并支持配置文件覆盖命令行参数。对于经常重复使用的人来说,这点设计显然更加人性化^^。

同时,项目还加入了 uc_driver 自动安装逻辑,减少了 SeleniumBase 环境准备的摩擦。

我做了

已完成

  • 支持通过玩家昵称搜索账号
  • 支持直接使用 account_id
  • 支持根据账号拉取多种 mode 的对局记录
  • 自动构造雀魂牌谱 URL
  • 自动打开 Mortal 分析页面
  • 自动填写表单并提交分析
  • 处理 Turnstile token 等待与恢复
  • 检测 captcha/token 被拒绝的情况
  • 检测 rate limit 和提交失败
  • 支持失败重试
  • 支持浏览器异常后的恢复
  • 支持代理和 headless 模式
  • 支持 csvxlsx 输出
  • 支持批量写入优化
  • 支持跳过已经处理过的 UUID
  • 支持记录开始结束时间等元数据
  • 支持保存结果截图
  • 支持 YAML/TOML 配置文件
  • 支持生成 HTML 图表
  • 支持生成 PNG 报告截图
  • 将项目重构为包结构,提升可维护性

尚未完全展开

  • 增加常见昵称与 account_id 的映射词典
  • 继续补充 issue 中的真实需求
  • 提升测试覆盖率
  • 继续打磨稳定性与使用体验

项目的意义

确实帮到了一些人

我也爽😀

Why It Matters

  • TODO