Tampermonkey文档
用户脚本头
@name
脚本的名称,可通过添加语言代码来实现国际化
// @name 一个测试脚本
// @name:zh-CN 一个测试脚本
@namespace
脚本的命名空间
@copyright
脚本版权声明,在编辑器的头部显示
@version
脚本版本号,用于更新检查,每次更新时需要递增
版本号排序规则如下,后面的视为较新版本:
Alpha-v1 < Alpha-v10
Alpha-v2
Beta
0.5pre3
0.5prelimiary
0.6pre4
0.6pre5
0.7pre4
0.7pre10
1.-1
1 == 1. == 1.0 == 1.0.0
1.1a
1.1aa
1.1ab
1.1b
1.1c
1.1.-1
1.1 == 1.1.0 == 1.1.00
1.1.1.1.1
1.1.1.1.2
1.1.1.1
1.10.0-alpha
1.10 == 1.10.0
1.11.0-alpha
1.11.0-alpha.1
1.11.0-alpha+1
1.11.0-0.3.7
1.12+1 == 1.12+1.0
1.12+1.1 == 1.12+1.1.0
1.12+2
1.12+2.1
1.12+3
1.12+4
1.12
2.0
16.4 == 16.04
@description
脚本的简短描述,也可以用语言代码实现国际化
// @description 这个用户脚本可以做一些很棒的事情
// @description:zh-CN 这个用户脚本可以做一些很棒的事情
@icon、@iconURL、@defaulticon
脚本的图标,低分辨率
@icon64、@icon64URL
脚本的 64x64 像素图标,如果只有 @icon64 但没有 @icon,@icon 图像在某些地方也会被缩放
@grant
@grant 用于白名单 GM_\* 和 GM.* 函数、unsafeWindow 对象和一些强大的窗口函数
// @grant GM_setValue
// @grant GM_getValue
// @grant GM.setValue
// @grant GM.getValue
// @grant GM_setClipboard
// @grant unsafeWindow
// @grant window.close
// @grant window.focus
// @grant window.onurlchange
由于关闭和聚焦标签很强大,也需要添加到 @grant 中
如果 @grant 后面是 none,则禁用沙箱,在此模式下,GM_\* 函数不可用,但 GM_info 属性可用
// @grant none
如果没有 @grant 标签,则假定为空列表,但是这与使用 none 不同
@author
脚本作者
@homepage、@homepageURL、@website、@source
作者主页,在脚本设置页面用来从脚本名称链接到该页面,注意如果 @namespace 以 http:// 开头,其内容也会用于此目的
@antifeature
此标记允许脚本开发者披露他们是否正在从脚本中获利,例如 GreasyFork 要求这一点
语法:<标记名> <类型> <描述>
类型 可以是以下值:
ads: 表示有广告tracking: 表示有某种分析miner: 表示使用计算资源挖矿
// @antifeature ads 我们会展示一些广告
// @antifeature:zh-CN ads 我们会展示一些广告
// @antifeature tracking 我们集成了某种分析
// @antifeature miner 我们使用您的计算资源进行挖矿
也可以用语言代码实现国际化
@require
指定在脚本本身开始运行前需要加载并执行的 JavaScript 文件
注意:@require 加载的脚本中的 "use strict" 语句可能会影响用户脚本的严格模式!
// @require https://code.jquery.com/jquery-2.1.4.min.js
// @require https://code.jquery.com/jquery-2.1.3.min.js#sha256=23456...
// @require https://code.jquery.com/jquery-2.1.2.min.js#md5=34567...,sha256=6789...
// @require tampermonkey://vendor/jquery.js
// @require tampermonkey://vendor/jszip/jszip.js
请查看子资源完整性部分以获取更多信息以确保完整性
允许多个标记实例
@resource
预加载可以通过脚本使用 GM_getResourceURL 和 GM_getResourceText 访问的资源
// @resource icon1 http://www.tampermonkey.net/favicon.ico
// @resource icon2 /images/icon.png
// @resource html http://www.tampermonkey.net/index.html
// @resource xml http://www.tampermonkey.net/crx/tampermonkey.xml
// @resource SRIsecured1 http://www.tampermonkey.net/favicon.ico#md5=123434...
// @resource SRIsecured2 http://www.tampermonkey.net/favicon.ico#md5=123434...;sha256=234234...
请查看子资源完整性部分以获取更多信息以确保完整性
允许多个标记实例
@include
脚本应该运行的页面,允许多个标记实例
@include 不支持 URL 哈希参数,您必须匹配不含哈希参数的路径,并使用 window.onurlchange
// @include http://www.tampermonkey.net/*
// @include http://*
// @include https://*
// @include /^https:\/\/www\.tampermonkey\.net\/.*$/
// @include *
注意:类似 ://tmnk.net/ 的规则,许多脚本开发者希望它仅针对 tmnk.net 运行,但实际上它在像 https://example.com/?http://tmnk.net/ ↗ 这样的页面也会运行
因此,Tampermonkey 会像 @match 一样稍微特殊解释包含 :// 的 @include,在 :// 之前的 * 只匹配非 : 字符,以确保只匹配协议
如果这样的 @include 在 :// 后面包含 /,那么这两个字符串之间的所有内容都将被视为主机,匹配任何非 / 字符,同样适用于紧随 :// 之后的 *
@match
@match 指令用于指定用户脚本应该运行的网页
@match 的值应该是一个 URL 模式,匹配你希望脚本运行的页面,这里是你需要设置的 URL 模式的部分:
// @match <协议>://<域名><路径>
-
协议 - URL 的第一部分,冒号之前,它指定页面使用的协议,如
http或https,*匹配两者 -
域名 - URL 的第二部分,在协议和两个斜杠之后,它指定网站的域名,如 tmnk.com,你可以像这样使用通配符 *.tmnk.net 来匹配 tmnk.net 和它的任意子域,如 www.tmnk.net
-
路径 - 域名后的 URL 部分,可能包含其他子目录或文件名,你可以使用通配符
*来匹配路径的任意部分
请查看文档 ↗以获取更多关于匹配模式的信息,注意:<all_urls> 语句尚未支持,scheme 部分也接受 http*://
允许多个标记实例
更多示例:
// @match *://*/*
// @match https://*/*
// @match http://*/foo*
// @match https://*.tampermonkey.net/foo*bar
@exclude
排除即使被 @include 或 @match 包含的 URL
允许多个标记实例
@run-at
定义注入脚本的时机,与其他脚本处理程序相反,@run-at 定义脚本首次可能运行的最早时机,这意味着由于获取所需脚本需要时间,因此即使在文档已经加载后,使用 @require 标记的脚本也可能会执行,不过,在给定的注入时刻之后发生的所有 DOMNodeInserted 和 DOMContentLoaded 事件都会被缓存并在脚本被注入时传递给它
// @run-at document-start
脚本将尽快注入
// @run-at document-body
如果body元素存在,则会注入脚本
// @run-at document-end
在 DOMContentLoaded 事件分发时或之后注入脚本
// @run-at document-idle
在 DOMContentLoaded 事件分发之后注入脚本,如果没有给出 @run-at 标记,这是默认值
// @run-at context-menu
如果在浏览器上下文菜单中点击,则注入脚本(仅限基于 Chrome 的桌面浏览器)
注意:如果使用此值,所有 @include 和 @exclude 语句都将被忽略,但这可能会在未来发生改变
@sandbox
@sandbox 允许 Tampermonkey 决定在何处注入用户脚本:
MAIN_WORLD- 页面上ISOLATED_WORLD- 扩展的内容脚本中USERSCRIPT_WORLD- 为用户脚本创建的特殊上下文
但是,用户脚本可以明确需要访问什么,而不是指定环境,@sandbox 支持三个可能的参数:
raw:“原始”访问意味着某些脚本出于兼容性原因总是需要在页面上下文中运行,MAIN_WORLD中运行
目前,如果省略 @sandbox,这是默认模式
JavaScript:“JavaScript”访问模式意味着该脚本需要访问unsafeWindow
在 Firefox 中,会创建一个特殊的上下文 USERSCRIPT_WORLD,它应该也可以规避所有剩余的 CSP 问题,但是,现在可能会产生新的问题,因为现在需要 cloneInto 和 exportFunction 在页面之间共享对象
如果在其他浏览器中会回退到 raw 模式
DOM:如果脚本仅需要 DOM 访问而不需要直接访问unsafeWindow,请使用此访问模式
如果启用,这些脚本将在扩展上下文中执行,ISOLATED_WORLD,或者在任何其他启用的上下文中执行,因为它们都授予了 DOM 访问权限
// @sandbox JavaScript
@connect
此标记定义允许通过 GM_xmlhttpRequest 检索的域(不含顶级域)
// @connect <值>
<值> 可以是:
- 域名,如
example.com(这也将允许所有子域), - 子域名,如
subdomain.example.com self可访问脚本当前运行的域,localhost访问本地主机- IP 地址,如
1.2.3.4 *.
如果无法声明用户脚本可能连接的所有域,那么最好遵循以下做法:
-
声明脚本可能连接的所有已知或至少所有常用域,以避免对大多数用户显示确认对话框
-
另外添加
@connect *到脚本中,以允许 Tampermonkey 提供“始终允许所有域”按钮
用户还可以通过在脚本设置选项卡添加 * 来白名单所有请求
注意:
- 初始 URL 和最终 URL 都会被检查!
- 为了向后兼容 Scriptish,
@domain标记也会被解释 - 允许多个标记实例
更多示例:
// @connect tmnk.net
// @connect www.tampermonkey.net
// @connect self
// @connect localhost
// @connect 8.8.8.8
// @connect *
@noframes
此标记使脚本在主页面上运行,但不在 iframe 中运行
@updateURL
用于更新检查的用户脚本更新 URL
注意:@version 标记是使更新检查工作所必需的
@downloadURL
定义检测到更新时从中下载脚本的 URL,如果使用 none 值,则不会进行更新检查
@supportURL
定义用户可以报告问题和获得个人支持的 URL
@webRequest
@webRequest 接受与 GM_webRequest 的 rule 参数匹配的 JSON 文档,它允许规则应用于脚本加载之前
@unwrap
以不带任何包装器和沙箱的方式将用户脚本注入页面,这对 Scriptlets 可能很有用
应用程序编程接口
unsafeWindow
unsafeWindow 对象提供对 Tampermonkey 运行的页面的 window 对象的访问,而不是 Tampermonkey 扩展的 window 对象,在某些情况下,这很有用,例如当用户脚本需要访问页面上定义的 JavaScript 库或变量时
子资源完整性
子资源完整性(SRI)是一项安全功能,允许用户脚本开发者确保他们在用户脚本中包含的外部资源(例如 JavaScript 库和 CSS 文件)没有被修改或篡改,这是通过生成资源的加密哈希并在 @require 和 @resource 标记中包含它来实现的,当用户脚本被安装时,Tampermonkey 将计算资源的哈希并与包含的哈希进行比较,如果两个哈希不匹配,Tampermonkey 将拒绝加载资源,从而防止攻击者向您的用户脚本中注入恶意代码
@resource 和 @require 标记 URL 的哈希组件用于此目的
// @resource SRIsecured1 http://example.com/favicon1.ico#md5=ad34bb...
// @resource SRIsecured2 http://example.com/favicon2.ico#md5=ac3434...,sha256=23fd34...
// @require https://code.jquery.com/jquery-2.1.1.min.js#md5=45eef...
// @require https://code.jquery.com/jquery-2.1.2.min.js#md5-ac56d...,sha256-6e789...
// @require https://code.jquery.com/jquery-3.6.0.min.js#sha256-/xUj+3OJU...ogEvDej/m4=
Tampermonkey 内置支持 SHA-256 和 MD5 哈希,所有其他哈希(SHA-1、SHA-384 和 SHA-512)取决于 window.crypto
如果给出多个哈希(用逗号或分号分隔),Tampermonkey 将使用当前支持的最后一个,所有哈希都需要以十六进制或 Base64 格式编码
GM_addElement(tag_name, attributes), GM_addElement(parent_node, tag_name, attributes)
GM_addElement 允许 Tampermonkey 脚本向页面添加新元素,这在某些情况下很有用,例如当页面使用内容安全策略(CSP)限制 script 和 img 标签时
它创建由 “tag_name” 指定的 HTML 元素,应用所有给定的 “attributes”,并返回注入的 HTML 元素,如果给出 “parent_node”,则将其附加到其上或者附加到文档头或主体
适合的 “attributes” 请参考相关文档,例如:
script标签img标签style标签
GM_addElement('script', {
textContent: 'window.foo = "bar";'
});
GM_addElement('script', {
src: 'https://example.com/script.js',
type: 'text/javascript'
});
GM_addElement(document.getElementsByTagName('div')[0], 'img', {
src: 'https://example.com/image.png'
});
GM_addElement(shadowDOM, 'style', {
textContent: 'div { color: black; };'
});
注意:此功能仍在实验阶段,API 可能会更改
GM_addStyle(css)
向文档添加给定样式并返回注入的样式元素
GM_download(details), GM_download(url, name)
GM_download 允许用户脚本从指定 URL 下载文件并保存到用户的本地机器
GM_download 函数接受以下参数:
details 可以具有以下属性:
-
url:要下载的文件的 URL,这必须是一个有效的 URL,并且必须指向用户可以访问的文件 -
name:下载文件的名称,应该包括文件扩展名,如 .txt 或 .pdf,出于安全原因,文件扩展名需要在 Tampermonkey 的选项页面上列入白名单 -
headers:包含要在下载请求中包含的 HTTP 头的对象,参见GM_xmlhttpRequest以获取更多详细信息, -
saveAs:一个布尔值,指示是使用用户的默认下载位置,还是提示用户选择其他位置,此选项仅在浏览器 API 模式下起作用 -
conflictAction:控制文件名称冲突时的行为的字符串,此选项仅在浏览器 API 模式下起作用,可能的值有uniquify、overwrite和prompt,请查看此链接以获取更多详细信息 -
onload:下载成功完成时调用的函数 -
onerror:如果下载失败或被取消,则调用的函数, -
onprogress:如果此下载有了一些进展,则执行的回调 -
ontimeout:如果由于超时导致此下载失败,则执行的回调
onerror 回调的 download 参数可以具有以下属性:
-
error:错误原因 -
not_enabled- 用户未启用下载功能 -
not_whitelisted- 所请求的文件扩展名未在白名单中 -
not_permitted- 用户启用了下载功能,但未授予下载权限 -
not_supported- 浏览器/版本不支持下载功能 -
not_succeeded- 下载未启动或失败,details属性可能提供更多信息 -
details:关于该错误的详细信息
返回一个具有以下属性的对象:
abort:可调用以取消此下载的函数
根据下载模式,GM_info 提供一个名为 downloadMode 的属性,其设置为以下值之一:native、disabled 或 browser
GM_download("http://example.com/file.txt", "file.txt");
const download = GM_download({
url: "http://example.com/file.txt",
name: "file.txt",
saveAs: true
});
// 5秒后取消下载
window.setTimeout(() => download.abort(), 5000);
注意:浏览器可能会修改所需的文件名,特别是如果浏览器发现在当前操作系统下安全下载该文件扩展名,可能会添加文件扩展名
GM_getResourceText(name)
允许用户脚本访问通过 @resource 加载到用户脚本中的资源(如 JavaScript 或 CSS 文件)的文本
该函数需要一个参数,即要检索的资源的“名称”,它返回资源文本作为字符串
下面是一个函数用法示例:
const scriptText = GM_getResourceText("myscript.js");
const script = document.createElement("script");
script.textContent = scriptText;
document.body.appendChild(script);
GM_getResourceURL(name)
GM_getResourceURL 允许用户脚本访问通过 @resource 标记加载到用户脚本中的资源(如 CSS 或图像文件)的 URL
该函数需要一个参数,即要检索的资源的“名称”,它返回资源的 URL 作为字符串
const imageUrl = GM_getResourceURL("myimage.png");
const image = document.createElement("img");
image.src = imageUrl;
document.body.appendChild(image);
GM_info
获取关于脚本和 TM 的一些信息,对象可能如下所示:
type ScriptGetInfo = {
downloadMode: string,
isFirstPartyIsolation?: boolean,
isIncognito: boolean,
sandboxMode: SandboxMode,
scriptHandler: string,
scriptMetaStr: string | null,
scriptUpdateURL: string | null,
scriptWillUpdate: boolean,
version?: string,
script: {
antifeatures: { [antifeature: string]: { [locale: string]: string } },
author: string | null,
blockers: string[],
connects: string[],
copyright: string | null,
deleted?: number | undefined,
description_i18n: { [locale: string]: string } | null,
description: string,
downloadURL: string | null,
excludes: string[],
fileURL: string | null,
grant: string[],
header: string | null,
homepage: string | null,
icon: string | null,
icon64: string | null,
includes: string[],
lastModified: number,
matches: string[],
name_i18n: { [locale: string]: string } | null,
name: string,
namespace: string | null,
position: number,
resources: Resource[],
supportURL: string | null,
system?: boolean | undefined,
'run-at': string | null,
unwrap: boolean | null,
updateURL: string | null,
version: string,
webRequest: WebRequestRule[] | null,
options: {
check_for_updates: boolean,
comment: string | null,
compatopts_for_requires: boolean,
compat_wrappedjsobject: boolean,
compat_metadata: boolean,
compat_foreach: boolean,
compat_powerful_this: boolean | null,
sandbox: string | null,
noframes: boolean | null,
unwrap: boolean | null,
run_at: string | null,
tab_types: string | null,
override: {
use_includes: string[],
orig_includes: string[],
merge_includes: boolean,
use_matches: string[],
orig_matches: string[],
merge_matches: boolean,
use_excludes: string[],
orig_excludes: string[],
merge_excludes: boolean,
use_connects: string[],
orig_connects: string[],
merge_connects: boolean,
use_blockers: string[],
orig_run_at: string | null,
orig_noframes: boolean | null
}
}
}
};
type SandboxMode = 'js' | 'raw' | 'dom';
type Resource = {
name: string,
url: string,
error?: string,
content?: string,
meta?: string
};
type WebRequestRule = {
selector: { include?: string | string[], match?: string | string[], exclude?: string | string[] } | string,
action: string | {
cancel?: boolean,
redirect?: {
url: string,
from?: string,
to?: string
} | string
}
};
GM_log(message)
将消息记录到控制台
GM_notification(details, ondone), GM_notification(text, title, image, onclick)
GM_notification 允许用户显示屏幕通知,使用提供的消息和其他可选参数
该函数接受多个参数,要么是一个 details 对象,要么是多个参数
details 对象可以具有以下属性,其中一些也可以用作直接参数,可用的选项包括:
-
text:包含要在通知中显示的消息的字符串, -
title:通知的标题 -
image:通知中显示的图像的 URL -
highlight:一个布尔标志,指示是否突出显示发送通知的选项卡(除非设置了文本) -
silent:一个布尔标志,指示是否不播放声音, -
timeout:通知应自动关闭之前的毫秒数 -
onclick:用户单击通知时将调用的回调函数 -
ondone:通知被关闭(无论是由超时还是点击触发)或标签被突出显示时调用的回调函数
该函数不返回任何值
下面是一个函数用法示例:
GM_notification({
text: "This is the notification message.",
title: "Notification Title",
onclick: () => alert('I was clicked!')
});
GM_openInTab(url, options), GM_openInTab(url, loadInBackground)
GM_openInTab 允许用户脚本在浏览器中打开新选项卡并导航到指定的 URL
该函数需要两个参数:
-
一个字符串
"url",包含要在新选项卡中打开的页面的 URL -
一个可选的
options对象,可用于自定义新选项卡的行为,可用的选项包括:-
active:指示新选项卡是否应该处于活动(选中)状态的布尔值,默认值为false -
insert:表示新选项卡应插入到标签条中的位置的整数,默认值为false,这意味着新选项卡将添加到标签条的末尾 -
setParent:一个布尔值,指示新选项卡是否应视为当前选项卡的子项,默认值为 false -
incognito:一个布尔值,使打开的选项卡在隐身/私密窗口中 -
loadInBackground:与active相反的意思,用于实现 Greasemonkey 3.x 的兼容性
-
该函数返回一个具有 close 函数、onclose 监听器和 closed 标志的对象
下面是一个函数用法示例:
// 打开新选项卡并导航到指定的 URL
GM_openInTab("https://www.example.com/");
GM_registerMenuCommand(name, callback, accessKey)
GM_registerMenuCommand 允许用户脚本在浏览器中添加新条目到用户脚本菜单,并指定在选择菜单项时调用的函数
该函数需要三个参数:
-
name:包含要为菜单项显示的文本的字符串 -
callback:选择菜单项时调用的函数,该函数将传递一个参数,即当前活动选项卡 -
accessKey:菜单项的可选快捷键,例如,如果快捷键为s,则用户可以在打开 Tampermonkey 弹出菜单时按s来选择该菜单项
该函数返回一个菜单项 ID,可用于取消注册命令
下面是一个函数用法示例:
const menu_command_id = GM_registerMenuCommand("Show Alert", function(event) {
alert("Menu item selected");
}, "a");
GM_unregisterMenuCommand(menuCmdId)
GM_unregisterMenuCommand 从浏览器中删除现有的用户脚本菜单项
该函数需要一个参数,即要删除的菜单项的 ID,它不返回任何值
下面是一个函数用法示例:
const menu_command_id = GM_registerMenuCommand(...);
GM_unregisterMenuCommand(menu_command_id);
GM_setClipboard(data, info)
GM_setClipboard 将剪贴板文本设置为指定值
该函数需要一个参数 “data”,它是要设置为剪贴板文本的值,和一个参数 “info”
“info” 可以只是一个表示 text 或 html 类型的字符串,或者是一个像这样的对象:
{
type: 'text',
mimetype: 'text/plain'
}
示例用法:
GM_setClipboard("This is the clipboard text.", "text");
GM_getTab(callback)
GM_getTab 函数需要一个参数,是一个回调函数,它将使用一个对象调用,只要此选项卡处于打开状态,该对象就会持续存在
GM_getTab((tab) => console.log(tab));
GM_saveTab(tab)
GM_saveTab 函数允许用户脚本保存有关选项卡的信息以供后用
该函数需要一个 tab 参数,它是一个包含要保存的选项卡信息的对象
GM_saveTab 函数保存提供的选项卡信息,以便以后可以使用 GM_getValue 函数检索
下面是 GM_saveTab 函数在用户脚本中的用法示例:
GM_getTab(function(tab) {
tab.newInfo = "new!";
GM_saveTab(tab);
});
在这个示例中,在调用 GM_saveTab 函数时传递了由 GM_getTab 函数返回的 tab 对象,以及一个名为 "newInfo" 的新键
GM_getTabs(callback)
GM_getTabs 函数需要一个参数:一个回调函数,它将使用选项卡信息进行调用
传递给回调函数的 "tabs" 对象包含对象,每个对象表示由 GM_saveTab 存储的保存的选项卡信息
GM_getTabs((tabs) => {
for (const [tabId, tab] of Object.entries(tabs)) {
console.log(`tab ${tabId}`, tab);
}
});
GM_setValue(key, value)
GM_setValue 允许用户脚本为用户脚本存储设置特定键的值
GM_setValue 函数需要两个参数:
- 一个字符串,指定应设置值的键
- 要为该键设置的值,此值可以是任何类型(字符串、数字、对象等)
GM_setValue 函数不返回任何值,相反,它会在用户脚本的存储中为指定的键设置提供的值
下面是 GM_setValue 及其异步版本 GM.setValue 在用户脚本中的用法示例:
GM_setValue("someKey", "someData");
await GM.setValue("otherKey", "otherData");
GM_getValue(key, defaultValue)
GM_getValue 函数允许用户脚本检索扩展存储中特定键的值
它需要两个参数:
-
一个字符串,指定要检索其值的键
-
如果键不存在于扩展的存储中,则返回的默认值,此默认值可以是任何类型(字符串、数字、对象等)
GM_getValue 函数返回指定键在扩展存储中的值,如果键不存在则返回默认值
下面是 GM_getValue 函数在用户脚本中的用法示例:
const someKey = GM_getValue("someKey", null);
const otherKey = await GM.getValue("otherKey", null);
在此示例中,使用键 "someKey" 和默认值 null 调用了 GM_getValue 函数
如果 "someKey" 键存在于扩展的存储中,则其值将被返回并存储
在 someKey 变量中,如果键不存在,则返回默认值 null 并存储在 savedTab 变量中
GM_deleteValue(key)
从用户脚本的存储中删除“key”
GM_deleteValue("someKey");
await GM.deleteValue("otherKey");
GM_listValues()
GM_listValues 函数返回存储所有数据的键的列表
const keys = GM_listValues();
const asyncKeys = await GM.listValues();
GM_addValueChangeListener(key, (key, old_value, new_value, remote) => void)
GM_addValueChangeListener 函数允许用户脚本添加监听器,以监视用户脚本存储中特定键的值的更改
该函数需要两个参数:
-
一个字符串,指定应监视其更改的键
-
值更改时将被调用的回调函数,回调函数的签名应为:
function(key, oldValue, newValue, remote) { // key 是值已改变的键 // oldValue 是键的前一个值 // newValue 是键的新值 // remote 是一个布尔值,指示更改是否源自不同的用户脚本实例 }
GM_addValueChangeListener 函数返回一个listenerId值,可用于稍后使用 GM_removeValueChangeListener 函数删除侦听器
GM.addValueChangeListener 和 GM.removeValueChangeListener 的工作方式完全相同,唯一的区别是它们都返回一个 promise
下面是一个 GM_addValueChangeListener 函数在用户脚本中的用法示例:
// 添加监听器以监视“savedTab”键的更改
var listenerId = GM_addValueChangeListener("savedTab", function(key, oldValue, newValue, remote) {
// 当“savedTab”键的值更改时,在控制台中打印一条消息
console.log("The value of the '" + key + "' key has changed from '" + oldValue + "' to '" + newValue + "'");
});
GM_addValueChangeListener 可以由用户脚本用于与其他标签上的用户脚本实例进行通信
GM_removeValueChangeListener(listenerId)
GM_removeValueChangeListener 和 GM.removeValueChangeListener 都有一个名为 listenerId 的参数,用于删除具有该 ID 的更改侦听器
GM_xmlhttpRequest(details)
GM_xmlhttpRequest 允许用户脚本发送 HTTP 请求并处理响应
该函数需要一个参数:一个对象,包含要发送的请求的详细信息和接收响应时要调用的回调函数
对象可以具有以下属性:
method:GET、HEAD、POST之一url:目标 URLheaders:例如user-agent、referer等(Safari 和 Android 浏览器不支持某些特殊头)data:通过 POST 请求发送的字符串redirect:follow、error或manual之一;在检测到重定向时控制发生的情况(版本 6180+ 强制 fetch 模式)cookie:要修补到已发送 cookie 设置中的 cookiebinary:以二进制模式发送数据字符串nocache:不缓存资源revalidate:重新验证可能已缓存的内容timeout:超时时间(毫秒)context:将添加到响应对象的属性responseType:arraybuffer、blob、json或stream之一overrideMimeType:请求的 MIME 类型anonymous:不随请求一起发送 cookie(强制 fetch 模式)fetch:使用fetch代替XMLHttpRequest请求(在 Chrome 上这会导致details.timeout和xhr.onprogress不起作用,并且只使xhr.onreadystatechange收到readyStateDONE(==4)事件)user:身份验证的用户名password:密码onabort:请求中止时执行的回调onerror:请求失败时执行的回调onloadstart:加载开始时执行的回调,如果responseType设置为stream,则可以访问流对象onprogress:请求有进展时执行的回调onreadystatechange:请求的readyState改变时执行的回调ontimeout:请求因超时失败时执行的回调onload:请求加载完成时执行的回调,函数签名为:
function(response) {
// response 是一个包含响应详细信息的对象
}
response 具有以下属性:
finalUrl- 重定向后的最终 URL,从中加载数据readyState- 请求的readyStatestatus- 请求的状态statusText- 请求的状态文本responseHeaders- 请求的响应头response- 如果details.responseType被设置,则为对象形式的响应数据responseXML- 响应数据作为 XML 文档responseText- 响应数据作为纯字符串
GM_xmlhttpRequest 返回一个具有以下属性的对象:
abort- 可以调用以取消请求的函数
下面是一个 GM_xmlhttpRequest 函数在用户脚本中的示例用法:
GM_xmlhttpRequest({
method: "GET",
url: "https://example.com/",
headers: {
"Content-Type": "application/json"
},
onload: function(response) {
console.log(response.responseText);
}
});
注意:不支持 details 中的 synchronous 标志
重要提示:如果要使用此方法,请也查看有关 @connect 的文档
GM_webRequest(rules, listener)
注意:此 API 为实验性的,可能会随时更改或消失,可能还会在 manifest v3 迁移期间消失或改变
GM_webRequest (重新)注册网络请求操作规则及触发规则的监听器
如果你只需要注册规则,最好使用 @webRequest 头
注意,webRequest 仅处理具有 sub_frame、script、xhr 和 websocket 类型的请求
参数:
-
rules - object[],规则数组,具有以下属性:-
selector - string|object,用于触发规则的 URL,字符串值是{ include: [selector] }的缩写,对象属性:include - string|string[],用于触发规则的 URL、模式和正则表达式match - string|string[],用于触发规则的 URL 和模式;exclude - string|string[],不触发规则的 URL、模式和正则表达式
-
action - string|object,对请求进行的操作,字符串值"cancel"是{ cancel: true }的缩写,对象属性:cancel - boolean,是否取消请求redirect - string|object,重定向到@match或@include头中包含的某个 URL,字符串时重定向到静态 URL,如果是对象:from - string,一个正则表达式来提取 URL 的某些部分,例如"([^:]+)://match.me/(.*)"to - string,替换模式,例如"$1://redirected.to/$2"
-
-
listener - function,规则被触发时调用,无法影响规则动作,参数:info - string,操作类型:"cancel"、"redirect"message - string,"ok"或"error"details - object,关于请求和规则的信息rule - object,被触发的规则url - string,请求的 URLredirect_url - string,请求被重定向到的位置;description - string,错误描述
示例:
GM_webRequest([
{ selector: '*cancel.me/*', action: 'cancel' },
{ selector: { include: '*', exclude: 'http://exclude.me/*' }, action: { redirect: 'http://new_static.url' } },
{ selector: { match: '*://match.me/*' }, action: { redirect: { from: '([^:]+)://match.me/(.*)', to: '$1://redirected.to/$2' } } }
], function(info, message, details) {
console.log(info, message, details);
});
GM_cookie.list(details[, callback])
注意:GM_cookie API 为实验性的,某些Tampermonkey版本可能会返回不支持错误
Tampermonkey会检查脚本是否有@include或@match访问给定details.url参数的权限!
参数:
-
details - object,包含要检索的cookie的属性url - string?,表示要从中检索cookie的URL(默认为当前文档URL)domain - string?,表示要检索的cookie的域name - string?,表示要检索的cookie的名称path - string?,表示要检索的cookie的路径
-
callback - function?,在检索到cookie时调用,该函数将传入两个参数:cookies -object[],表示检索到的cookieerror - string,表示发生的错误消息,如果没有错误则为null
cookie对象具有以下属性:
domain - string,表示cookie的域firstPartyDomain - string?, cookie的首方域hostOnly - bool,指示cookie是否为主机仅cookiehttpOnly - bool,指示cookie是否为HTTP仅cookiename - string,表示cookie的名称path - string,表示cookie的路径sameSite - string,表示cookie的SameSite属性secure - bool,指示cookie是否需要安全连接session - bool,指示cookie是否为会话cookievalue - string,表示cookie的值
示例用法:
// 检索所有名为“mycookie”的cookie
GM_cookie.list({ name: "mycookie" }, function(cookies, error) {
if (!error) {
console.log(cookies);
} else {
console.error(error);
}
});
// 检索当前域的所有cookie
const cookies = await GM.cookies.list()
console.log(cookies);
GM_cookie.set(details[, callback])
使用给定详细信息设置cookie,支持的属性在这里定义
参数:
-
details - object: 包含要设置的cookie详细信息的对象,对象可以具有以下属性:url - string?,与cookie相关联的URL,如果未指定,则cookie与当前文档的URL相关联name - string,cookie的名称value - string,cookie的值domain - string?,cookie的域firstPartyDomain - string?: cookie的首方域path - string?,cookie的路径secure - bool?,是否仅通过HTTPS发送cookiehttpOnly - bool?,是否将cookie标记为HttpOnlyexpirationDate - number?,cookie的过期日期,以Unix纪元以来的秒数,如果未指定,则cookie永不过期
-
callback - function?,操作完成时要调用的函数,该函数传递一个参数:error - string?,如果设置cookie时出错,则包含错误消息,否则未定义
示例:
GM_cookie.set({
url: 'https://example.com',
name: 'name',
value: 'value',
domain: '.example.com',
path: '/',
secure: true,
httpOnly: true,
expirationDate: Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 30) // 30天后过期
}, function(error) {
if (error) {
console.error(error);
} else {
console.log('Cookie设置成功,');
}
});
GM.cookie.set({
name: 'name',
value: 'value'
})
.then(() => {
console.log('Cookie设置成功,');
})
.catch((error) => {
console.error(error);
});
GM_cookie.delete(details, callback)
删除cookie
参数:
详情对象必须包含以下至少一个属性:
url - string?,与cookie相关联的URL,如果未指定url,则使用当前文档的URLname - string?,要删除的cookie的名称,firstPartyDomain - string?:要删除的cookie的首方域
回调函数是可选的,它将在cookie被删除或发生错误时调用,它接受一个参数:
error - string?,错误消息,或在成功删除cookie时未定义
示例:
GM_cookie.delete({ name: 'cookie_name' }, function(error) {
if (error) {
console.error(error);
} else {
console.log('Cookie删除成功');
}
});
window.onurlchange
如果脚本在单页应用上运行,则可以使用window.onurlchange监听URL更改:
// ==UserScript==
...
// @grant window.onurlchange
// ==/UserScript==
if (window.onurlchange === null) {
// 支持该特性
window.addEventListener('urlchange', (info) => ...);
}
window.close
通常不允许JavaScript通过window.close关闭标签
但是,如果通过@grant请求权限,用户脚本可以做到这一点
注意:出于安全考虑,不允许关闭窗口的最后一个标签
// ==UserScript==
...
// @grant window.close
// ==/UserScript==
if (condition) {
window.close();
}
window.focus
window.focus将窗口移到前面,而unsafeWindow.focus可能由于用户设置而失败
// ==UserScript==
...
// @grant window.focus
// ==/UserScript==
if (condition) {
window.focus();
}
<><![CDATA[...]]></>
基于CDATA的元数据存储方式通过兼容性选项支持 Tampermonkey会尝试自动检测脚本是否需要启用此选项
var inline_src = (<><![CDATA[
console.log('Hello World!');
]]></>).toString();
eval(inline_src);