Script di Background
Gli script di background sono adatti a script che devono continuare a eseguire in modo continuo. Gli script di background sono un tipo di script specifico di ScriptCat; vengono eseguiti in una sandbox e non possono accedere al DOM. Possono essere sviluppati utilizzando le stesse GM API di Tampermonkey, e le note di compatibilità sono indicate nella documentazione.
Script di Background (@background)â
Uno script di background viene dichiarato con l'attributo @background. Permette allo script di continuare a eseguire in background dopo che lo script è abilitato o il browser si avvia.
Script Pianificato (@crontab)â
Uno script pianificato è un tipo di script di background adatto a compiti che devono eseguirsi ripetutamente su un ciclo temporale.
Uno script pianificato viene dichiarato con l'attributo @crontab. Supporta la pianificazione a livello di minuti e secondi, e fornisce la sintassi estesa di ScriptCat once / once(...) per evitare l'esecuzione più di una volta all'interno dello stesso ciclo temporale.
â ï¸ Note:
- In un singolo script, solo il primo
@crontabha effetto - Si consiglia che il tempo di esecuzione singolo + tempo di retry non superi l'intervallo di cron, altrimenti le esecuzioni possono sovrapporsi
Note sulle Espressioni Cronâ
L'implementazione di cron di ScriptCat si basa su node-cron, con una piccola estensione rispetto alla sintassi cron standard.
Formato dell'Espressioneâ
Formato standard a 5 campi (Consigliato)â
minuto ora giorno mese giorno_settimana
Formato esteso a 6 campi (Non consigliato)â
secondo minuto ora giorno mese giorno_settimana
â ï¸ Il formato a 6 campi non è consigliato Gli ambienti del browser non possono garantire precisione al secondo e aumentano l'overhead di prestazioni.
Sintassi Disponibile per Campoâ
| Sintassi | Significato | Esempio |
|---|---|---|
* | Qualsiasi valore | * (ogni minuto/ora) |
| number | Valore specifico | 5 (il quinto minuto) |
a,b,c | Più valori discreti | 1,15,30 |
a-b | Intervallo continuo | 10-23 |
*/n | Ogni n unità | */5 |
a-b/n | Intervallo con passo | 10-50/10 |
Regole del Giorno della Settimanaâ
1â6: Lunedì a Sabato0o7: Domenica
La Sintassi Estesa onceâ
Cosa Significa onceâ
Usare once in un'espressione cron significa:
All'interno del ciclo temporale attuale, consentire solo un'esecuzione riuscita
Anche se punti temporali successivi all'interno dello stesso ciclo corrispondono ancora alla regola cron, lo script non verrà eseguito di nuovo.
once vs. once(...)â
| Sintassi | Valore cron sottostante | Descrizione |
|---|---|---|
once | * (qualsiasi valore) | Viene eseguito alla prima corrispondenza all'interno del ciclo, senza un tempo specifico |
once(expr) | expr | Viene eseguito solo nei tempi che corrispondono a expr all'interno del ciclo, e solo una volta |
La Posizione di once = il Ciclo Temporale che Limitaâ
Dove viene posizionato once / once(...), significa "eseguire solo una volta all'interno di quella granularità temporale".
Posizione di once | Comportamento |
|---|---|
| Campo minuto | Esegui solo una volta al minuto |
| Campo ora | Esegui solo una volta all'ora |
| Campo giorno | Esegui solo una volta al giorno |
| Campo mese | Esegui solo una volta al mese |
| Campo giorno settimana | Esegui solo una volta alla settimana |
Esempi di @crontabâ
Comuniâ
//@crontab * * * * * // una volta al minuto
//@crontab * * * * * * // una volta al secondo (non consigliato)
//@crontab 0 */6 * * * // ogni 6 ore al minuto 0
//@crontab 15 */6 * * * // ogni 6 ore al minuto 15
//@crontab * once * * * // al massimo una volta all'ora
//@crontab * * once * * // al massimo una volta al giorno
//@crontab * 10 once * * // solo una volta all'interno dell'ora 10:00 ogni giorno
//@crontab * */4 once * * // al massimo una volta ogni 4 ore ogni giorno
Avanzatiâ
//@crontab * 1,3,5 once * * // una volta alle 1:00, 3:00 o 5:00 ogni giorno
//@crontab * 10-23 once * * // una volta tra le 10:00 e le 23:59 ogni giorno
//@crontab * once 13 * * // una volta all'ora il 13 di ogni mese
//@crontab * once(9-17) * * * // una volta all'ora tra le 9:00 e le 17:00 ogni giorno
//@crontab 0,30 once * * * // il minuto 0 o 30 viene corrisposto per primo ogni ora; nessuna ripetizione quell'ora
//@crontab * 9-18 once * * // solo una volta tra le 9:00 e le 18:00 ogni giorno
Raccomandazioni di Utilizzoâ
Buoni Utilizzi per onceâ
- Compiti che devono essere eseguiti solo una volta al giorno/ora
- Script di verifica stato, sincronizzazione e reportistica
Non Consigliato per onceâ
- Compiti che devono essere eseguiti in un momento preciso
- Script il cui tempo di esecuzione può superare significativamente l'intervallo di cron
Testare le Espressioni Cronâ
Quando si testa un'espressione cron, sostituire temporaneamente once / once(...) con il valore sottostante:
onceâ*once(expr)âexpr
Strumenti consigliati:
Logâ
Nella pagina dell'elenco degli script, passando il mouse sulla colonna dello stato di esecuzione viene mostrato un tooltip con lo stato di esecuzione dello script;
cliccando viene mostrato il contenuto del log stampato tramite GM_log.

