油猴是网页浏览器的扩展,通过它可以在任何网页中注入 javascript 代码片段,从而实现自己的功能或修改原网页的功能和行为。
元注释
元注释是通过注释声明脚本的信息,油猴扩展根据元注释来提供相应的功能,例如声明脚本名称、版本、自动更新、引用外部库、申请 API 权限等。
@name
脚本的名称。
// @name A test
@namespace
脚本的命名空间,脚本的唯一标识。当发不到共享平台例如 GreasyFork 如果不设置则自动生成唯一标识。
// @namespace http://tampermonkey.net/
@version
脚本的版本号。
// @version 0.1
@description
脚本简介
// @description try to take over the world!
@author
脚本的作者
// @author YourName
@homepage
主页地址,油猴管理面板中点击主页按钮即可跳转到此地址。
// @homepage http://tampermonkey.net
@copyright
版权声明显示在脚本编辑器的标题中,位于脚本名称的正下方;
@icon
脚本图标
// @icon http://ccp.noc.net.cn/images/logo1.png
@match
用于指定脚本应在其上运行的网页。匹配脚本作用的URL,可使用 * 通配符。
// @match <protocol>://<domain><path>
// @match https://blog.csdn.net/*/article/details/*
@exclude
排除匹配的URL
// @exclude *://ccp.noc.net.cn/Course/List*
@include
匹配包含的URL
// @include http://www.tampermonkey.net/*
// @include http://*
// @include https://*
// @include /^https:\/\/www\.tampermonkey\.net\/.*$/
// @include *
@require
引用第三方脚本
// @require http://libs.baidu.com/jquery/2.0.0/jquery.min.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...
@run-at
设置脚本运行时机,它的值可以是以下这些时机:
- document-start: 在文档渲染前注入脚本;
- document-end: 在调度 DOMContentLoaded 事件时或之后注入;
- document-body: 如果 body 元素存在,则将注入脚本;
- document-idle: 在调度 DOMContentLoaded 事件后注入。未设置
@run-at
标记则这是默认时机。 - context-menu: 在浏览器上下文菜单中单击该脚本时注入该脚本;
// @run-at document-start
// @run-at document-end
// @run-at document-body
// @run-at document-idle
// @run-at context-menu
@run-in
定义注入脚本的浏览器上下文的类型。此元键允许您控制脚本是否应该在正常浏览选项卡、隐身选项卡或两者中运行。这提供了基于浏览会话的隐私上下文确定脚本行为的灵活性。如果未指定 @run-in
标签,则脚本默认注入所有选项卡。
- normal-tabs: 该脚本将仅注入到正常浏览选项卡(非隐身模式,默认容器)中;
- incognito-tabs: 该脚本将仅在隐私模式浏览选项卡中注入,在 Firefox 中是所有不使用默认 cookie 的选项卡;
- container-id-x: 该脚本将仅注入到指定ID属于指定容器的选项卡中,当脚本在所需的容器上下文中运行时,可以通过检查
GM_info.container
来找到容器 ID;
// @run-in normal-tabs
// @run-in incognito-tabs
// @run-in container-id-2
// @run-in container-id-3
@connect
设置允许 GM_xmlhttpRequest
访问的域名,确保此跨域请求是计划内的行为;
// @connect tmnk.net
// @connect www.tampermonkey.net
// @connect self
// @connect localhost
// @connect 8.8.8.8
// @connect *
@noframes
此标记使脚本在主页上运行,但不在 iframe 上运行。
@grant
申请敏感函数的运行权限,例如申请油猴提供的 GM_*
、unsafeWindow
等函数权限,相当于放在脚本 header
里面让油猴提供相应权限;@grant none
油猴会在 window 对象注入运行,这样的话就无法使用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
@updateURL
检查用户脚本更新的 URL,注意需要 @version
标签才能使更新检查正常工作;
@downloadURL
定义检测到更新时下载脚本的 URL,如果使用值 none
则不会执行更新检查;
@supportURL
在脚本反馈页面显示的网址,用来提供支持或者问题反馈等作用;
@contributionURL
用于捐赠脚本作者的链接,该链接将显示在脚本的反馈页面。
@contributionAmount
建议捐赠金额,请配合 @contributionURL 使用。
应用程序接口
应用程序接口是油猴扩展为油猴脚本注入的对象,通过这些对象能够获得更强大的功能,比如异步 http 请求、原网页的全局对象、数据储存等。
unsafewindow
允许脚本可以完整访问原始页面,包括原始页面的脚本和变量。unsafewindow 是油猴提供的对象包含 window 对象和网页中更多数据,可以用它访问到原始网页中 JS 的变量。
// ==UserScript==
// @grant unsafeWindow
// ==/UserScript==
(function() {
'use strict';
console.log(unsafeWindow.document.title);
})();
GM_getValue
从油猴扩展的存储中访问指定 key 值,在没成功获取到数据的时候可返回默认值。
GM_getValue(name, defaultvalue)
GM_setValue
在油猴扩展的存储中写入键值对。
GM_setValue(name, value)
GM_deleteValue
删除油猴扩展的存储中的键。
GM_deleteValue(name)
GM_listValues
获取油猴扩展的存储中的所有键返回列表。
GM_addValueChangeListener
监听油猴扩展的存储中的键,当值发生变化时回调函数。
const listener_id = GM_addValueChangeListener('hello',function(name, old_value, new_value, remote){
// 回调函数
});
GM_removeValueChangeListener
移除油猴扩展的存储中的键监听器。
GM_removeValueChangeListener(listener_id)
GM_xmlhttprequest
异步请求数据。
GM_xmlhttpRequest({
method: "GET",
url: "http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp",
onload: function(res) {
if (res.status == 200) {
var text = res.responseText;
}
}
});
GM_setclipboard
将数据复制到剪贴板中,第一个参数是要复制的数据,第二个参数是mime类型,用于指定复制的数据类型。
GM_setclipboard(data, info)
GM_log
用于在控制台中打印日志,也可以使用原生的 console.log(xxx);
打印日志。
GM_log("Hello World")
GM_addStyle
向网页中指定元素
GM_addStyle("* {margin-top:0px !important; margin-left:0px !important}");
向指定id的元素,以及含有指定样式的元素添加css样式。
GM_notification
设置网页通知或提示。
GM_notification(details, ondone)
GM_notification(text, title, image, onclick)
GM_registerMenuCommand
注册菜单命令,浏览器油猴插件展示脚本名称时,会携带此菜单,方便用户做一些设置,而不用手动修改脚本。
GM_registerMenuCommand("菜单1", () => {
window.open("https://xxx.xxx.xxx/xxx", "_blank");
});
GM_openInTab
打开一个新的标签页面,类似 windown.open(url)。
GM_openInTab("https://www.baidu.com",{ active: true, setParent :true});
// active:true,新标签页获取页面焦点
// setParent :true:新标签页面关闭后,焦点重新回到源页面
应用示例
注入 CSS 样式
// ==UserScript==
// @resource css https://blog.icodef.com/wp-content/themes/Kratos-3.0.7/assets/css/kratos.min.css?ver=3.2.4
// ==/UserScript==
(function () {
'use strict';
console.log(GM_getResourceURL("css"),GM_getResourceText("css"));
GM_addStyle(GM_getResourceText("css"));
//相当于
let script = document.createElement('link');
script.setAttribute('rel', 'stylesheet');
script.setAttribute('type', 'text/css');
script.href = "https://blog.icodef.com/wp-content/themes/Kratos-3.0.7/assets/css/kratos.min.css?ver=3.2.4";
document.documentElement.appendChild(script);
})();
劫持默认方法
(function () {
'use strict';
let hookSetInterval = window.setInterval;
//替换原window.setInterval方法
window.setInterval = function(a, b){
return hookSetInterval(a, 1000 * 10);
}
})();
插入HTML元素
(function () {
'use strict';
let div = document.createElement("div");
div.innerHTML = '<span>span1</span><span>span2</span>';
document.body.append(div);
})();
引用外部 JS
(function () {
'use strict';
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.src = "https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.min.js";
document.documentElement.appendChild(script);
})();
或者在元注解中使用 @require
直接引入使用。
实践案例
案例:Bilibili 视频倍速
// ==UserScript==
// @name BilibiliFastPlay
// @namespace http://tampermonkey.net/
// @version 2024-12-11
// @description Bilibili视频加速
// @author Hileez
// @match https://www.bilibili.com/*
// @icon https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico
// @grant none
// @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js
// @run-at document-end
// ==/UserScript==
/* Bilibili视频加速 */
(function() {
'use strict';
let menuParent = null;
const timer = setInterval(() => {
menuParent = document.querySelector('.bpx-player-ctrl-playbackrate-menu');
if (menuParent != null) {
clearInterval(timer);
addMenu(menuParent)
}
}, 1000);
function addMenu(element) {
for (let index = 2.5; index < 6; index += 0.5) {
let li = document.createElement("li");
li.className = 'bpx-player-ctrl-playbackrate-menu-item';
li.innerText = `${index.toFixed(1)}x`;
li.setAttribute('data-value', index)
li.addEventListener('click', function() {
document.querySelector('video').playbackRate = index
})
element.insertBefore(li, menuParent.firstChild);
}
}
})();
发布脚本
油猴官方支持好几个网站,其中最常用的是 GreasyFork ,纯中文按提示操作即可。右上角点击’登录’(可以使用github账号登陆)。新账号登陆后,需要过30分钟左右后才能正式发布脚本。登陆之后,点击用户名称进入控制台,选择’发布你编写的脚本’,最后添加内容即可。
- @license 发布的脚本必须指定许可证;
- @namespace 不写时会默认自动生成,这样油猴管理面版中点击主页按钮即可跳转到此地址;
- @updateurl 不指定时也可以使用@homepage设置脚本更新地址;
参考文档
官方文档 https://www.tampermonkey.net/documentation.php