开源了一个 Windows 脚本管理器「不忙脚本盒子」:桌面版篡改猴,多语言脚本声明式接入
开源 · 免费 · 无功能限制 · 无需登录 | 仅 Windows 10 / 11
如果你用过篡改猴(Tampermonkey)或 ScriptCat,这个项目一句话就能讲完:同一类东西,换了个宿主。
篡改猴管浏览器里的脚本。脚本装上,网页上就多出功能。不忙脚本盒子管 Windows 上的脚本。脚本装上,你的电脑上就多出功能:整理文件、批量压缩、格式转换、定时备份。
差别只有两点,但这两点决定了整个项目的技术形态。篡改猴跑在浏览器沙箱里,能碰到的东西止于网页;盒子跑在操作系统上,能碰文件和程序,所以它必须自己解决运行时、依赖和界面。
目录
- 1. 背景:脚本分发的最后一公里
- 2. 定位:同一品类,不同宿主
- 3. 机制一:声明式接入
- 4. 机制二:运行时与依赖自动部署
- 5. 机制三:参数声明驱动界面生成
- 6. 用户侧:触发方式与日常使用
- 7. 生态开放、许可与边界
- 8. 常见问题
1. 背景:脚本分发的最后一公里
写脚本和使用脚本是两件事。前者是开发问题,后者是分发问题。
浏览器脚本生态把分发问题解决得比较彻底:一个脚本文件、一段 metadata 头,点一下安装,篡改猴接管运行。用户不需要知道 JavaScript 引擎在哪,也不需要知道脚本怎么被注入。
桌面脚本没有这层基础设施。现实的断点在于:
- 运行环境要用户自己准备:Python / Node、pip / npm 依赖、ffmpeg 这类外部二进制;
- 交互只有命令行,参数靠手敲;
- 分发靠文件系统或 GitHub,没有统一的检索、安装、更新链路。
结果就是:会写脚本的人不需要工具,真正需要的人被挡在门外。 能写出脚本,不等于别人能用上脚本。
常见的应对方式是把脚本打包成独立程序。这条路能跑通,但代价落在四个地方:
- 体积:每个产物都要带一份完整运行时,常见几十 MB 到几百 MB,取决于打包方式和依赖;
- 重复:用户装五个脚本,机器上就有五份运行时,占用随数量线性增长;
- 管理:打包之后就是五个互不相干的程序,没有统一的安装、启动、更新入口;
- 开发成本:为了一个小功能,还要做界面、安装器、更新器、系统适配,顺带处理杀软误报。
把三条路线放在一起看,差别更清楚:
| 维度 | 打包成独立程序 | 统一插件 API | 脚本宿主 |
|---|---|---|---|
| 交付形态 | 一个脚本一个可执行文件 | 符合平台接口的插件 | 脚本 + 声明文件 |
| 多脚本占用 | 线性增长,运行时重复 | 低 | 一份共享运行时 + 各自依赖 |
| 统一管理 | 无 | 有 | 面板内统一管理 |
| 更新方式 | 重发整包 | 平台推送 | 按脚本更新 |
| 主要成本 | 开发者承担 | 生态改造 | 宿主承担运行时与界面 |
打包本身没有问题,问题在把脚本当软件分发的形态。不忙脚本盒子想补的,是另一条路:脚本保持脚本的样子,运行时、界面和分发由宿主接管。
2. 定位:同一品类,不同宿主
盒子把「环境 + 命令行 + 参数输入」从用户侧移走,把一份脚本变成可点击的工具。内核完全由脚本驱动,支持 Python、Node.js、PowerShell、BAT/CMD、AutoHotkey、HTML,以及编译好的 EXE。
和浏览器脚本管理器对照,结构差异很清楚:
| 篡改猴 / ScriptCat | 不忙脚本盒子 | |
|---|---|---|
| 宿主 | 浏览器 | Windows 10 / 11 |
| 脚本语言 | JavaScript | Python / Node.js / PowerShell / BAT / AutoHotkey / HTML / EXE |
| 能碰到什么 | 网页 DOM、网络请求 | 本地文件、程序、系统组件、外部二进制 |
| 生效方式 | @match / @include 匹配 URL |
右键、全局热键、超级复制、定时 |
| 界面 | 脚本自己实现 | 声明参数后由盒子渲染 |
| 运行时 | 浏览器自带 | 盒子自动部署并隔离 |
| 分发 | Greasy Fork / 脚本猫市场 | 内置脚本社区(GitHub 托管)+ Webhook 更新 |
所以它不在「一个入口接一堆能力」那条线上,也不是插件平台。它更接近一个系统级的 userscript 运行时:负责装、跑、管、更新,脚本本身仍然是脚本。
目前内置近百个现成工具,持续扩充。
3. 机制一:声明式接入
写过油猴脚本的话,bm-scripts-box-rc.toml 可以直接理解成 metadata 头:@name 在这里叫 name,@description 叫 desc,@match 换成了触发方式声明。有一处不同:@grant 没有对应物,因为盒子不做权限沙箱,这一点第 7 节会讲清楚。
接入不改脚本本体,只补一份声明文件,描述运行环境与入参。示意如下(字段以官方文档为准,完整规范见 https://www.bm-box.cn/help/api ):
# bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info] ## 脚本基本信息
id = "3aeabd2d-9ee9-4eaf-9cb3-24aa7f5668b9"
name = "脚本名称"
desc = "脚本描述"
version = "1.1.0"
icon = "./imgs/img.png"
[bmscriptsbox.runtime] ## 环境声明
language = "python"
language_version = ">=3.8"
entry = "main.py"
terminal = "always"
binaries = [{name = "pdfcpu"}]
[bmscriptsbox.triggers.context_menu] ## 声明支持右键触发
enabled = true
targets = ["files"]
filters = [".pdf"]
[bmscriptsbox.triggers.shortcut] ## 声明支持快捷键触发
enabled = true
input_type = "files"
filters = [".pdf"]
[[bmscriptsbox.inputs]]
name = "target_paths"
label = "PDF 文件"
type = "list"
exts = [".pdf"]
pick = "files"
description = "输入数据描述"
未声明的参数、未调整的代码逻辑都不受影响,对原脚本零侵入。社区脚本源码托管 GitHub,装到本地仍是源码形态,可审阅、可修改、可交给 AI 助手继续迭代。
把自己的脚本接进来(三步)
- 写声明:在脚本目录新建
bm-scripts-box-rc.toml(文件名固定),声明脚本名、语言与入口、触发方式(右键 / 快捷键 / 超级复制 / 定时)与参数,原脚本代码一行不改。 - 本地自测:把目录打成 zip(根目录直接放文件),在盒子「脚本管理 → 安装脚本」里选它;盒子自动下载对应语言的便携运行时、建虚拟环境装依赖。
- 发布社区:提交 GitHub 仓库地址即可发布到脚本社区;配好 Webhook 后,push 一次代码,社区版本自动更新。
一句话机制:盒子把「参数 JSON 文件路径」作为命令行第一个参数传给脚本,脚本读它、干活、退出。没有 SDK、不用 import、不用继承基类。
完整接入规范见开发文档:https://www.bm-box.cn/help/api
4. 机制二:运行时与依赖自动部署
浏览器脚本不用管运行时,因为浏览器就是运行时。桌面脚本没有这个前提,这是盒子必须补的第一块。安装脚本阶段自动完成:
- 运行时识别与安装(Python / Node 等);
- pip / npm 依赖安装;
- 外部二进制下载(ffmpeg、pandoc 等);
- 依赖隔离,避免脚本之间版本冲突。
需要说清楚的是:依赖隔离解决的是版本冲突,不是安全隔离。 每个脚本仍以本机用户权限运行,盒子不提供沙箱。这个边界在做技术选型时比在宣传时更重要。
对开发者的价值:脚本不再需要附带一长串「环境安装说明」。对用户的价值:装工具不需要先成为环境配置工程师。
5. 机制三:参数声明驱动界面生成
脚本声明了哪些参数,盒子就渲染出对应的图形化窗口(目录选择、数字输入、下拉、布尔开关等)。原本只有黑框命令行的脚本,启动后变成可填写的窗口,用户不接触命令行。
这一块在浏览器脚本里基本不需要:油猴脚本的交互写在网页 DOM 上,天然有界面。桌面脚本没有页面可以寄生,界面只能由宿主生成,所以参数声明必须是接入协议的一部分。

6. 用户侧:触发方式与日常使用
@match 解决的是「脚本什么时候生效」,答案是「URL 匹配上的时候」。桌面脚本没有 URL,盒子的答案是系统事件:
- 一键启动:点卡片即跑,也可以鼠标中键单击、双击 Ctrl 唤起;
- 系统右键:文件 / 文件夹 / 桌面右键唤起,路径自动带入;
- 自定义全局热键:给单个脚本绑专属快捷键;
- 超级复制:连按两次
Ctrl+C,携带选中文本运行,不操作就不弹窗; - 定时任务:一次性 / 每日 / 每周 / 每月。
围绕这些入口,日常使用还有三件事:
- 脚本社区:分类浏览、关键词搜索、安装量参考、一键安装;
- 自动更新:社区推送新版本,一键升级,无需重装;
- 可视化治理:安装、启动、管理、卸载如管理手机 App。
7. 生态开放、许可与边界
- 生态开放:盒子本身不托管任何脚本代码,只提供检索与安装服务;所有脚本库源码开源在 GitHub,脚本安装到本地也以源码形态运行,完全没有黑盒。
- 语言与框架不设限:不限定接入语言与接入框架,背靠 Python / Node.js / AutoHotkey / PowerShell 等庞大生态,现有优秀开源项目可低成本接入。开发者提交仓库地址即可发布脚本。
- 安全:数据默认本机处理、不上传;除安装脚本阶段外支持离线运行;源码可审计;依赖隔离防冲突,但不提供权限沙箱。
- 许可:MIT + Commons Clause。个人与组织内部免费使用;商业用途(售卖、打包收费、对外收费服务等)需经作者书面授权;禁止拿源码卖钱或二次分发。
- 边界:仅支持 Windows 10 / 11;不操作网页,不与浏览器脚本生态互通;盒子是运行与分发的那一层,不替代脚本本身质量,社区脚本质量取决于各作者,安装前建议看源码。
8. 常见问题
Q:和篡改猴比,盒子是不是权限太大?
是,这是品类决定的,不需要回避。篡改猴的活动范围限于浏览器,能碰的主要是网页 DOM 和网络请求;盒子要操作文件,就必须拿到文件权限,两者不在一个权限模型上。盒子的做法是把风险放到可见处:脚本以源码形态落盘,装之前可以逐行看;社区脚本托管在 GitHub,有提交历史;盒子不托管、不加密、不打包脚本。它不提供沙箱,也不假装提供。
Q:和篡改猴 / ScriptCat 是什么关系?
同品类,不同宿主。它们解决浏览器脚本的装载与运行,盒子解决桌面脚本的装载、运行、依赖和分发。脚本不能互相通用。
Q:需要用户自己装 Python / Node 吗?
不需要,安装阶段自动准备运行时与依赖。
Q:必须改写脚本吗?
不必,补一份 TOML 声明即可,零侵入。
Q:脚本会黑盒运行吗?
不会,社区脚本与本地安装均为源码形态,可自行审阅。
结语
盒子想解决的,是脚本从「能跑」到「别人能用」的最后一公里。浏览器那边这层基础设施早就有了,桌面这边一直是空的。
如果你手头有补一份声明就能接进来的脚本,欢迎提交社区;项目也欢迎 Star 与反馈。
浙公网安备 33010602011771号