Debug degli Scriptâ
Gli script di background possono essere debuggati direttamente dalla pagina dell'editor degli script, ma ha queste limitazioni:
valuenon si sincronizza correttamente- I menu
registerMenunon si attivano correttamente

Per fare il debug dell'ambiente di esecuzione reale, abilita la Modalità Sviluppatore nelle impostazioni dell'estensione, poi apri la pagina background.html dell'estensione per fare il debug.
Gli errori durante l'esecuzione possono essere visualizzati anche nel log di esecuzione.

Promiseâ
Il seguente pattern è fortemente consigliato, poiché permette anche al gestore degli script di monitorare l'esecuzione.
Se lo script esegue qualsiasi operazione asincrona, deve restituire un Promise.
// ==UserScript==
// @name Script di Background
// @namespace wyz
// @version 1.0.0
// @author wyz
// @background
// ==/UserScript==
return new Promise((resolve, reject) => {
if (Math.round((Math.random() * 10) % 2)) {
resolve("ok");
} else {
reject("error");
}
});
// ==UserScript==
// @name Script pianificato che si esegue una volta al giorno
// @namespace wyz
// @version 1.0.0
// @author wyz
// @crontab * * once * *
// ==/UserScript==
return new Promise((resolve, reject) => {
if (Math.round((Math.random() * 10) % 2)) {
resolve("ok");
} else {
reject("error");
}
});
// ==UserScript==
// @name Chiamare un'API
// @namespace wyz
// @version 1.0.0
// @author wyz
// @crontab * * once * *
// ==/UserScript==
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url: "https://bbs.tampermonkey.net.cn/",
onload() {
resolve("ok");
},
onerror() {
reject("error");
},
});
});
Assicurati di chiamare resolve / reject solo dopo che la logica dello script sia veramente terminata.
Una volta chiamato, il gestore considera l'esecuzione dello script completata, e qualsiasi operazione GM successiva non avrà più effetto.
Retry di Erroreâ
Gli script di background di ScriptCat supportano il retry di errore.
Quando uno script fallisce, può fare reject con un CATRetryError per attivare un retry.
- Intervallo minimo di retry: 5 secondi
- Evita conflitti con il proprio tempo di esecuzione dello script, altrimenti possono verificarsi esecuzioni duplicate
// ==UserScript==
// @name Esempio di retry
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description provare a conquistare il mondo!
// @author You
// @crontab * * once * *
// @grant GM_notification
// ==/UserScript==
return new Promise((resolve, reject) => {
GM_notification({
title: "retry",
text: "Riprova tra 10 secondi",
});
reject(new CATRetryError("xxx error", 10));
});