grant

none就是直接运行在前端页面中

否则就是运行在一个沙盒环境,需要使用unsafeWindow去操作前端的元素.

unsafeWindow可以调用GM_*函数去执行一些更强大的操作,但一些原有的函数不能调用,也可以通过grant进行获得

1
2
3
4
5
//@grant none

//使用unsafewindow
//@grant unsafeWindow
//@grant window.onurlchange

onurlchange为url变换时调用的函数

沙盒

[油猴脚本开发指南]沙盒机制的前世今生-油猴中文网

RUN-AT

1
2
3
4
5
//脚本尽快注入,加载完html标签就执行
// @run-at document-start

//脚本在网页加载结束时注入,加载完js等执行
// @run-at document-end

GM_*函数/油猴API

Tampermonkey油猴用户脚本API文档

GM_*函数使用前都需要申明

1
//@grant GM_*

GM_xmlhttpRequest跨域请求

GM_xmlhttpRequest 函数跨域与JQuery相似

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
//示例
GM_xmlhttpRequest({
        url:"https://api.bilibili.com/x/relation/modify",
        method :"POST",
        data:"fid=1037793830&act=1&re_src=11&jsonp=jsonp&csrf=e37f1881fd98f16756d16ab71109d37a",
        headers: {
            "Content-type": "application/x-www-form-urlencoded"
        },
        onload:function(xhr){
            console.log(xhr.responseText);
        }//onload相当于success
    });

使用前需要申明使用了api和链接的域名

1
2
// @grant        GM_xmlhttpRequest
// @connect      api.bilibili.com

外部资源引用

js资源的引用

1
// @require      https://jsd.imbai.cn/pics/npm/vue@2.6.12/dist/vue.min.js

如果是在沙盒环境(unsafeWindow)下,window函数不可用

如果是在原网环境下,可能会与原网页引用的js冲突

GM_*函数没用时的备用方法

1
2
3
4
let script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.src = "https://jsd.imbai.cn/pics/npm/vue@2.6.12/dist/vue.min.js";
document.documentElement.appendChild(script);

css资源的引用

1
2
3
4
5
// @resource css https://blog.icodef.com/wp-content/themes/Kratos-3.0.7/assets/css/kratos.min.css?ver=3.2.4
//此处css为变量名

console.log(GM_getResourceURL("css"),GM_getResourceText("css"));//url是一个base64的url,text为css内容
GM_addStyle(GM_getResourceText("css"));

备用方法

1
2
3
4
5
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);

备用方法缺点:没有预加载好资源,很明显的感觉到了刷新的样子. js的也一样

JQuery引入冲突解决办法

在开头引入这一段代码

1
this.$ = this.jQuery = jQuery.noConflict(true);

油猴菜单设置

鼠标右键菜单

1
2
3
// @run-at       context-menu
//申明后执行下面代码
alert("菜单被点击了");

浏览器右上角菜单

1
2
// @grant    GM_registerMenuCommand
// @grant    GM_unregisterMenuCommand

语法:

1
2
3
GM_registerMenuCommand("菜单名字",执行的函数名,快捷键);
//例如:
GM_registerMenuCommand("投币任务",tb,"t");
1
2
let id = GM_registerMenuCommand("菜单名字",执行的函数名,快捷键);
GM_unregisterMenuCommand(id);//删除菜单

GM_get/setValue

1
2
3
4
// @grant        GM_setValue
// @grant        GM_getValue
GM_setValue("qqq",123);//将123赋值给qqq
GM_getValue("qqq");//输出123

GM_addStyle

1
GM_addStyle('#HMRichBox{display:none !important}')

给相应的标签添加样式display:none样式,广告将不会显示。

如果网页内的iframe标签也存在广告的话,匹配iframe标签内的域名,添加对应的css样式即可。

这里不采用js处理,js处理对于一些后加载和iframe标签内的广告无法处理,同时也会让广告显示一会再消失,体验不好