Chapter 6 node 开箱器操作指南
最早的 node 开箱器是玩家【powerless】在 2021 年编写的,但刚刚写成就遭遇到作者的削分身更新,基于旧版 md5.js 的开箱器不再适用。在长达两年的“大淡季”中名竞社区玩家稀少,既没有大量的开箱需求,也缺少逆向 md5.js 的技术力,node 开箱技术基本无人问津。
名竞重新进入旺季后,逆向工程领域重新得到关注,新版 node 开箱器的开发也被提上了玩家们的日程。第一款适配新版名竞的 node 开箱器于 2024 年第二季度被研制出来(实际上是完全重写),最早是作为便于自动化脚本调用的网页开箱替代品使用的。当年 9 月,各种 windows 浏览器在某次更新后被加上了严重的资源使用限制,导致传统开箱脚本无法正常运行,node 开箱器因此得到大范围推广,如今已成为玩家社区的绝对首选项。
虽然各种 node 开箱器的主程序和 js worker 脚本形态各异,但作为内核的 md5.js 是相同的。
本章将介绍几种 node 开箱器的使用方法和一些特性。
6.1 node-openbox
顾名思义,这是最早制得的新版 node 开箱器。初期版本的 node-openbox 使用 powershell 脚本作为主程序,只能单开测超评分。后来经过多线程改造,开箱器采取更加灵活的 c++ 程序进行顶层调度,可以自动多开,并添加了多种评分(基准化测试等)功能。
开箱器压缩包可在资源文件下载页获取。
输入和输出文件应当放在开箱器文件夹中(也就是和 node.exe
在同一个目录下)。输入文件名可以自定义,如 input.txt
等。
需要注意的是,由于调度程序的原理是通过 CLI 命令启动 Node.js 环境,无法对其进行实时控制(尤指输出的原子性),开箱时 worker 的输出被暂时存放在 out
目录下,每个子线程以追加形式写入对应的文件。这意味着,开箱完毕后你需要双击运行 merge_files.bat
,输入一个最终的输出文件名(如 output.txt
),进行开箱结果的汇总。
你需要在每次汇总收号之后清理 out
文件夹,否则会导致几次开箱的结果混在一起。几个 exe 文件的开头都放了清空 out
文件夹的选项,既是方便地进行清空,也有提醒的作用:
在开始前,是否需要清空 out 文件夹(0/1)
注:我会采用删除整个文件夹再创建这个文件夹的方式
输入 0 表示不清空,输入 1 表示清空。
另外,由于进行多线程的原理是将大文件拆成多个小文件存在 tmp
文件夹里再让 Node.js 去读取,你无法在一个 node-openbox
文件夹内同时运行多个 exe,如果强行尝试会出现较为严重的 bug。
js worker 直接以源码形式提供(如 cqp.js
),c++ 源代码在 src
目录中,可以自行编译或二次开发。
直接与 md5.js 接口交互的示例用法在 example.js
里。
接下来将逐个介绍各 exe 程序的功能和用法。
6.1.1 openbox.exe
这是官方评分开箱器。
输入类型(pp/pd/qp/qd/all,输入两个字母而不是第几个):
输入准确度:
all 是三个字母,不过无伤大雅。
前四个的输出格式都会是 <分数> <名字>
然后换行的形式,输入 all 则表示四个都测,然后先输出四个分数再输出名字。
准确度表示进行多少百场战斗然后算平均值,比如输入 100 表示一万场战斗,精确到四位有效数字,这个和测官方评分时的 100% 是一致的。
你输入的准确度可以不局限于 10 的幂次,比如 4 或者 30 之类的,但是不能是小数。
输入输出在文件中的阈值:
输入输出在屏幕上的阈值:
类型为 all
的时候,这个阈值指的是强评的阈值。
考虑到有些人是急急国王(比如开发者),很想在整个测号任务完整测完前就得知一部分强号的信息,提供了输出在屏幕上的阈值这一个东西。
开发者的建议是,你的这个阈值应当 >= 输出在文件中的阈值,毕竟设计出来只是为了方便你偷看一部分强号的数值的。
输入总号量:
输入输入文件名:
你需要键入你输入文件的总号量,以及输入文件的文件名,包含后缀(如.txt
),输出文件名并不会再这里输入,而是在 merge_files.bat
里输入!
输入文件内的输入格式为每个号结尾换行。
Q: 为什么这里需要输入总号量,但是 XP 和 convert 之类的就不需要?
A: 为了实现方便,解释起来比较复杂,不解释了。归根到底就是实现比较狂野且懒得改进。
你也可以输入 diy 格式的号进行评测。同时也可以输入多人组。
为了与 diy 格式兼容,多人组应当用 ++
连接。
是否将 task 完成情况的日志输出在文件中(0 表示输出在文件里,1 表示输出在屏幕上
是否将速度显示输出在文件中(0 表示输出在文件里,1 表示输出在屏幕上
输入你要开的线程数:
NUMBER_OF_WORKER_THREAD is XX
每个 task 的测号量:
每测多少个 task 计算一次 cur_speed
前两个类似 pbb,如果想要更方便地看速度的话建议都选 1。线程数按照你电脑的 CPU 来,也可以适当降一些。
每个 task 的测号量就自己定吧。不建议太大,会因为内存泄漏导致超过电脑内存限制从而闪退甚至重启。但是太低的话会在来回切换上耗费一定的时间从而浪费算力。
个人推荐批量测 100% 数值时的每个 task 测号量在 10~20 左右。
每测多少个 task 计算一次 cur_speed 推荐为线程数的整数倍,或者直接就是线程数即可,不然在前几批 task 会忽上忽下算不准确。
是否将过筛的号显示在屏幕上(0/1)
你可以选择关闭输出在屏幕上这一选项,不过这个本身可以在输出阈值的时候选择 10000 之类的来实现,这个只是以防万一。
6.1.2 cqp.exe
这里是超评分功能,包含 cqp/cqd。
只讲述和 openbox.exe 不一样的。
输入类型(1/2):
这个类型表示人数。1 表示 cqd,2 表示双人组 cqp。
二人组应当用 +
连接,一行一组。
每个 task 的测号量:
由于每个超评分需要测很多次胜率,这里的 task 要开得小一些。
推荐 1% 选 20-50,10% 选 3-5,100% 选 1-2。
是否将每一组的胜率显示在屏幕上(0/1)(强烈建议在多线程的时候不要使用!)
这个指的是,是否将对靶子里的每一个/每一组号的胜率都输出到屏幕上。若在多线程的时候使用会全部混在一起看不清,所以不要在多线程的时候使用。不过在单线程的时候使用可以让你更清楚的看到输入对各个类型的号/组合的胜率。
你也可以通过修改 cqp.js
将详细胜率直接输出到文件中,这样即使多开也不会混在一起。
修改靶子的方法:
在 cqp.js 中,在 if (team_size == X)
(X 为 1 或 2)的语句后,会有 target = [...]
的语句,如果想要修改靶子,改变里面的内容即可。具体的方法是,每个号/组合开头和结尾加引号,然后加逗号。
注意有些字符在代码里不应该直接输入(如引号、斜杠等),需要在前面加上转义字符(两个斜杠符号)。 不然会导致号无法被识别甚至报错的情况。
关于 diy:
有些情况下你可能想要测使用了 diy 的二人组,那你可以选择 diy-cqp.exe
。
输入的时候两个号都要用 diy 格式,中间用 ++
连接。
注意!!!使用了 diy 后的二人组不再会有加成!(多数情况下你本来的目的就是排除加成的影响,不是吗?)
6.1.3 pair.exe
这里是基准化评分功能。
程序自带的基准号可能过时,在开测前可以与玩家社区核对一下。
你应该采用 diy 格式输入,并用 ++
连接二人组!
输入类型(1/2/3),分别表示辅评(+背刺)、刺评(+辅助)、地评(+地裂):
字面意思,你的输入文件里应当只包含一种类型的号。
每个 task 的测号量:
由于每个基准化评分需要测很多个 cqp,task 要开得更小。
推荐 1% 选 10-20,10% 选 1-2。
是否将每一组的胜率显示在屏幕上(0/1)
在这里“每一组胜率”指的是每一个和基准号组合得到的 cqp。
6.1.4 priority.cmd
由于 windows 的某次神秘更新,优先级不调到“高于正常”的程序无法占用超过 50% 的 CPU(好像只对 Intel CPU 是这样的)。但是 node.exe
是即时创建和关闭的,因此没法手动一个个调优先级,而且本身也太繁琐了!
这是自动调优先级的脚本。
它大概会长成这个样子:
echo off
:loop
wmic process where "name='node.exe'" call setpriority 32768 >nul 2>&1
timeout /t 20 /nobreak >nul
goto loop
它的效果是每 20 秒扫描一遍正在运行的进程,然后把所有 node.exe
的优先级都调为“高于正常”。
可以修改第四行的 “20” 改变扫描的间隔。
你也可以自己创建一个这样的脚本,将这段代码存入一个 .txt
文件并改后缀名为 .cmd
,放到 node.exe
的上级目录,然后运行。
6.2 subproc-multithr
全称是 subprocess-multithreaded node openbox,使用 python subprocess 模块实现的自动多开开箱器。
优点是可以直接设定 node.exe 的优先级,内置了弱评等更多的靶子,以及方便的断点续传功能(如果开到一半突然关掉,下一次启动时可以选择继续开下去)。
缺点是没有经过大规模测试,可能出现 bug。
开箱器压缩包在论坛发布并更新。
压缩包内的 readme 写得很清楚,如果你已经会用 node-openbox,操作这个应该不是问题。
6.3 开箱小技巧
6.3.1 善用排序
要测的东西太多了,花的时间太长怎么办?你可以提前将你想要测的东西按照某些模型评分(比如虚评/丝评之类的)排序再开始测。测了一段时间后你觉得差不多了,再测下去也只是浪费时间,可以提前结束掉。
6.3.2 复制整个文件夹
之前说到,由于实现原因,你无法在同一个开箱器文件夹里运行多个程序,但是你可以将整个文件夹复制一份,然后在不同的文件夹内分别运行,这样就不冲突了。