
前端开发者工具插件系统【免费下载链接】scriptcatScriptCat, a browser extension that can execute userscript; 脚本猫一个可以执行用户脚本的浏览器扩展项目地址https://gitcode.com/gh_mirrors/sc/scriptcat点击查看免费下载导读ScriptCat脚本猫是一个基于 Manifest V3 构建的开源浏览器扩展它在完全兼容 Tampermonkey油猴脚本生态的基础上创新实现了后台脚本与定时脚本执行框架并内置了云端同步、沙盒隔离、权限管理和智能代码编辑器。本文以仓库 README.md 为主线结合 docs/architecture.md、docs/cloud-sync.md 等维护文档与源码实现系统讲解 ScriptCat 的功能体系、进程模型、脚本类型、云同步原理与使用方式帮助读者既能在浏览器中用好它也能理解其内部设计。项目定位不止是又一个油猴管理器ScriptCat 是一款基于 Tampermonkey 设计理念开发、完全兼容油猴脚本的用户脚本管理器userscript manager目标是轻松定制网页、消除广告、自动执行任务见 README.md 与中文版 docs/README_zh-CN.md。与普通脚本管理器不同的是ScriptCat 的创新点集中在三点后台脚本执行框架脚本不再依赖页面生命周期可以持续运行、脱离页面限制定时脚本通过crontab元数据声明定时任务实现自动签到、定时提醒等场景丰富的 GM API 扩展在油猴 API 基础上提供更多能力并配以支持智能补全与语法检查的内置代码编辑器。从 src/manifest.json 可以看到它的真实形态Manifest V3 扩展版本1.5.0.1500默认语言为英文声明了tabs、alarms、cookies、offscreen、scripting、userScripts、webRequest、declarativeNetRequest等核心权限并注册了src/sandbox.html作为沙盒页面、src/service_worker.js作为后台服务同时将src/install.html暴露为web_accessible_resources供脚本安装页使用——这些权限与页面设计共同支撑了它的三大差异化能力。核心特性全景README 速览README 将功能归纳为四个维度每个维度都对应仓库中的真实实现维度特性对应源码/文档入口 云端同步脚本云同步、脚本订阅docs/cloud-sync.md、src/app/repo/sync.ts 强大功能油猴兼容、后台脚本、定时脚本、丰富 APIsrc/template/、src/types/scriptcat.d.ts️ 安全可靠沙盒机制、权限管理src/app/service/sandbox/、src/app/repo/permission.ts 开发体验智能编辑器、调试工具、现代化 UIsrc/pages/options/routes/editor/、src/pages/components/CodeEditor/其中云端同步与后台/定时脚本是 ScriptCat 区别于其他管理器的招牌能力下面结合维护文档与源码分别深入。扩展架构五个上下文组成的分布式系统理解 ScriptCat 内部运作的关键在于 MV3 对扩展的切分方式。正如 docs/architecture.md 所总结的MV3 会把扩展拆成多个无法共享内存的沙盒 JS 环境因此 ScriptCat 实际上是一个由多个相互协作的上下文通过消息通道通信的小型分布式系统。三个核心思想贯穿整个代码库上下文即进程每个入口service_worker、content、inject、offscreen、sandbox都是隔离环境绝不共享对象只交换可序列化消息一套消息层多种传输方式packages/message 把chrome.runtime、postMessage、DOMCustomEvent抽象为统一的 RPC 发布订阅 API领域逻辑放在服务层显式接线共享协作者Group、IMessageQueue、DAO 等通常通过构造函数注入消息处理器通过init()生命周期方法注册这让系统可以用 mock 消息总线做单元测试。五个上下文进程模型上下文入口文件环境/能力初始化路径Service Workersrc/service_worker.ts无 DOM持有chrome.*特权 API、存储、权限、路由ExtensionMessage(true)→Server(serviceWorker)MessageQueue→ServiceWorkerManagerContentsrc/content.ts内容脚本隔离世界桥接 SW 与页面CustomEventMessage通道到 inject Server(content)→ScriptRuntimeInjectsrc/inject.ts页面 MAIN 世界拥有unsafeWindow运行页面用户脚本CustomEventMessage到 content Server(inject)Offscreensrc/offscreen.ts有 DOM 的后台页面Blob、剪贴板、DOM 抓取、本地存储ExtensionMessage()WindowMessage(window, sandbox)→OffscreenManagerSandboxsrc/sandbox.tsoffscreen 内的sandboxiframe执行后台/定时脚本、运行 cronWindowMessage(window, parent)Server(sandbox)→SandboxManager另有第六个 bundle src/scripting.ts通过chrome.userScripts/chrome.scripting注入负责携带编译后的页面脚本载荷。消息传递RPC 与发布订阅并用跨上下文通信全部经过 packages/message它提供了两种通信风格请求/响应 RPCServer/Group/Client以script/install这样的 action 字符串标识调用。Service Worker 创建new Server(serviceWorker, message)只处理serviceWorker/前缀的 actionGroup用于命名空间与中间件回复统一包装为{ code: 0, data }成功或{ code: -1, message }失败信封发布/订阅广播MessageQueue面向状态变化的通知。publish(topic, data)既通过chrome.runtime.sendMessage广播给所有上下文也在本地 emitsubscribe(topic, fn)注册监听。例如脚本被删除时SWpublish出deleteScripts主题ValueService据此回收孤儿存储值。使用准则需要答案用 RPC需要某件事变了的通知用 MessageQueue。Chrome 与 Firefox 的 offscreen 差异MV3 的 service worker 没有 DOM但 ScriptCat 需要 DOM 来做DOMParser、Blob、剪贴板等操作。两条平台路线值得注意详见 docs/architecture.mdChrome通过Offscreen API隐藏文档解决SW → Offscreen 使用ServiceWorkerMessageSendclients.matchAll()postMessageFirefoxMV3 没有 offscreen API其后台event page自带 DOM直接承担 offscreen 角色由EventPageOffscreenManager代偿sandbox iframe 在 Firefox 154 被加载为跨源 frame因此 SandboxManager 会主动发preparationSandbox消息宣告就绪父层永不轮询。三种脚本类型与运行方式ScriptCat 支持三种脚本类型模板分别位于 src/template/1. 普通页面脚本normal模板见 src/template/normal.tpl通过match指定匹配页面以经典的 IIFE 形式运行// UserScript // name {{name}} // version 0.1.0 // description try to take over the world! // author You // match {{match}} // grant none // noframes // /UserScript (function() { use strict; // Your code here... })();这类脚本与油猴脚本完全同构可直接迁移。2. 后台脚本background模板见 src/template/background.tpl只需在元数据中声明background// UserScript // name {{name}} // version 0.1.0 // description try to take over the world! // author You // background // /UserScript return new Promise((resolve, reject) { // Your code here... resolve(); });后台脚本以 Promise 为执行体运行在 offscreen 内的 sandbox iframe 中见上文进程模型因此可以持续运行、不依赖任何页面。它还支持用run-in区分运行环境例如 example/run-in/run-in_bg.js 展示了run-in incognito-tabs只在隐身窗口环境执行、run-in normal-tabs只在正常窗口执行并可通过GM_info.isIncognito与GM_info.userAgentData读取环境信息。3. 定时脚本scheduled / crontab模板见 src/template/crontab.tpl通过crontab声明周期同样以 Promise 为执行体// UserScript // name {{name}} // version 0.1.0 // description try to take over the world! // author You // crontab * * once * * // /UserScript return new Promise((resolve, reject) { // Your code here... resolve(); });crontab的字段顺序为分 时 日 月 周cron 风格。仓库示例 example/crontab/crontab.js 演示了*/15 14-16 * * *——下午两点至四点每十五分钟运行一次example/crontab/crontab-once.js 则演示了独特的once语法* 9-18 once * *表示在每天周期内只允许执行一次当天第一次触发成功后当天不再重复、次日重置非常适合每天定时同步、上报、检查类任务对应的 crontab 解析逻辑在 src/pkg/utils/cron.ts。GM API 与类型声明所有脚本可用的 GM API 都在 src/types/scriptcat.d.ts 中有完整类型声明共 1680 行包括与 Greasemonkey/Tampermonkey 兼容的同步风格函数GM_listValues/GM_setValue/GM_getValue/GM_deleteValue、批量版本GM_setValues/GM_getValues/GM_deleteValues、GM_addValueChangeListener值变化监听、GM_log结构化日志、GM_getResourceText资源读取以及GM_info环境元信息其中scriptHandler恒为ScriptCat、sandboxMode为raw、downloadMode为native。它还额外声明了Config/UserConfig用户配置面板类型与CAT.agent.*系列 Agent API内容侧实现见 src/app/service/content/gm_api/cat_agent.ts。云同步跨设备脚本恢复的工程实现云同步是 ScriptCat 的招牌能力README 中的跨设备同步脚本更换浏览器或重装系统后轻松恢复其完整设计由维护文档 docs/cloud-sync.md 描述核心代码在 src/app/service/service_worker/synchronize.ts统一文件系统接口在 packages/filesystem/filesystem.ts。同步目录的四类文件业务上使用ScriptCat/sync作为同步目录包含四类文件uuid.user.js脚本源码文件同步层用文件名中的uuid与FileInfo.digest识别脚本及远端内容状态uuid.meta.json元信息文件只要求兼容uuid、origin、downloadUrl、checkUpdateUrl、isDeleted这些可选字段tombstone 删除标记启用同步删除时删除云端脚本不直接清空而是删掉.user.js并写入{uuid: uuid, isDeleted: true}其他设备据此删除本地脚本scriptcat-sync.json保存脚本启用状态与排序type ScriptcatSync { version: string; status: { scripts: { [uuid: string]: { enable: boolean; sort: number; updatetime: number; } | undefined; }; }; };该文件可能缺失、缺字段或损坏写回前必须合并远端较新状态避免覆盖其他设备。三个关键状态存储file_digest存于ChromeStorage(sync)记录上一次确认同步成功的云端文件 digest。digest 是 provider 返回的opaque tokenWebDAV / S3 / OneDrive 用 ETag 风格Dropbox 用content_hashGoogle Drive / Baidu 接近 md5Zip 可能为空——不能用本地 md5 覆盖 provider 原生 digestsync_content_md5本地内容基线记录上次同步成功时本地内容的 md5用于云端变化时判断本地是否也改过避免跨时钟域墙钟比较本地毫秒 vs 服务端整秒 mtime带来的同秒竞态误判pending_sync_ops登记未完成的多步操作{ op: delete, syncDelete }或{ op: push }。例如删.user.js 写 tombstone中途失败或 SW 重启后登记仍在下一轮syncOnceInternal()开头会先重放。决策规则与冲突处理syncOnceInternal()主流程为重放 pending 操作 →fs.list()取云端目录 → 组装uuidMap/scriptMap→ 逐文件决策 →Promise.allSettled()并行执行 → 收集 digest patch → 合并 status →updateFileDigest()推进成功文件 digest。核心决策规则详见 docs/cloud-sync.md本地与云端都存在且 digest 一致、本地时间更晚 →补偿 push云端 digest 已变decideDirectionOnRemoteChange()→ 本地内容 md5 等于基线则pull本地已改但内容与云端一致则adopt采用云端 digest 收敛基线不产生写操作两边都改真冲突→本轮跳过保留旧 digest 与云端 status并聚合通知用户云端只剩.meta.json且是 tombstone →删除本地脚本本地不存在、云端只有.user.js→ 视为orphan 脚本跳过不删除不覆盖遍历结束后只存在于本地的脚本会被 push 到云端。同步任务通过CLOUD_SYNC_QUEUE_KEY cloud_sync_queue串行化入口包括配置启用后的syncOnce()、Chrome alarmcloudSync周期 30 分钟、非 sync 来源的安装/删除、排序写入等——串行队列很关键因为安装、删除、定时同步都可能写同一批云端文件并发会扩大覆盖与 digest 污染风险。Provider 差异与错误分类Providerdigest 来源写入方式关键实现WebDAVetag普通覆盖写入putFileContents()S3ETag去引号普通覆盖写入PUT ObjectOneDriveeTag普通覆盖写入simple PUT / upload sessionGoogle Drivemd5Checksum普通覆盖写入先按路径查 fileId再 PATCH 或 POSTDropboxcontent_hash普通覆盖写入先exists()存在 overwrite不存在 addBaidumd5普通覆盖写入precreate/upload/creatertype3覆盖Zip空普通覆盖写入备份用途同步层用classifySyncError()把 provider 抛出的 typedFileSystemError映射为conflict文件冲突、transient429、瞬时 5xx 可重试、stale_snapshotlist 到操作之间远端消失、fatal授权失败或未分类四类LimiterFileSystem只对verify/open/read/list等读类操作重试不重试写入与删除——因为重复执行可能创建重复文件、覆盖并发更新或误删。覆盖/冲突可见性云同步本质是 best-effort last-writer-wins为让用户可感知增加三处可见性不改变同步语义每轮同步把CloudSyncStatesyncing、lastSyncAt、error、counts: { total, overwrite, conflict, failed }写入ChromeStorage(sync)供设置页状态条实时展示无基线兜底分支可能发生的覆盖会打sync overwrite警告日志经LoggerDAO落 IndexedDBservice: synchronize真冲突时聚合一条InfoNotification通知用户且同一批冲突不重复通知。安全与权限模型ScriptCat 通过两道防线保障脚本安全README 安全可靠 维度沙盒机制脚本运行在隔离环境中。页面脚本运行于页面 MAIN 世界的注入沙盒后台/定时脚本则运行在 offscreen 内的sandboxiframemanifest 的sandbox.pages声明了 src/sandbox.html实现见 src/app/service/sandbox/index.ts防止恶意代码影响其他脚本权限管理脚本必须显式声明所需权限grant敏感操作需要额外确认相关实现见 src/app/repo/permission.ts 与安装页权限解析 src/pages/install/permissions.ts。快速开始安装与使用安装扩展扩展商店推荐Chrome、Edge 商店提供稳定版与 Beta 版Firefox 提供稳定版与 Beta 版MV2 形态各版本入口见 README 表格手动安装无法访问扩展商店时可从 GitHub Releases 下载最新 ZIP 包在浏览器的扩展管理页开启开发者模式后以解压/加载方式安装。安装脚本从脚本市场获取访问 ScriptCat 脚本站或其他用户脚本市场后台脚本专区体验独有的后台脚本script_type3分类兼容性支持绝大部分油猴脚本可直接安装使用遇到不兼容脚本可反馈 issue。开发脚本编写脚本可参考 docs.scriptcat.org 目录提供了大量可直接运行的示例后台脚本、定时脚本、GM API 用法、run-in运行环境、订阅脚本等是最贴近真实代码的教材。测试体系与贡献方式作为开源项目ScriptCat 的工程质量由三层测试保障详见 docs/architecture.md 与 docs/develop.md单元测试Vitest happy-dom*.test.ts与源码同目录放置chrome.*通过 packages/chrome-extension-mock mock注册于 tests/vitest.setup.ts消息层用MockMessage测试运行单个文件pnpm test -- --run path/to/file.test.tsE2E 测试Playwrighte2e/*.spec.ts在真实 Chromium 中运行配置见 playwright.config.ts命令pnpm run test:e2e首次运行先pnpm run test:e2e:install同步层专项测试同步逻辑的覆盖场景清单见 docs/cloud-sync.md 的测试重点一节单文件失败不阻塞其他文件、失败 digest 保留、损坏的scriptcat-sync.json不阻塞同步、真冲突不自动覆盖等 18 条测试代码在 src/app/service/service_worker/synchronize.test.ts。贡献者请先阅读 CONTRIBUTING.md中文版见 docs/CONTRIBUTING_ZH.md并遵守 AGENTS.md 中的工程原则修复根因、避免as any与吞错、保持改动范围收敛。项目以 LICENSE 中的 GPLv3 协议开源使用与二次开发时请注意遵守相关许可条款。赞分享前端开发者工具插件系统【免费下载链接】scriptcatScriptCat, a browser extension that can execute userscript; 脚本猫一个可以执行用户脚本的浏览器扩展项目地址https://gitcode.com/gh_mirrors/sc/scriptcat点击查看免费下载相关推荐ScriptCat脚本管理器在Edge浏览器中的脚本执行问题分析ScriptCat脚本管理器在Edge浏览器中的脚本执行问题分析 问题背景 近期有用户反馈在使用ScriptCat脚本管理器时遇到了一个特殊问题AC baid前端开发者工具插件系统解锁浏览器脚本管理新姿势ScriptCat神器使用指南 解锁浏览器脚本管理新姿势ScriptCat神器使用指南 想让你的浏览器拥有超能力 脚本猫ScriptCat这款强大的浏览器脚本管理器能帮你轻前端开发者工具插件系统Tampermonkey最受欢迎的用户脚本管理器Tampermonkey最受欢迎的用户脚本管理器 项目介绍 Tampermonkey 是一款专为 Google Chrome 浏览器设计的最受欢迎的用户脚本管前端插件系统上一篇Darkwallet隐私增强技巧如何最大化你的比特币交易匿名性下一篇Apex 完整安装与自定义 C/CUDA 扩展构建指南从源码编译到 contrib 模块选装创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考