坤坤腳本

編寫說明

本站發布的腳本給坤坤瀏覽器安裝。客戶端接近油猴,但不是完整桌面版。發布前用下面的規則自查,能少踩安裝失敗和更新不生效。

網站語言是網址裡的目錄,例如 /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 很嚴,或者腳本和相依特別大。