本文简要介绍本人对"油猴脚本","篡改猴"领域的一些见解,内容注定不可能一步到位和事无巨细,欢迎各位仁人志士对我批评指正,提出意见建议.
本文为本人原创,另外转载前请务必注明作者,否则统统视为侵权处理.
- 浏览器中有三个东西:插件,扩展和脚本,其中,
插件权限最大,不受浏览器约束,可以读写本地文件,可视为和普通软件(如qq,浏览器)是同级的,如过去被广泛内置的flash播放器插件.
扩展权限其次,是在浏览器中安装的软件,如油猴,Adblock.扩展要从浏览器的要求出发,权限会被浏览器进行一些约束,同一个扩展在不同浏览器上可能变化很大.
脚本权限最低,因为受到各种安全策略的限制(如同源策略,本地文件读写策略,剪贴板安全策略等),通常只能在同源页面下做一些人畜无害的事情.用户脚本只是一个以 .user.js 结尾的文本文件。
- 网路上最常见的所谓"油猴扩展",大多数情况下指的是是Tampermonkey(篡改猴).油猴扩展(Greasemonkey)是篡改猴的祖先,篡改猴可视为升级版油猴,油猴是谷歌工程师闲着无聊写的一个用户脚本管理器,而篡改猴作者来自德国.另外还有一些类似功能的扩展,如国产的暴力猴和脚本猫...另外greasyfork.org是一个脚本托管网站(统称为油叉),本人认为也是脚本托管领域中影响力最大的网站,可惜2025年春节后被墙.sleazyfork.org则是成人版的greasyfork.org.
- 为什么油猴用不了了?
这种情况往往是用户脚本而非脚本管理器失效,后者无需联网就能使用.互联网行业日新月异,更新迭代飞快,网页也是在时刻动态变化的,昨天刚写的适配于这个网页的脚本,明天可能就失效了,如果想要抵消这种变化,就必须投入频繁的维护,这可不是一个小工作.
- 对于1中提到的脚本权限低的问题,篡改猴其实也提供了一些绕过安全策略的操作,比如GM_xmlhttpRequest就可以规避同源策略;比如可以在设置里,选择"允许脚本读取本地文件"(Chrome浏览器有,Firefox不允许),这样就可以使用@require包含本地js资源;又如通过修改内容安全策略(CSP)头信息选项,可以绕过某些网页CSP方面的安全限制,等等.总之篡改猴作为扩展,把一些扩展级别的权限慷慨下放给了脚本.另外,一切具体操作细节取决于篡改猴的版本(篡改猴有两个版本,黑色的稳定版和红色的开发版)和版本号,另外浏览官网更新日志(篡改猴官网:tampermonkey.net)和善用网上搜索可以更好认识此领域
- 如果脚本的作用时机错误,脚本就无法发挥作用,篡改猴在元数据区共设有以下作用时机
- // @run-at document-start 网页加载开始前瞬间,是最早的时机,还是刚出现<html>时?此时机易出问题,不适合小白
- // @run-at document-body 网页加载基本完成,如果<body>存在,脚本将被注入。
- // @run-at document-end 网页加载基本完成,局部内容如图片、视频等尚未加载完成,可看作触发DocumentContentLoaded事件
- // @run-at document-idle 网页加载全部完成,也是缺省时机,如果脚本没有给出@run-at标记,默认为此,可看作触发load事件
- // @run-at context-menu 网页右键菜单栏,点击后执行脚本(注意:如果使用此值,所有@include和@exclude语句将被忽略,但这可能会在将来更改。)
复制代码 当然以上只是™提供的几类基础api,而实际情况会更复杂,比如很多网页使用了Ajax技术来灵活延迟网页加载过程,例如b站视频加载,百度搜索换页等,遇到以上情况需要自己琢磨适配的时机匹配思路,或是运用setTimeout、setInterval这样的简单延时函数,或是手写事件监听器、MutationObserver等对变化作出回调。
6. 作用域对于脚本同样是重中之重,作用域有误,脚本亦会成为摆设。篡改猴在元数据区共设有以下几类作用域:- // @include * 匹配全部网址,可以使用正则表达式,正在逐步淘汰此语法
- // @exclude * 排除全部网址,可以使用正则表达式
- // @exclude http*://www.example.com/*
- // @match *://*/* 匹配全部网址,只能使用简单的星号匹配规则,不能使用正则表达式,未来的主流语法
- // @match *://example.org/*
复制代码 题外话,*://*/*意为协议://域名/子路径,协议有http、https、ftp、file、moz-extension等类型,域名是把ip转为了便于人类记忆的字符串(一个域名可能映射多个ip),子路径则是域名下的分支路径。所谓同源策略(CORS策略)是指只要两个网址的协议/域名/端口号有任意部分不一致,就会判定为跨域,受到种种限制.
7. @grant方面,@grant用于授权GM_和GM.函数,unsafeWindow对象和一些强大的window函数。Greasemonkey 从版本 4 开始向性能更高的异步模型发展,旧的 API GM_* 通常是同步的,而新的 API GM.* 是异步的(采用 Promise),并且有些 API 的名称拼写也变更为采用驼峰命名规则(如GM.getResourceUrl,GM.xmlHttpRequest).详见www.greasespot.net例如存值就有GM_setValue和GM.setValue两种api,区别在于后者采用了Promise实现异步操作.(本人对存值api的一大不满是返回undefined而非设置的最新值),其他api同理,如GM_getValue和GM.getValue,GM_xmlhttpRequest和GM.xmlHttpRequest...异步操作是未来的主流.另外,GM_info是唯一一个无需授权就能使用的api(@grant none和没有使用@grant不同,只有前者可以用GM_info);只有在metadata区使用@grant声明了除none以外的任何其他api后,才能调用unsafeWindow.另外,关于标签页的授权api有GM.getTab,GM.saveTab,GM.getTabs,本人对此所知甚少,欢迎交流学习.
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |