batchmortal 是一个基于 Python 和 SeleniumBase 的批量牌谱分析脚本。它会从 amae-koromo 拉取雀魂对局记录,再自动打开 mjai.ekyu.moe 提交牌谱、等待分析完成,并把结果导出为 xlsx 或 csv。
- Python 3.8+
- Google Chrome
- 可访问目标站点的网络环境
安装依赖:
git clone https://github.com/myouo/batchmortal.git cd batchmortal pip install -r requirements.txtpython main.py -p <玩家昵称> [选项] # 或者 python main.py -a <数字账号ID> [选项]你可以通过配置文件来简化命令行输入。在项目根目录下创建一个 config.yaml 或 config.toml 文件(或参考 config.default.yaml)。
示例 config.yaml:
nickname: "言乾" limit: 10 modes: "12" headless: true save_screenshot: true output: "xlsx"带配置文件的运行方式:
python main.py(你也可以通过 python main.py --config my_config.yaml 手动指定配置文件位置。命令行传入的参数会覆盖配置文件中的同名设置。)
常见示例(不使用配置文件):
python main.py -p 言乾 --modes 12 --limit 1 --headless --save-screenshot --output xlsx| 参数 | 默认值 | 说明 |
|---|---|---|
-p, --player | 无 | 目标雀魂玩家昵称(必须提供 -p 或 -a) |
-a, --account-id | 无 | 直接指定玩家数字账号 ID。当与 -p 同时提供时,实际拉取以 -a 为准,但程序的目标名称仍沿用 -p 提供的昵称。若仅提供 -a,程序会通过 API 尝试获取真实昵称。 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--limit | 10 | 每个 mode 最多拉取多少条记录 |
--modes | 9 | 逗号分隔的 mode 列表,例如 9(四人金南),12(四人玉南),16(四人王座南) |
--model-tag | 4.1b | Mortal 分析模型版本 |
--retry | 3 | 失败条目的重试次数。每次重试都会重新打开分析页并重新提交 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--headless | False | 后台无界面运行浏览器(强烈推荐) |
--proxy | 系统代理 | 指定浏览器代理;不传时尝试自动读取系统代理 |
| 参数 | 默认值 | 说明 |
|---|---|---|
--output | xlsx | 导出格式,可选 xlsx 或 csv(默认xlsx) |
--plot | none | 生成折线图:none, html, png, 或 both。默认不生成 |
--save-screenshot | False | 保存分析结果页面截图(举报时可用) |
| 参数 | 默认值 | 说明 |
|---|---|---|
--unsafe-parallel-review | False | 允许并发提交 review。理论上更快,但在单代理环境下通常易失败(已弃用,不推荐) |
--submit-interval | 6 | 受控模式下,两次提交之间的最小间隔秒数(已弃用,不推荐) |
--submit-cooldown | 30 | 受控模式下,连续失败后的冷却秒数(已弃用,不推荐) |
--prewarm-standby | False | 实验功能。使用两个持久窗口轮流接力,每次只让当前焦点窗口完整处理一条任务(推荐尝试) |
| 参数 | 默认值 | 说明 |
|---|---|---|
--config | 无 | 指定配置文件路径(支持 yaml/toml),命令行参数会覆盖配置项 |
--dry-run | False | 只拉取并打印牌谱 URL,不启动浏览器 |
--no-manual-verification | False | 兼容旧脚本保留参数,当前无作用(已弃用) |
--flare-url | 无 | 兼容旧脚本保留参数,当前无作用(已弃用) |
- 默认模式:单窗口串行,当前最稳。
--prewarm-standby:实验功能。现在表示“双窗口轮转”,不是后台抢跑预热;在单代理环境下不保证比默认串行更快,但值得一试。--unsafe-parallel-review:不推荐在单系统代理环境下使用,通常会增加 Cloudflare/Turnstile 等待和失败率。
推荐先从默认模式开始:
python main.py -p 言乾 --limit 10 --modes 16 --headless如果你要测试实验性的双窗口轮转:
注意:这是实验路径,建议只在你已经拿到默认串行基线后再做对比测试。
python main.py -p 言乾 --limit 10 --modes 16 --headless --prewarm-standby使用 --plot html 或 both 将会在产出数据后调用底层的可视化引擎生成 report_<nickname>.html。
示例:
python main.py -p "main()" --limit 20 --modes 16 --headless --retry 3 --prewarm-standby --save-screenshot --plot both结果默认写入:
results/<nickname>/ 常见产物包括:
results/<nickname>/results.xlsx或results/<nickname>/results.csvresults/<nickname>/mode_<id>/<uuid>.pngresults/<nickname>/mode_<id>/<uuid>_error.png
运行日志会在每条输出前附带当前系统时间,便于定位慢点和错误发生时刻。
xlsx写入逻辑已做批量化优化,但整体耗时通常主要由浏览器提交、Cloudflare Turnstile 和远端分析生成决定。- 在只有一个系统代理的情况下,多窗口或多线程通常不会线性提速。
- 计划增加常见 id 与
match_id的对应词典,以满足大家喜爱的主播/牌手改名而自己不愿意去翻的情景,如:{"火龙果说电影" : "8888621"}(主播名称与account_id的对应) 以便大家使用。 - anything in issue...?
MIT
