坤坤脚本

编写说明

本站发布的脚本给坤坤浏览器安装。客户端接近油猴,但不是完整桌面版。发布前用下面的规则自查,能少踩安装失败和更新不生效。

网站语言是网址里的目录,例如 /zh-CN/、/zh-TW/、/ja/、/ko/、/id/、/en/。列表默认只显示这个语言的脚本。安装地址 /s/编号.user.js 不带语言目录。

发布

  1. 注册并登录。
  2. 打开「发布」,把完整源码贴进去。源码必须自带 ==UserScript== 头。
  3. 更新时打开该脚本的「发布新版本」,再贴一份新源码。不要改脚本 ID,否则已安装的用户收不到更新。

每人最多 50 个脚本。下架后安装链接返回 404,搜索里也不会出现。

最小可用脚本

// ==UserScript==
// @name         示例脚本
// @namespace    https://scripts.ikunbrowser.com
// @version      1.0.0
// @description  在示例页面加一行字
// @match        https://example.com/*
// @grant        none
// ==/UserScript==

(function () {
  document.body.insertAdjacentHTML("beforeend", "<p>示例脚本已运行</p>");
})();

元数据

至少要有 @name,以及 @match 或 @include 之一。

字段说明
@name优先用没有语言后缀的名字。只有 @name:zh-CN 这类本地化名时,用第一条。
@name:zh-CN @description:ja带语言的名称和说明。浏览对应目录时优先显示。没有单独的 @name 时,用第一条本地化名称判断脚本语言。
@namespace @version @description建议都写。@description:xx 只在没有默认描述时回退。
@matchChrome 匹配,可用 *://、*.example.com、<all_urls>。 站点页按这些规则里的域名列出脚本,地址像 /scripts/by-site/example.com。
@include @exclude通配 * ?,或 /正则/i。
@exclude-match按 match 规则排除。
@run-atdocument-start / document-end / document-body / document-idle。不写则是 idle。
@noframes子框架里不运行。
@grant未知权限不会导致安装失败。没实现的函数存在,但是空操作。
@require @resource只能是 http 或 https。各最多 8 个。data:、file:、相对路径会安装失败。
@connect @icon @author客户端忽略,不影响安装。

匹配、排除规则各最多 64 条。@require 每个不超过 512KB,合计约 1MB。@resource 每个不超过 256KB。

更新

客户端不做语义化版本比较。新脚本的 @version 去掉首尾空白后,必须和当前版本的字符串不同,用户手动检查更新才会换脚本。两个版本都空着,也算没变。

下发 /s/{id}.user.js 时,本站会在元数据块开头插入 @downloadURL 和 @updateURL,都指向这个地址。客户端只认第一条,所以不要依赖你自己写在后面的更新地址。不要把 @updateURL 指到 .meta.js,客户端会跳过这种地址。

浏览器不会在后台自动更新。用户在「设置 → 用户脚本」里手动检查。

安装链接

详情页的「安装」就是普通的 .user.js 链接。坤坤浏览器会拦截任何以 .user.js 结尾的 http(s) 地址并弹出确认框,不需要额外协议。

另外兼容 Greasy Fork 的地址:/scripts/编号.user.js、/scripts/编号.meta.js、/scripts/编号/code/名称.user.js,以及 /scripts/编号-名称 详情页和 /scripts/编号.json。发给坤坤浏览器的更新地址仍然是 /s/编号.user.js。

同一脚本、同一天、同一 IP 只计 1 次安装。

客户端能用的接口

同步的 GM_* 和 Promise 版 GM.* 都会注入。脚本跑在页面上下文里,unsafeWindow 就是页面的 window,没有独立沙箱。

接口行为
GM_addStyle GM_addElement插样式或元素。
GM_getValue按脚本隔离,存在本地。单个值最多 32KB。变更监听只在当前页,不跨标签。
GM_xmlhttpRequest支持常见方法、arraybuffer / blob。请求体最多 256KB,响应最多 1MB。只能访问公网 http(s),本机地址会被拒绝。不走页面 JS,也不走浏览器代理。
GM_setClipboard GM_download GM_openInTab剪贴板、应用内下载确认、新标签打开 http(s)。
GM_getResourceText GM_getResourceURL读安装时缓存的资源。
GM_registerMenuCommand当前页注册了命令时,底栏会出现「脚本命令」。
GM_notification只显示提示,没有点击回调。
GM_getTab只是当前脚本进程里的内存对象,不是多窗口。

下面这些写了 @grant 也能装上,但函数什么都不做:GM_cookie、GM_webRequest,以及上表没列出的其它权限。不要依赖改请求或读写 Cookie。

运行时要注意

什么样的脚本比较合适

适合改 DOM、加样式、存少量配置、偶尔发请求、剪贴板、下载文件、用菜单做开关,以及带一个 jQuery 这类 @require。

不适合强依赖 Cookie、拦截网络、必须精确卡在文档最开头、页面 CSP 很严,或者脚本和依赖特别大。