TamperMonkey开发文档
一、概述
TamperMonkey
Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器,它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。
虽然有些受支持的浏览器拥有原生的用户脚本支持,但 Tampermonkey 将在您的用户脚本管理方面提供更多的便利。 它提供了诸如便捷脚本安装、自动更新检查、标签中的脚本运行状况速览、内置的编辑器等众多功能, 同时Tampermonkey还有可能正常运行原本并不兼容的脚本。
Chrome Extension
从本质上讲,TamperMonkey是一个用于管理Chrome Extension的软件。
我们经常说的 Chrome “插件”,其实不是真正意义上的 Chrome Plug-in,一般是指 Chrome Extension(简称“拓展”)。
- 扩展(Extension),指的是通过调用 Chrome 提供的 Chrome API 来扩展浏览器功能的一种组件,工作在浏览器层面,使用 HTML + Javascript 语言开发。
- 插件(Plug-in),指的是通过调用 Webkit 内核 NPAPI/PPAPI 来扩展内核功能的一种组件,工作在内核层面,理论上可以用任何一种生成本地二进制程序的语言开发,比如 C/C++、Delphi 等。比如 Flash player 插件,就属于这种类型。一般在网页中用
<object>或者<embed>标签声明的部分,就要靠插件来渲染。
Chrome 拓展的 JS 主要可以分为这 5 类:injected script、content-script、popup js、background js 和 devtools js,
| JS种类 | 可访问的API | DOM访问情况 | JS访问情况 | 直接跨域 |
|---|---|---|---|---|
| injected script | 和普通 JS 无任何差别,不能访问任何扩展 API | 可以访问 | 可以访问 | 不可以 |
| content script | 只能访问 extension、runtime 等部分API | 可以访问 | 不可以 | 不可以 |
| popup js | 可访问绝大部分 API,除了 devtools 系列 | 不可直接访问 | 不可以 | 可以 |
| background js | 可访问绝大部分 API,除了 devtools 系列 | 不可直接访问 | 不可以 | 可以 |
| devtools js | 只能访问 devtools、extension、runtime 等部分API | 可以 | 可以 | 不可以 |
二、用户脚本标记头
- @name
- @namespace
- @version
- @author
- @description
- @homepage, @homepageURL, @website and @source
- @icon, @iconURL and @defaulticon
- @icon64 and @icon64URL
- @updateURL
- @downloadURL
- @supportURL
- @include
- @match
- @exclude
- @require
- @resource
- @connect
- @run-at
- @grant
- @noframes
- @unwrap
- @nocompat
三、应用编程接口
通用类
- GM_log(message)
- GM_info
本地存储类
GM存储并不是浏览器的localStorage数据,而是TM自行定义的,仅在本TM内部有效。
GM_setValue(name, value)
GM_getValue(name, defaultValue)
GM_deleteValue(name)
GM_listValues()
这个函数的返回值很奇葩!是一个包含所有name的数组,而不是value。
而且,js中for循环中的自变量,如果母体是Array,自变量是计数器,而非数组的内容。1
2
3
4const names = GM_listValues();
let rs = new Map();
for (let i in names) rs.set(names[i], GM_getValue(names[i]));
console.log('GM_listValues:', rs);
GM_addValueChangeListener可以对某个存储变量设置侦听器,用于不同浏览器选项卡的脚本之间的通信。
其中,回调函数的remote参数显示这个值是在另一个选项卡的实例中修改的true,还是在这个脚本实例中修改的false。
- GM_addValueChangeListener(name, function(name, old_value, new_value, remote) {})
- GM_removeValueChangeListener(listener_id)
配置信息类
- GM_getResourceText(name)
- GM_getResourceURL(name)
- GM_registerMenuCommand(name, fn, accessKey)
- GM_unregisterMenuCommand(menuCmdId)
外部接口类
- GM_openInTab(url, options), GM_openInTab(url, loadInBackground)
使用此url打开一个新选项卡,和window.open()功能类似。
注意,其返回值并不是标准的window对象,而是一个包含函数close、侦听器onclosed、closed标记的奇怪对象。 - GM_xmlhttpRequest(details)
重要!!!由于TM运行在浏览器中,无法访问host数据,只能通过XHR保存爬取来的数据。 - GM_download(details), GM_download(url, name)
- GM_getTab(callback)
- GM_saveTab(tab)
- GM_getTabs(callback)
- GM_setClipboard(data, info)
DOM资源类
- unsafeWindow
默认TM可以访问DOM,但不可以直接调用页面javascript函数。
如果头文件包含// @grant unsafeWindow,就可以通过safeWindow对象提供对页面javascript函数和变量的完全访问 - GM_addStyle(css)
将给定的样式添加到文档并返回注入的样式元素。 - Subresource Integrity
@resource 和 @require 标记 URL 的哈希组件可用于此目的。 - GM_notification(details, ondone), GM_notification(text, title, image, onclick)
显示 HTML5 桌面通知和/或突出显示当前选项卡。 - <></>
Tampermonkey支持这种存储元数据的方式。TM尝试自动检测脚本是否需要启用此兼容性选项。
四、TamperMonkey的默认用户脚本
1 | // ==UserScript== |
1 | --Start Firefox-- |
参考文献
官方文档
- TamperMonkey官方文档
- Greasy Fork: 一个提供用户脚本的网站
- TamperMonkey中文参考文档
- ECMAScript 6 经典教程
- Chrome DevTools Extensions官方文档
- Chrome DevTools Extensions中文文档
- Chrome 内容安全策略(CSP)
- 深入理解 Chrome DevTools