脚本健康度看板 (Script Health Dashboard)
📊 脚本健康度看板 (ScriptCat Health Dashboard)
基于 ScriptCat 后台脚本能力开发的浏览器插件,自动监控所有已安装脚本的运行状态,计算健康度评分,并通过可视化看板直观展示。
🔗 项目主页:https://github.com/ying34447/Script-Health-Dashboard
📋 目录
项目简介
脚本健康度看板 是一个运行在 ScriptCat 脚本管理器上的后台插件脚本。 它解决了脚本猫用户在安装多个脚本后的统一监控难题:哪个脚本在悄悄报错?哪个脚本长期未执行?哪个脚本性能堪忧?哪个脚本有新版本可更新?
本看板采用 "反向注册" 策略 —— 其他脚本主动向本看板写入自己的运行统计数据,本看板通过 GM_listValues 遍历读取并汇总展示,无需侵入式地访问脚本猫内部 API。
核心功能
🚀 1. 数据采集
- 通过
GM_listValues遍历存储,自动识别所有已上报统计数据的脚本 - 单脚本数据损坏时自动隔离异常,不影响其他脚本采集
- 支持数据字段完整性校验与向前兼容迁移
🧮 2. 健康度评分引擎
- 基于成功率、最近执行时间、平均耗时、版本状态 4 个维度综合评分(0-100 分)
- 评分自动映射到健康等级:🟢 健康(≥80)/ 🟡 警告(50-80)/ 🔴 严重(<50)
- 详尽的扣分明细,看板中可追溯每一分的扣减原因
⏰ 3. 定时巡检与告警
- 每小时自动执行健康检查(基于
@crontab后台任务) - 发现严重脚本时触发浏览器桌面通知
- 同一脚本 1 小时内不重复告警(防止刷屏)
- 告警阈值可配置:仅严重 / 警告及以上
📊 4. 可视化看板
- 暗色主题仪表盘,卡片式布局,响应式设计
- 统计卡片区:总脚本数、健康数、警告数、严重数、异常数
- CSS 圆环图:直观展示健康/警告/严重比例
- 脚本详情表格:含健康度分数进度条与状态标签
- Canvas 趋势折线图:最近 30 次检查的健康度变化
🔄 5. 版本更新检测
- 通过
GM_xmlhttpRequest请求脚本的updateURL - 解析远程元数据
@version字段,语义化版本对比 - 检测结果缓存 24 小时,避免频繁请求
- 看板表格中标记"可更新"徽章
📈 6. 历史趋势记录
- 每次健康检查后追加一条历史记录
- 最多保留 100 条,超出自动删除最旧记录
- 趋势图展示最近 30 条记录的健康/警告/严重数量变化
适用人群
| 👤 用户类型 | 💡 使用场景 |
|---|---|
| 脚本猫深度用户 | 安装了多个脚本,希望统一监控运行状态,快速发现异常脚本 |
| 脚本开发者 | 希望监控自己脚本的稳定性、成功率、执行耗时,优化脚本质量 |
| 企业/团队用户 | 部署了一批关键业务脚本,需要实时告警机制保障可用性 |
安装与使用
📦 安装步骤
- 前置准备:确保已安装 ScriptCat v1.4 或更高版本
- 新建脚本:打开脚本猫管理面板 → 点击"新建脚本" → 选择"后台脚本"
- 粘贴代码:将
script-health-dashboard.user.js的完整内容粘贴进编辑器 - 保存启用:按
Ctrl+S保存,确保脚本状态为"已启用"
🎯 使用流程
安装完成
│
├─▶ 后台自动运行(每小时一次健康检查)
│
├─▶ 首次运行自动创建 3 个示例脚本,演示看板效果
│
└─▶ 用户操作:
├─ 脚本猫菜单 → 📊 查看健康度看板 → 浏览器新标签页打开仪表盘
├─ 脚本猫菜单 → 🔄 立即执行健康检查 → 手动触发一次检查
└─ 脚本猫后台 → 脚本右侧齿轮按钮 → 调整通知/告警/钉钉等配置
🖱️ 菜单命令说明
| 菜单命令 | 功能说明 |
|---|---|
| 📊 查看健康度看板 | 在新标签页中打开可视化仪表盘 |
| 🔄 立即执行健康检查 | 立即触发一次健康检查并发送结果通知 |
| 🧪 测试钉钉通知 | 发送一条测试消息到钉钉群,验证配置是否正确 |
接入指南
本看板采用 "反向注册" 策略:其他脚本主动向本看板写入自己的统计数据,本看板遍历读取汇总。
✅ 接入方式一:调用全局接口(推荐)
在你的脚本中直接调用 reportScriptStats 函数:
// 在你的脚本执行成功后调用
if (typeof reportScriptStats === 'function') {
reportScriptStats('your_script_id', {
name: '我的脚本',
totalExecutions: 10, // 总执行次数
successCount: 9, // 成功次数
totalDuration: 5000, // 累计耗时(毫秒)
lastExecTime: Date.now(), // 最后执行时间戳
version: '1.0.0' // 脚本版本号
});
}
🛠️ 接入方式二:直接写存储
如果你的脚本不依赖本看板运行,也可以按照键名规范直接写存储:
const KEY = 'SHD:stats:your_script_id';
let data = GM_getValue(KEY, null);
if (!data) {
data = {
scriptId: 'your_script_id',
name: '我的脚本',
version: '1.0.0',
totalExecutions: 0,
successCount: 0,
failureCount: 0,
totalDuration: 0,
lastExecTime: 0,
firstSeenTime: Date.now(),
lastUpdated: Date.now(),
latestVersion: '1.0.0',
hasUpdate: false
};
}
data.totalExecutions++;
if (success) data.successCount++;
data.failureCount = data.totalExecutions - data.successCount;
data.totalDuration += durationMs;
data.lastExecTime = Date.now();
data.lastUpdated = Date.now();
GM_setValue(KEY, data);
📋 stats 对象字段说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
name |
string | 否 | 脚本显示名称(默认使用 scriptId) |
totalExecutions |
number | 是 | 总执行次数 |
successCount |
number | 是 | 成功执行次数 |
totalDuration |
number | 是 | 累计耗时(毫秒) |
lastExecTime |
number | 是 | 最后执行时间戳(毫秒) |
version |
string | 否 | 当前脚本版本号 |
latestVersion |
string | 否 | 已知最新版本号(用于版本对比) |
hasUpdate |
boolean | 否 | 是否有新版本可更新 |
updateURL |
string | 否 | 脚本更新地址(用于自动检测版本) |
健康度评分规则
健康度评分采用 扣分制,从 100 分开始扣减,最终分数限制在 [0, 100] 区间。
📊 扣分细则
| 维度 | 条件 | 扣分 |
|---|---|---|
| 成功率 | 总执行次数 > 0 且成功率 < 80% | -20 |
| 总执行次数 > 0 且成功率 < 50% | 额外 -15(共 -35) | |
| 最近执行时间 | 超过 7 天未执行 | -10 |
| 超过 30 天未执行 | 额外 -15(共 -25) | |
| 平均耗时 | 平均耗时 > 5 秒 | -5 |
| 平均耗时 > 10 秒 | 额外 -5(共 -10) | |
| 版本状态 | 有新版本可更新(hasUpdate=true) |
-10 |
🏷️ 健康等级划分
| 等级 | 分数区间 | 标签 | 颜色 |
|---|---|---|---|
| 健康 | ≥ 80 | 🟢 健康 | 绿色 #22C55E |
| 警告 | 50 - 80 | 🟡 警告 | 黄色 #EAB308 |
| 严重 | < 50 | 🔴 严重 | 红色 #EF4444 |
⚠️ 边界处理
- 从未执行的脚本(
totalExecutions=0):成功率不扣分(视为 100%),但lastExecTime=0视为无限大天数,按最严重档扣 25 分 - 首次上报的新脚本:因无历史数据,初始评分通常较高,随执行次数增加趋于真实
- 数据损坏的脚本:计入"数据异常"卡片,不参与评分
配置说明
本脚本使用脚本猫标准的 UserConfig 配置面板,用户可在脚本猫后台管理界面通过脚本右侧的 齿轮按钮 进行配置。
通用设置
| 配置项 | 选项 | 默认值 | 说明 |
|---|---|---|---|
| 📢 启用桌面通知 | 开启 / 关闭 | 开启 | 关闭后不再发送任何桌面告警通知 |
| 🔔 告警阈值 | 30 / 40 / 50 / 60 / 70 | 50 | 当脚本健康度分数低于此值时触发告警 |
| ⏱️ 健康检查间隔 | 30分钟 / 60分钟 / 120分钟 | 60分钟 | 后台健康检查的执行频率 |
钉钉通知
| 配置项 | 选项 | 默认值 | 说明 |
|---|---|---|---|
| 📲 启用钉钉通知 | 开启 / 关闭 | 关闭 | 开启后严重脚本会自动推送钉钉群消息 |
| 🔗 Webhook 地址 | 文本 | 空 | 钉钉机器人 Webhook URL |
| 🔑 加签密钥 | 密码 | 空 | 机器人安全设置选择"加签"时填写(以 SEC 开头) |
| 📢 @所有人 | 开启 / 关闭 | 关闭 | 钉钉消息是否 @ 群内所有人 |
💡 提示:修改"健康检查间隔"后,
@crontab元数据在脚本安装时固定为每小时,脚本内部会在非对应周期时跳过执行,需等待下一个整点生效。⚠️ 安全提醒:Webhook 地址和加签密钥属于敏感信息,请勿分享给他人。
存储键命名规范
本看板在 GM 存储中使用以下键名规范,其他脚本接入时请遵守:
| 存储键 | 用途 |
|---|---|
SHD:stats:{scriptId} |
单个脚本的运行统计数据 |
SHD:report:latest |
最新一次健康报告 |
SHD:report:history |
健康报告历史记录(数组,最多 100 条) |
SHD:alert:{scriptId} |
单个脚本的最后告警时间戳 |
SHD:updatecheck:{scriptId} |
版本检测缓存 |
通用设置.* / 钉钉通知.* |
UserConfig 配置项(脚本猫标准配置存储) |
SHD:initialized |
首次运行标记 |
技术实现
🛠️ 技术栈
- 运行环境:ScriptCat v1.4+ 后台脚本能力
- GM API:
GM_info/GM_setValue/GM_getValue/GM_listValues/GM_deleteValue/GM_log/GM_notification/GM_registerMenuCommand/GM_openInTab/GM_xmlhttpRequest - 前端技术:纯原生 HTML / CSS / Canvas(不依赖任何第三方库)
🏗️ 架构亮点
- 反向注册策略:无需访问脚本猫内部 API,通过存储键约定实现松耦合
- 异常隔离:单个脚本数据损坏不影响整体采集流程
- 并发优化:使用
Promise.all并发加载和版本检测 - 数据迁移:字段完整性校验 + 向前兼容,平滑升级
- Blob URL 渲染:看板页面通过
GM_openInTab+ Blob URL 加载,样式与脚本完整内嵌 - 数据嵌入:报告数据以 JSON 形式注入
<script type="application/json">标签,解决 Blob 页面无法访问GM_getValue的问题
注意事项
⚠️ 版本要求:需要 ScriptCat v1.4 或更高版本
⚠️ 首次运行:安装后需等待第一次定时任务执行(最多 1 小时),或手动点击"🔄 立即执行健康检查"立即触发
⚠️ 数据来源:本看板只能监控已接入上报接口的脚本,未接入的脚本不会出现在看板中
⚠️ Blob 页面限制:看板页面通过 Blob URL 打开,无法实时获取最新存储数据。如需刷新,请通过脚本猫菜单重新打开看板
⚠️ 定时间隔:@crontab 元数据在脚本安装时固定为每小时,配置面板中的间隔调整为脚本内部逻辑控制
⚠️ 版本检测:仅对提供了 updateURL 字段的脚本生效,未提供则跳过检测
常见问题 (FAQ)
❓ Q1:为什么看板中没有任何脚本数据?
A:本看板采用"反向注册"策略,只能展示已接入上报接口的脚本。请确保:
- 已通过菜单"🔄 立即执行健康检查"触发至少一次采集
- 其他脚本已按接入指南调用
reportScriptStats或直接写存储 - 首次安装时会自动创建 3 个示例脚本,可据此验证看板功能
❓ Q2:如何让我的脚本被本看板监控?
A:在你的脚本中添加以下代码即可:
if (typeof reportScriptStats === 'function') {
reportScriptStats('unique_script_id', {
name: '我的脚本',
totalExecutions: 1,
successCount: 1,
totalDuration: 100,
lastExecTime: Date.now(),
version: '1.0.0'
});
}
建议在脚本每次执行成功后调用一次,累计上报执行数据。
❓ Q3:健康度评分为什么是 0 分?
A:常见原因:
- 脚本从未执行过(
lastExecTime=0),触发"超过 30 天未执行"扣 25 分 - 成功率过低(<50%),扣 35 分
- 平均耗时过长(>10秒),扣 10 分
- 有新版本可更新,扣 10 分
请检查看板表格中的"健康度分数"列,悬停可查看扣分明细。
❓ Q4:告警通知太频繁怎么办?
A:本看板已内置 1 小时去重机制。如仍觉频繁,可:
- 通过脚本猫后台齿轮按钮配置告警阈值(如设为 50 分)
- 或直接关闭桌面通知开关
❓ Q5:看板页面打开是空白的?
A:可能原因:
- 浏览器拦截了 Blob URL,请允许该站点的新标签页弹出
- 尚未执行过健康检查,报告中无数据(会显示空状态提示)
- ScriptCat 版本过低,请升级至 v1.4+
❓ Q6:历史趋势图为什么只有几个点?
A:趋势图展示的是历史检查记录,每次健康检查追加一条。刚安装时记录较少属正常现象,随着定时任务执行会逐渐积累,最多保留 30 个点用于绘图。
❓ Q7:可以监控非脚本猫的脚本吗?
A:不可以。本看板依赖 ScriptCat 的 GM_* API,只能在脚本猫环境中运行。其他脚本管理器(如 Tampermonkey)的脚本无法接入。
❓ Q8:如何卸载本看板?
A:在脚本猫管理面板中禁用或删除本脚本即可。已写入的统计数据会保留在 GM 存储中,如需彻底清理,可手动删除以下键:
SHD:stats:*(所有脚本统计)SHD:report:latestSHD:report:historySHD:configSHD:initialized
❓ Q9:配置面板中修改了定时间隔为什么不立即生效?
A:ScriptCat 的 @crontab 元数据在脚本安装时固定为每小时执行一次。配置面板中的"健康检查间隔"由脚本内部逻辑控制(非对应周期时跳过执行),修改后需等待下一个整点才会按新间隔执行。
❓ Q10:支持多浏览器同步吗?
A:不支持。GM 存储是浏览器本地的,不同浏览器或不同浏览器配置间数据不互通。
贡献与反馈
🤝 贡献代码
欢迎通过以下方式参与贡献:
- 🐛 提交 Issue 报告 Bug 或提出新功能建议
- 🔧 提交 Pull Request 修复问题或增强功能
- 📖 完善文档或分享使用经验
💬 反馈渠道
| 渠道 | 链接 |
|---|---|
| 🐙 GitHub Issues | 提交 Issue |
| 💬 ScriptCat 论坛 | ScriptCat 社区 |
| 📧 邮件反馈 | [email protected] |
🌟 支持项目
如果本项目对你有帮助,欢迎:
- ⭐ 在 GitHub 上给项目点 Star
- 📢 分享给其他脚本猫用户
- ☕ 请作者喝杯咖啡
许可证
本项目基于 MIT License 开源,可自由使用、修改、分发。
Made with ❤️ for ScriptCat Community
脚本健康度看板 v2.5.3 · 2026