Dokumentasi API
Ringkasan
Definisi API ekstensi ini didasarkan pada dokumentasi Tampermonkey. Karena keterbatasan waktu dan tenaga, hanya sebagian API yang telah diimplementasikan sejauh ini, dan akan terus diiterasi. API apa pun yang diperluas ekstensi ini atau yang berbeda dari API GM asli ditandai secara khusus dalam dokumentasi (menggunakan *). Beberapa API juga menyediakan padanan bergaya sinkron mengikuti aturan GM.* — lihat isi dokumentasi untuk detailnya.
Untuk definisi API yang terperinci, lihat scriptcat.d.ts atau petunjuk editor bawaan, karena dokumentasi mungkin tidak selalu terbaru. Untuk API khusus ekstensi ini, lihat Dokumentasi CatApi.
Anda juga dapat menemukan contoh terkait di direktori contoh.
Definisi
GM_info
Mendapatkan informasi tentang skrip, termasuk metadata dan parameter lingkungan runtime. Bidang yang umum digunakan meliputi scriptHandler, version, scriptMetaStr, scriptUpdateURL, downloadMode, dan lainnya. Lihat scriptcat.d.ts untuk definisi terperinci (meskipun tidak lengkap).
console.log(GM_info.scriptHandler);
console.log(GM_info.version);
console.log(GM_info.scriptMetaStr);
sandboxModesaat ini hanya memiliki nilairaw.runAttidak didukung.userAgentDatadidukung, tetapi mungkin tidak persis cocok dengan Tampermonkey.
GM_log *
Fungsi pencatatan log. Log skrip latar belakang dapat dilihat di log berjalan dasbor (klik kolom status berjalan). Dibandingkan dengan Tampermonkey, level log telah ditambahkan.
declare function GM_log(message: string, level?: GMTypes.LoggerLevel): void;
declare namespace GMTypes {
type LoggerLevel = "debug" | "info" | "warn" | "error";
}
GM_log("debug info", "debug");
GM_get/set/deleteValue
Mendapatkan atau mengatur nilai di penyimpanan. Data di bawah storageName yang sama dapat dibagikan dan disinkronkan secara waktu nyata.
// Tambahkan data — perhatikan bahwa data hanya dapat berupa salah satu dari bool/string/number/object; Anda tidak dapat menyimpan instance kelas
declare function GM_setValue(name: string, value: any): void;
// Dapatkan data
declare function GM_getValue(name: string, defaultValue?: any): any | undefined;
// Hapus data; mendapatkannya lagi mengembalikan undefined atau defaultValue
declare function GM_deleteValue(name: string): void;
GM_setValue("foo", 42);
const v = GM_getValue("foo", 0);
GM_deleteValue("foo");
Catatan: Saat GM_setValue dipanggil dengan undefined, ScriptCat menghapus kunci tersebut, tidak seperti Tampermonkey/GreaseMonkey, yang menyimpan undefined sebagai nilainya.
Catatan: Karena operasi data bersifat asinkron, memanggil window.close() segera setelah GM_setValue atau GM_deleteValue dapat mencegah data diperbarui dengan benar. Disarankan menggunakan await GM.setValue atau await GM.deleteValue untuk memastikan operasi data selesai.
GM_listValues
Mendaftar semua kunci.
declare function GM_listValues(): string[];
console.log(GM_listValues());
GM_setValues / GM_getValues / GM_deleteValues *
API get/set batch (ekstensi).
// Mengatur beberapa nilai; values adalah objek yang kuncinya adalah nama nilai dan nilainya adalah isi nilai
declare function GM_setValues(values: { [key: string]: any }): void;
// Mendapatkan beberapa nilai; jika keysOrDefaults adalah objek, nilainya digunakan sebagai bawaan
declare function GM_getValues(keysOrDefaults: { [key: string]: any } | string[] | null | undefined): { [key: string]: any };
// Menghapus beberapa nilai; names adalah array string
declare function GM_deleteValues(names: string[]): void;
// Set batch
GM_setValues({ a: 1, b: 2 });
// Get batch (mengembalikan bawaan jika tidak ada)
const { a, b, c = 3 } = GM_getValues({ a: 0, b: 0, c: 3 });
// Hapus batch
GM_deleteValues(["a", "b"]);
Catatan: Karena operasi data bersifat asinkron, memanggil window.close() segera setelah GM_setValues atau GM_deleteValues dapat mencegah data diperbarui dengan benar. Disarankan menggunakan await GM.setValues atau await GM.deleteValues untuk memastikan operasi data selesai.
GM_add/removeValueChangeListener
tabiddihapus setelah 0.17.0-alpha — lihat GM_cookie untuk detailnya.
Mendengarkan perubahan nilai. add mengembalikan id pendengar, dan remove dapat digunakan untuk membatalkan pendengar. Metode ini dapat digunakan untuk mengimplementasikan komunikasi sederhana; menggunakan storageName memungkinkan komunikasi lintas skrip.
// tabid hanya ada saat mendengarkan dari skrip latar belakang
type ValueChangeListener = (
name: string,
oldValue: any,
newValue: any,
remote: boolean,
tabid?: number
) => any;
declare function GM_addValueChangeListener(
name: string,
listener: GMTypes.ValueChangeListener
): number;
declare function GM_removeValueChangeListener(listenerId: number): void;
const id = GM_addValueChangeListener("foo", (k, oldV, newV, remote) => {
console.log(k, oldV, newV, remote);
});
GM_removeValueChangeListener(id);
GM_getResourceText/GM_getResourceURL
Mendapatkan informasi sumber daya yang dideklarasikan dengan @resource.
// GM_getResourceText mendapatkan data teks sumber daya; data tipe byte seperti gambar mengembalikan string kosong — gunakan GM_getResourceURL untuk itu
declare function GM_getResourceText(name: string): string | undefined;
// GM_getResourceURL mendapatkan data berenkode base64; URL blob juga dapat diperoleh melalui parameter kedua
declare function GM_getResourceURL(name: string, isBlobUrl?: boolean): string | undefined;
const css = GM_getResourceText("mystyle");
const imgUrl = GM_getResourceURL("logo");
GM_addElement
Menyisipkan elemen ke halaman. Dapat melewati pembatasan CSP.
declare function GM_addElement(tag: string, attributes: any): HTMLElement;
declare function GM_addElement(parentNode: Element, tag: string, attrs: any): HTMLElement;
// Sisipkan skrip
GM_addElement("script", { src: "https://example.com/app.js" });
// Sisipkan gaya
GM_addElement(document.head, "style", { textContent: ".foo{color:blue}" });
GM_addStyle
Menambahkan gaya ke halaman dan mengembalikan node DOM gaya. Dapat melewati pembatasan CSP.
declare function GM_addStyle(css: string): HTMLElement;
GM_addStyle(`
body { background: #f0f0f0; }
.btn { color: red; }
`);
GM_openInTab *
Membuka jendela baru.
declare function GM_openInTab(url: string, options: GMTypes.OpenTabOptions): GMTypes.Tab;
declare function GM_openInTab(url: string, loadInBackground: boolean): GMTypes.Tab;
declare function GM_openInTab(url: string): GMTypes.Tab;
declare namespace GMTypes {
interface OpenTabOptions {
/**
* Menentukan apakah tab baru mendapat fokus saat dibuka.
*
* - `true` → tab baru segera dialihkan ke latar depan.
* - `false` → tab baru terbuka di latar belakang, tanpa mengambil fokus dari halaman saat ini.
*
* Bawaan: true
*/
active?: boolean;
/**
* Menentukan tempat tab baru disisipkan.
*
* - Jika `boolean`:
* - `true` → disisipkan tepat setelah tab saat ini.
* - `false` → disisipkan di akhir jendela.
* - Jika `number`:
* - `0` → disisipkan satu posisi sebelum tab saat ini.
* - `1` → disisipkan satu posisi setelah tab saat ini.
*
* Bawaan: true
*/
insert?: boolean | number;
/**
* Menentukan apakah tab induk (yaitu `openerTabId`) diatur.
*
* - `true` → browser dapat melacak tab mana yang membuka tab anak,
* yang membantu beberapa ekstensi (seperti pengelola pohon tab) mengidentifikasi hubungan induk/anak.
*
* Bawaan: true
*/
setParent?: boolean;
/**
* Apakah membuka tab di jendela privat (penyamaran).
*
* Catatan: manifest.json ScriptCat mengatur `"incognito": "split"`,
* jadi saat berjalan di jendela normal, tabId/windowId tidak akan
* tersedia, dan hanya aksi "buka tab baru" yang dapat dilakukan.
*
* Bawaan: false
*/
incognito?: boolean;
/**
* Bidang kompatibilitas lama, hanya didukung oleh Tampermonkey.
* Artinya **kebalikan** dari `active`:
*
* - `true` → setara dengan `active = false` (dimuat di latar belakang).
* - `false` → setara dengan `active = true` (dimuat di latar depan).
*
* ⚠️ Tidak disarankan: tumpang tindih dengan `active` dan mudah membingungkan.
*
* Bawaan: false
* @deprecated Gunakan `active` sebagai gantinya
*/
loadInBackground?: boolean;
/**
* Apakah menyematkan tab baru ke sisi kiri bilah tab browser.
*
* - `true` → tab baru disematkan.
* - `false` → tab biasa.
*
* Bawaan: false
*/
pinned?: boolean;
/**
* Menggunakan `window.open` untuk membuka tab baru alih-alih `chrome.tabs.create`.
* Berguna saat membuka tautan dengan protokol khusus tertentu, mis. `vscode://`, `m3u8dl://`.
* Parameter lain tidak berpengaruh saat menggunakan metode buka ini.
*
* Terkait: Issue #178 #1043
* Bawaan: false
*/
useOpen?: boolean;
}
interface Tab {
close(): void;
onclose?: () => void;
closed?: boolean;
name?: string;
}
}
const tab = GM_openInTab("https://example.com", { active: false });
tab.onclose = () => console.log("closed");
tab.close();
GM_closeInTab
Menutup tab yang dibuka oleh GM_openInTab.
declare function GM_closeInTab(tabId: string): void;
GM_get/saveTab/GM_getTabs
Metode penyimpanan data yang mirip dengan GM_setValue, tetapi masa hidup metode ini terikat pada siklus buka→tutup satu tab browser, dan tidak dapat digunakan dari skrip latar belakang.
// Dapatkan data tab
declare function GM_getTab(callback: (obj: object) => void): void;
// Simpan data tab
declare function GM_saveTab(obj: object): void;
// Dapatkan data semua tab
declare function GM_getTabs(callback: (objs: { [key: number]: object }) => void): void;
GM_saveTab({ foo: 1 }, () => console.log("saved"));
GM_getTab(tab => console.log(tab));
GM_getTabs(tabs => console.log(tabs));
GM_registerMenuCommand *
- Mendaftarkan item menu yang muncul di halaman popup dan menu klik kanan; mengkliknya memanggil fungsi
listener. - Secara bawaan, menyesuaikan Tampermonkey, item menu dengan teks tampilan yang sama hanya ditampilkan sekali.
- Menentukan
idmemungkinkan Anda memperbarui item menu. - Jika
nameadalah string kosong dan tidak adalistener, garis pemisah ditambahkan ke menu klik kanan.
function GM_registerMenuCommand(
name: string,
listener?: (inputValue?: any) => void,
options_or_accessKey?:
| {
id?: number | string;
accessKey?: string;
autoClose?: boolean; // Opsi khusus ScriptCat; bawaan true, dan false menjaga halaman menu popup tetap terbuka setelah diklik
nested?: boolean; // Opsi khusus ScriptCat; bawaan true, dan false menaikkan item menu klik kanan browser dari menu tingkat ketiga ke tingkat kedua
individual?: boolean; // Opsi khusus ScriptCat; bawaan false, dan true berarti item menu yang identik tidak digabungkan
}
| string
): number;
const cmdId = GM_registerMenuCommand("Test Command 01", () => alert("Called 01"));
GM_registerMenuCommand("Test Command 02", () => alert("Called 02"), {id: "custom-id"});
GM_unregisterMenuCommand
Menghapus item menu terdaftar berdasarkan id-nya.
declare function GM_unregisterMenuCommand(id: number): void;
GM_unregisterMenuCommand(cmdId);
GM_unregisterMenuCommand("custom-id");
GM_notification *
Mengirim pesan notifikasi, menyediakan kemampuan progress dan buttons (tidak didukung di Firefox), sehingga notifikasi dapat menampilkan bilah kemajuan atau tombol. Juga menyediakan dua metode tambahan, GM_closeNotification dan GM_updateNotification (tidak didukung di Firefox).
declare function GM_notification(
details: GMTypes.NotificationDetails,
ondone?: GMTypes.NotificationOnDone
): void;
declare function GM_notification(
text: string,
title: string,
image: string,
onclick: GMTypes.NotificationOnClick
): void;
declare function GM_closeNotification(id: string): void;
declare function GM_updateNotification(id: string, details: GMTypes.NotificationDetails): void;
declare namespace GMTypes {
interface NotificationDetails {
text?: string;
title?: string;
tag?: string;
image?: string;
highlight?: boolean;
silent?: boolean;
timeout?: number;
url?: string;
onclick?: NotificationOnClick;
ondone?: NotificationOnDone;
progress?: number;
oncreate?: NotificationOnClick;
// Maksimal 2 dapat ada
buttons?: NotificationButton[];
}
interface NotificationThis extends NotificationDetails {
id: string;
}
type NotificationOnClickEvent = {
event: "click" | "buttonClick";
id: string;
isButtonClick: boolean;
buttonClickIndex: number | undefined;
byUser: boolean | undefined;
preventDefault: () => void;
highlight: NotificationDetails["highlight"];
image: NotificationDetails["image"];
silent: NotificationDetails["silent"];
tag: NotificationDetails["tag"];
text: NotificationDetails["tag"];
timeout: NotificationDetails["timeout"];
title: NotificationDetails["title"];
url: NotificationDetails["url"];
};
type NotificationOnClick = (this: NotificationThis, event: NotificationOnClickEvent) => unknown;
type NotificationOnDone = (this: NotificationThis, user?: boolean) => unknown;
interface NotificationButton {
title: string;
iconUrl?: string;
}
}
GM_notification({ title: "Progress", text: "Loading", progress: 50 });
Catatan: GM_closeNotification dan GM_updateNotification khusus ScriptCat. Untuk memperbarui notifikasi, gunakan tag.
GM_notification({ title: "Progress", text: "Loading", progress: 50, tag: "notification01"});
GM_notification({ title: "Progress", text: "Done", progress: 100, tag: "notification01"}); // memperbarui kemajuannya
GM_notification({ title: "Progress", text: "Done", progress: 100, tag: "notification01", timeout: 1}); // menutup setelah 1ms
GM_setClipboard *
Mengatur clipboard. Callback belum didukung, tidak seperti Tampermonkey.
declare function GM_setClipboard(
data: string,
info?: string | { type?: string; mimetype?: string }
): void;
GM_setClipboard("Hello World", "text");
GM_xmlhttpRequest *
-
Permintaan HTTP lintas origin yang dapat melewati CSP, mendukung domain yang dideklarasikan dengan
@connect. Beberapa fungsionalitas hilang; fitur cookie saat ini tidak didukung di Firefox. Otorisasi pengguna diperlukan untuk akses normal; host yang dijelaskan oleh@connectdapat melewati otorisasi pengguna. -
anonymousdancookieditangani berbeda dari Tampermonkey: saatanonymoustrue dancookieada, hanya cookie yang ditentukan yang dikirim, tanpa cookie lain yang dilampirkan. -
Header khusus juga didukung:
- user-agent
- origin
- referer
- cookie
- host
- ...
declare function GM_xmlhttpRequest(details: GMTypes.XHRDetails): GMTypes.AbortHandle<void>;
declare namespace GMTypes {
interface XHRResponse {
finalUrl?: string;
readyState?: 0 | 1 | 2 | 3 | 4;
responseHeaders?: string;
status?: number;
statusText?: string;
response?: any;
responseText?: string;
responseXML?: Document | null;
}
interface XHRProgress extends XHRResponse {
done: number;
lengthComputable: boolean;
loaded: number;
position: number;
total: number;
totalSize: number;
}
type Listener<OBJ> = (event: OBJ) => any;
interface XHRDetails {
method?: "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS";
url: string;
headers?: { [key: string]: string };
data?: string | FormData;
cookie?: string;
binary?: boolean;
timeout?: number;
responseType?: "text" | "arraybuffer" | "blob" | "json" | "document" | "stream"; // stream adalah implementasi yang cukup dasar di versi saat ini
overrideMimeType?: string;
anonymous?: boolean;
fetch?: boolean;
user?: string;
password?: string;
nocache?: boolean;
redirect?: "follow" | "error" | "manual"; // agar konsisten dengan Tampermonkey, maxRedirects tidak digunakan lagi setelah v0.17.0 demi redirect, yang memaksa mode fetch
onload?: Listener<XHRResponse>;
onloadstart?: Listener<XHRResponse>;
onloadend?: Listener<XHRResponse>;
onprogress?: Listener<XHRProgress>;
onreadystatechange?: Listener<XHRResponse>;
ontimeout?: () => void;
onabort?: () => void;
onerror?: (err: string) => void;
}
}
GM_xmlhttpRequest({
method: "GET",
url: "https://api.example.com/data",
onload: res => console.log(res.responseText)
});
GM_download
- Mengunduh file, dengan header dan opsi lain yang dapat dikonfigurasi; dibandingkan dengan Tampermonkey juga mendukung opsi cookie dan anonymous. Jika diberi URL blob, ia langsung membuka unduhan dan hanya memicu peristiwa
onload— ini berbeda dari Tampermonkey dan ada untuk mendukung skrip latar belakang, yang tidak dapat membuat unduhan dengan cara lain (berguna untuk skenario seperti menghasilkan laporan). - Mengembalikan objek Promise dan menyediakan metode
abort(). - Tidak seperti Tampermonkey, mode unduhan
nativeScriptCat (bawaan) menghormati@connect: saat host URL unduhan tidak tercakup oleh deklarasi@connectskrip, ScriptCat meminta konfirmasi pengguna sebelum mengunduh; host yang tercakup oleh@connectmengunduh secara senyap, dan host yang masuk daftar hitam selalu ditolak. Mode unduhanbrowsertidak tunduk pada pemeriksaan ini. (Di Tampermonkey,@connecthanya berlaku untukGM_xmlhttpRequest, bukanGM_download.)
declare function GM_download(details: GMTypes.DownloadDetails): GMTypes.AbortHandle<boolean>;
declare function GM_download(url: string, filename: string): GMTypes.AbortHandle<boolean>;
declare namespace GMTypes {
interface DownloadError {
error:
| "not_enabled"
| "not_whitelisted"
| "not_permitted"
| "not_supported"
| "not_succeeded"
| "unknown";
details?: string;
}
interface DownloadDetails {
method?: "GET" | "POST";
downloadMode?: "native" | "browser";
url: string;
name: string;
headers?: { [key: string]: string };
saveAs?: boolean;
timeout?: number;
cookie?: string;
anonymous?: boolean;
onerror?: Listener<DownloadError>;
ontimeout?: () => void;
onload?: Listener<object>;
onprogress?: Listener<XHRProgress>;
}
}
// Bentuk callback
const dl = GM_download({ url: "https://example.com/file.zip", name: "file.zip", onload: () => alert("Done") });
dl.abort();
GM_cookie *
Mengoperasikan cookie halaman secara asinkron, mendukung cookie lintas origin, HttpOnly, dan terpartisi.
Setelah v0.17.0-alpha, parameter terkait
storedantabiddihapus; ScriptCat sekarang memutuskan apakah akan mendapatkan cookie dari jendela penyamaran atau normal berdasarkan jendela tempatnya berada saat ini.
Anda harus mendeklarasikan host yang dioperasikan dengan @connect, dan memerlukan otorisasi pengguna untuk menggunakannya. Meskipun kompatibel dengan operasi GM_cookie.list Tampermonkey, ini tidak disarankan, demi konsistensi.
sameSitetidak didukung.
// name dan domain tidak boleh keduanya kosong
declare function GM_cookie(
action: GMTypes.CookieAction,
details: GMTypes.CookieDetails,
ondone: (cookie: GMTypes.Cookie[], error: unknown | undefined) => void
): void;
declare namespace GMTypes {
type CookieAction = "list" | "delete" | "set";
interface CookieDetails {
url?: string;
name?: string;
value?: string;
domain?: string;
path?: string;
secure?: boolean;
session?: boolean;
httpOnly?: boolean;
expirationDate?: number;
partitionKey?: CookieDetailsPartitionKeyType;
}
interface Cookie {
domain: string;
name: string;
value: string;
session: boolean;
hostOnly: boolean;
expirationDate?: number;
path: string;
httpOnly: boolean;
secure: boolean;
}
}
// Bentuk callback
GM_cookie("list", { url: "https://example.com" }, (cookies) => {
console.log(cookies);
GM_cookie("set", {
name: "foo",
value: "bar",
domain: "example.com"
}, (result) => {
console.log(result);
GM_cookie("delete", { name: "foo", domain: "example.com" }, (result) => {
console.log(result);
});
});
});
// Bentuk Promise
const cookies = await GM.cookie.list({ url: "https://example.com" });
await GM.cookie.set({ name: "foo", value: "bar", domain: "example.com" });
await GM.cookie.delete("foo", { domain: "example.com" });
Catatan: Anda harus mendeklarasikan domain yang diizinkan di metadata menggunakan @connect example.com.