Tampermonkey 脚本头部元数据参考
一、元数据块概述
脚本头部的 // ==UserScript== 块是油猴(Tampermonkey)脚本的标准配置清单,所有内容都是给油猴扩展程序读取的指令,不会被浏览器直接执行。它告诉油猴如何加载、运行、管理和更新这个脚本。
格式要求
- 必须以
// ==UserScript==开头,以// ==/UserScript==结尾 - 每行格式为
// @指令名 指令值(指令名不区分大小写,值区分大小写) - 同一指令可以出现多次(如
@match、@grant) - 注释行以
//开头,不能和指令在同一行
完整示例
1 | // ==UserScript== |
二、完整元数据指令分类详解
2.1 基础信息类
用于标识脚本的基本信息,在油猴管理面板中展示。
| 指令 | 语法 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|---|
@name | @name 脚本名称 | 脚本显示名称 | @name B站视频字幕提取器 | 支持多语言:@name:zh-CN、@name:en |
@namespace | @namespace 命名空间 | 唯一标识脚本 | @namespace https://github.com/... | 使用域名、GitHub 地址或邮箱 |
@version | @version 版本号 | 版本管理与更新检测 | @version 1.2.1 | 推荐语义化版本 |
@description | @description 功能描述 | 脚本功能介绍 | @description 提取B站视频字幕... | 支持多语言 |
@author | @author 作者名 | 标注开发者 | @author 栖桐听雨 | 多作者用逗号分隔 |
@icon | @icon 图标URL | 显示图标 | @icon https://www.bilibili.com/... | 推荐 16x16 或 32x32 PNG/ICO |
@icon64 | @icon64 64x64图标URL | 高清图标 | @icon64 https://example.com/icon64.png | 优先使用 64x64 像素 |
@homepageURL | @homepageURL 主页URL | 官方主页 | @homepageURL https://github.com/... | 替代旧版 @homepage |
@supportURL | @supportURL 反馈URL | 用户反馈链接 | @supportURL https://github.com/.../issues | 通常是 GitHub Issues |
@contributionURL | @contributionURL 捐赠URL | 捐赠链接 | @contributionURL https://paypal.me/... | 支持 PayPal、支付宝 |
@license | @license 许可证 | 开源许可证 | @license MIT | 常见:MIT、GPL-3.0 |
@copyright | @copyright 版权声明 | 版权信息 | @copyright 2025 栖桐听雨 | 说明版权归属 |
@tag | @tag 标签名 | 添加分类标签 | @tag 视频 @tag 字幕 | Greasy Fork 平台专用 |
2.2 运行控制类
控制脚本在哪些页面、什么时候运行,是最核心的配置之一。
| 指令 | 语法 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|---|
@match | @match URL模式 | 指定运行页面(推荐) | @match https://www.bilibili.com/video/* | 规则严格,安全高 |
@include | @include URL模式 | 指定运行页面(兼容旧版) | @include https://*.bilibili.com/* | 规则宽松,易被利用 |
@exclude | @exclude URL模式 | 排除不运行页面 | @exclude https://www.bilibili.com/video/BV1xx411c7mZ | 优先级高于 @match/@include |
@noframes | @noframes | 禁止在 iframe 运行 | @noframes | 避免重复运行 |
@run-at | @run-at 时机 | 指定运行阶段 | @run-at document-end | 可选:document-start/document-end等 |
@run-in | @run-in 标签页类型 | 指定标签页类型 | @run-in normal-tabs | v5.3+,可选:normal-tabs/private-tabs/incognito |
@inject-into | @inject-into 上下文 | 指定注入环境 | @inject-into content | 可选:page/content/auto |
@sandbox | @sandbox 沙箱模式 | 指定沙箱环境 | @sandbox JavaScript | Tampermonkey 4.18+,可选:JavaScript/DOM/raw |
@match URL 模式语法详解
@match 的 URL 格式为 <protocol>://<domain><path>:
| 部分 | 说明 | 示例 |
|---|---|---|
protocol | 协议部分,* 可匹配 http 和 https | http*:// 匹配 http 和 https |
domain | 域名部分,支持 * 通配符 | *.bilibili.com 匹配所有子域名 |
path | 路径部分,* 匹配任意字符 | /video/* 匹配所有视频页面 |
支持的协议:
http://https://http*://(匹配 http 和 https)
2.3 权限与安全类
声明脚本需要使用的油猴 API 权限和允许访问的外部资源,遵循最小权限原则。
| 指令 | 语法 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|---|
@grant | @grant API名称 | 申请使用油猴提供的特殊 API | @grant GM_xmlhttpRequest | 没有声明的 API 无法使用,多个权限需要多次声明 |
@connect | @connect 域名 | 允许脚本向指定域名发送跨域请求 | @connect api.bilibili.com | 必须配合 @grant GM_xmlhttpRequest 使用 |
@require | @require JS库URL | 引入外部 JavaScript 库 | @require https://cdn.jsdelivr.net/npm/jquery... | 油猴会缓存库文件,不会每次都下载 |
@resource | @resource 资源名 资源URL | 引入外部资源(图片、CSS、文本等) | @resource style https://example.com/style.css | 通过 GM_getResourceURL() 或 GM_getResourceText() 使用 |
@nocompat | @nocompat 脚本管理器 | 指定不兼容的脚本管理器 | @nocompat Greasemonkey | 避免脚本在不支持的管理器中运行 |
@webRequest | @webRequest URL模式 | 声明需要拦截的网络请求 | @webRequest https://*.bilibili.com/api/* | 需要配合 @grant GM_webRequest 使用 |
常用 @grant API 列表
| API 名称 | 功能 |
|---|---|
GM_xmlhttpRequest | 发送跨域 HTTP 请求 |
GM_setClipboard | 写入系统剪贴板 |
GM_setValue / GM_getValue / GM_deleteValue / GM_listValues | 持久化存储数据 |
GM_setValues | 批量设置存储数据(v5.3+) |
GM_notification | 显示桌面通知 |
GM_openInTab | 在新标签页打开链接 |
GM_download | 下载文件到本地 |
GM_addStyle | 向页面添加 CSS 样式 |
GM_addElement | 向页面添加 DOM 元素 |
GM_getResourceText / GM_getResourceURL | 获取外部资源 |
GM_registerMenuCommand / GM_unregisterMenuCommand | 在油猴菜单中添加/移除命令 |
GM_addValueChangeListener / GM_removeValueChangeListener | 监听存储值变化 |
GM_getTab / GM_saveTab / GM_getTabs | 标签页管理 |
GM_info | 获取脚本和浏览器信息 |
GM_log | 输出日志到油猴控制台 |
unsafeWindow | 访问页面的 window 对象 |
window.close / window.focus | 关闭/聚焦窗口 |
window.onurlchange | URL 变化事件 |
none | 不使用任何 GM API,脚本运行在页面上下文 |
@grant none 的特殊说明
使用 @grant none 时:
- 脚本运行在页面的 JavaScript 上下文,而非沙箱环境
- 可以直接访问页面的全局变量和函数
- 可以使用页面的 jQuery 等库(如页面已加载)
- 无法使用大部分 GM_* API
- 页面脚本和油猴脚本之间没有隔离
2.4 更新与分发类
控制脚本的自动更新和分发渠道。
| 指令 | 语法 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|---|
@updateURL | @updateURL 更新检测URL | 检查更新地址 | @updateURL https://raw.githubusercontent.com/.../script.user.js | 必须返回脚本原始内容 |
@downloadURL | @downloadURL 下载URL | 新版本下载地址 | @downloadURL https://raw.githubusercontent.com/.../script.user.js | 与 @updateURL 相同可省略 |
@installURL | @installURL 安装URL | 官方安装地址 | @installURL https://greasyfork.org/scripts/... | 用于脚本分发平台 |
自动更新原理
- 油猴定期访问
@updateURL获取脚本内容 - 对比脚本中的
@version与本地版本 - 如果远程版本更高,提示用户更新
- 用户确认后,从
@downloadURL下载新版本
补充说明:
- 如果没有配置
@updateURL,油猴会尝试从脚本的安装地址检查更新 @downloadURL可以是不同的地址,用于分流下载
2.5 高级功能类
一些不常用但功能强大的高级指令。
| 指令 | 语法 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|---|
@antifeature | @antifeature 类型 描述 | 声明脚本”反功能” | @antifeature ads 脚本会显示非侵入式广告 | Greasy Fork 强制要求声明 |
@priority | @priority 优先级 | 指定运行优先级 | @priority 1 | 数值越小优先级越高,默认 0 |
@preprocess | @preprocess 预处理指令 | 预处理方式 | @preprocess none | 可选:none/c-style/javascript |
@unwrap | @unwrap | 取消包装函数 | @unwrap | 已废弃 |
@antifeature 反功能类型
| 类型 | 说明 |
|---|---|
ads | 脚本显示广告 |
tracking | 脚本包含追踪功能 |
miner | 脚本利用用户算力进行挖矿 |
payment | 脚本要求付费才能使用完整功能 |
data-collection | 脚本收集用户数据 |
referral | 脚本包含推荐/返利链接 |
注意:这是 Greasy Fork 平台的强制要求,其他脚本平台可能不要求。
三、重要指令深度解析
3.1 @match vs @include:为什么推荐用 @match
@match 是为了解决 @include 的安全问题而设计的,两者的通配符规则有本质区别:
| 特性 | @match | @include |
|---|---|---|
通配符 * | 只能匹配一个路径段,不能跨 / | 可以匹配任意字符,包括 / |
| 安全性 | 高,规则严格 | 低,容易被恶意利用 |
| 示例匹配 | https://*.bilibili.com/* 不会匹配 https://bilibili.com.evil.com/* | https://*.bilibili.com/* 会匹配 https://evil.com/?url=https://bilibili.com/ |
最佳实践:始终使用 @match 代替 @include
⚠️ 危险警告:永远不要使用 @include *,这会让脚本在所有页面运行,极其危险
恶意利用案例:
攻击者可以构造一个恶意网站 https://evil.com/?url=https://www.bilibili.com/,如果脚本使用 @include https://*.bilibili.com/*,这个恶意网址也会匹配成功。
3.2 @run-at 运行时机详解
| 时机 | 说明 | 适用场景 |
|---|---|---|
document-start | 页面开始加载时运行(最早) | 拦截请求、修改全局变量。限制:DOM 未加载,不能操作 DOM |
document-end | DOM 加载完成后运行(默认) | 操作页面 DOM 元素、添加按钮和事件 |
document-idle | 浏览器空闲时运行 | 等待页面资源加载完成的场景,不阻塞加载 |
body | <body> 标签出现时运行 | 尽早操作 body 元素的场景 |
menu | 用户点击脚本菜单时运行 | 脚本不自动运行,用户主动触发 |
context-menu | 用户右键点击脚本菜单时运行 | 脚本不自动运行,右键菜单触发 |
推荐选择:
- 大多数脚本使用
document-end即可 - 需要操作 DOM 元素时,明确指定运行时机
- 避免使用默认值,确保脚本行为可预测
3.3 @connect 跨域白名单
- 必须和
@grant GM_xmlhttpRequest配合使用 - 支持通配符:
@connect *.bilibili.com允许访问 bilibili.com 的所有子域名 - 特殊值
self:允许请求当前页面的域名 - 禁止使用
@connect *,这会给恶意脚本窃取数据大开方便之门
安全建议:
1 | // ✅ 好的做法:指定具体域名 |
3.4 @inject-into 注入上下文选择
| 值 | 说明 | 适用场景 |
|---|---|---|
page | 注入到页面 JavaScript 上下文 | 访问页面变量。限制:无法使用大部分 GM API |
content | 注入隔离的内容脚本上下文 | 更高安全性,与页面脚本隔离,变量不污染 |
auto | 自动选择(默认) | 大多数情况使用默认值 |
3.5 @sandbox 沙箱模式选择
| 值 | 说明 | 适用场景 |
|---|---|---|
JavaScript | JavaScript 沙箱中运行(默认) | 大多数脚本,推荐使用 |
DOM | 可访问 DOM,不能访问页面 JS 变量 | 需要操作页面 DOM |
raw | 最严格沙箱,只能访问 JS 核心 API,不能访问 DOM | 极少使用 |
四、元数据最佳实践
安全原则
- 使用 @match 代替 @include:严格的 URL 匹配规则能有效防止脚本在非预期页面运行
- 最小权限原则:只申请脚本实际需要的
@grant和@connect权限 - 资源可信:
@require和@resource只使用来自可信来源的资源(如 jsDelivr、GitHub Raw) - 避免通配符滥用:不要使用
@match *或@connect * - 保护敏感信息:不要在元数据中包含敏感信息,如 API 密钥、密码等
- 使用 HTTPS:优先使用 HTTPS 协议的资源链接,避免 HTTP 被劫持
- 谨慎使用 unsafeWindow:可能被页面脚本攻击,尽量避免使用
- 配置 @webRequest 需谨慎:配合
@grant GM_webRequest使用,可以拦截网络请求
规范建议
- 明确运行时机:不要依赖默认的
@run-at document-end,根据脚本功能明确指定 - 语义化版本号:使用语义化版本(主版本.次版本.修订号),每次更新递增版本号
- 完善元数据:提供清晰的
@description、@supportURL和@license - 多语言支持:为
@name和@description添加多语言版本
分发优化
- 配置更新地址:正确配置
@updateURL和@downloadURL,方便用户获取更新 - 添加标签:使用
@tag指令为脚本添加分类标签,便于在脚本平台被发现 - 声明反功能:如果脚本包含广告或其他特殊功能,使用
@antifeature如实声明
开发建议
- 使用模板:新建脚本时使用油猴内置模板,包含基本元数据
- 启用调试:在油猴设置中启用 “调试模式”,方便排查问题
- 版本管理:使用 Git 管理脚本版本,配合
@updateURL实现自动更新
五、脚本安全检查清单
在安装或编写脚本时,务必检查以下元数据项:
-
@match/@include只包含脚本需要运行的域名 -
@grant只申请了必要的 API 权限 -
@connect只包含脚本需要访问的域名 -
@require和@resource来自可信来源 - 检查脚本是否有
@antifeature声明,如果有,确认你能接受这些功能 - 版本号正确,更新地址可信
- 检查脚本的大小,如果异常大,可能包含恶意代码
六、常见问题与解决方案
Q1:脚本没有在预期的页面运行?
可能原因:
@match规则不正确- URL 中包含查询参数或哈希值
- 页面在 iframe 中运行
解决方案:
- 使用更宽松的
@match规则(如https://*.example.com/*) - 检查是否需要添加
@noframes指令 - 确认脚本已启用
Q2:跨域请求失败?
可能原因:
- 没有声明
@connect域名 - 没有声明
@grant GM_xmlhttpRequest
解决方案:
- 添加
@connect 目标域名 - 添加
@grant GM_xmlhttpRequest
Q3:GM API 无法使用?
可能原因:
- 没有在元数据中声明该 API
- 使用了
@grant none,禁用了所有 GM API
解决方案:
- 在元数据中添加对应的
@grant声明 - 如果需要使用 GM API,移除
@grant none
Q4:脚本更新不生效?
可能原因:
@updateURL配置错误- 版本号没有递增
- 缓存问题
解决方案:
- 检查
@updateURL是否返回正确的脚本内容 - 确保版本号比当前版本高
- 在油猴管理面板手动检查更新
Q5:脚本与页面脚本冲突?
可能原因:
- 脚本运行在页面上下文,变量命名冲突
- 页面脚本修改了关键对象
解决方案:
- 使用
@inject-into content隔离脚本环境 - 使用立即执行函数(IIFE)避免全局污染
- 使用唯一的前缀命名变量和函数
Q6:脚本运行缓慢怎么办?
可能原因:
- 脚本在页面加载时执行了过多操作
- 使用了
@run-at document-start但进行了 DOM 操作
解决方案:
- 使用
@run-at document-idle避免阻塞页面加载 - 将耗时操作延迟执行
- 优化脚本代码,减少不必要的计算
Q7:脚本在某些浏览器中不工作?
可能原因:
- 浏览器不支持 Tampermonkey
- 脚本使用的 API 在该浏览器中不可用
- 浏览器安全策略限制
解决方案:
- 检查浏览器是否支持 Tampermonkey
- 查看脚本使用的 GM API 是否在该浏览器中可用
- 尝试使用兼容性更好的 API
七、GM API 快速参考
存储 API
1 | // 设置值 |
网络请求 API
1 | GM_xmlhttpRequest({ |
UI API
1 | // 添加样式 |
信息 API
1 | // 获取脚本和浏览器信息 |
剪贴板 API
1 | GM_setClipboard("要复制的内容", "text"); |
下载 API
1 | GM_download({ |
八、总结
Tampermonkey 脚本头部元数据是脚本的核心配置,正确配置元数据能确保脚本安全、可靠地运行。
核心要点:
- 使用
@match代替@include,提高安全性 - 遵循最小权限原则,只申请必要的权限
- 明确指定运行时机,避免依赖默认值
- 配置正确的更新地址,方便用户获取更新
- 提供完整的元数据信息,便于脚本管理和分发
- 使用
@grant none时要谨慎,确保不需要 GM API
通过掌握这些元数据指令,你可以编写出更加专业、安全的油猴脚本。