編寫說明
本站發布的腳本給坤坤瀏覽器安裝。客戶端接近油猴,但不是完整桌面版。發布前用下面的規則自查,能少踩安裝失敗和更新不生效。
網站語言是網址裡的目錄,例如 /zh-CN/、/zh-TW/、/ja/、/ko/、/id/、/en/。列表預設只顯示這個語言的腳本。安裝網址 /s/編號.user.js 不帶語言目錄。
發布
- 註冊並登入。
- 打開「發布」,把完整原始碼貼進去。原始碼必須自帶 ==UserScript== 標頭。
- 更新時打開該腳本的「發布新版本」,再貼一份新原始碼。不要改腳本 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 只在沒有預設描述時回退。 |
@match | Chrome 比對,可用 *://、*.example.com、<all_urls>。 站點頁按這些規則裡的網域列出腳本,網址像 /scripts/by-site/example.com。 |
@include @exclude | 萬用字元 * ?,或 /正規表示式/i。 |
@exclude-match | 按 match 規則排除。 |
@run-at | document-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。
執行時要注意
- 原始碼不超過 512KB。已安裝腳本最多 64 個。
- 頁面 CSP 禁止 unsafe-eval 時,腳本會靜默失敗。
- 單頁應用切換網址時,新比對到、且這次還沒跑過的腳本會執行;已經跑過的不會重跑。
- document-start 在新開的分頁裡才比較完整。剛裝完的目前頁面可能趕不上真正的頁首時機。
- 主頁和 about: 不注入。腳本報錯會被吞掉,頁面上看不到油猴那種執行日誌。
什麼樣的腳本比較合適
適合改 DOM、加樣式、存少量設定、偶爾發請求、剪貼簿、下載檔案、用選單做開關,以及帶一個 jQuery 這類 @require。
不適合強依賴 Cookie、攔截網路、必須精確卡在文件最開頭、頁面 CSP 很嚴,或者腳本和相依特別大。