Skip to main content

Ֆոնային սկրիպտ

Ֆոնային սկրիպտները հարմար են սկրիպտների համար, որոնք պետք է շարունակաբար գործարկվեն: Ֆոնային սկրիպտները ScriptCat-ին հատուկ սկրիպտների տեսակ են. դրանք գործարկվում են սանդբոքսում և չեն կարող մուտք գործել DOM: Դրանք կարող են մշակվել՝ օգտագործելով նույն GM API-ները, ինչ Tampermonkey-ը, և համատեղելիության նշումները նշված են փաստաթղթերում:

Ֆոնային սկրիպտ (@background)

Ֆոնային սկրիպտը հայտարարվում է @background ատրիբուտով: Այն թույլ է տալիս սկրիպտին շարունակել գործարկվել ֆոնում՝ սկրիպտը միացվելուց կամ զննարկիչը գործարկվելուց հետո:

Պլանավորված սկրիպտ (@crontab)

Պլանավորված սկրիպտը ֆոնային սկրիպտի մի տեսակ է, որը հարմար է առաջադրանքների համար, որոնք պետք է կրկնվող կերպով գործարկվեն ժամանակային ցիկլով:

Պլանավորված սկրիպտը հայտարարվում է @crontab ատրիբուտով: Այն աջակցում է րոպեական և վայրկյանական մակարդակի պլանավորում և տրամադրում է ScriptCat-ի ընդլայնված շարահյուսությունը once / once(...)՝ նույն ժամանակային ցիկլում մեկից ավելի անգամ գործարկումից խուսափելու համար:

⚠️ Նշումներ՝

  • Մեկ սկրիպտում միայն առաջին @crontab-ն է գործում
  • Խորհուրդ է տրվում, որ սկրիպտի մեկ գործարկման ժամանակը + կրկնափորձի ժամանակը չգերազանցի cron միջակայքը, հակառակ դեպքում գործարկումները կարող են համընկնել

Cron արտահայտության նշումներ

ScriptCat-ի cron իրականացումը հիմնված է node-cron վրա՝ ստանդարտ cron շարահյուսության վրա փոքր ընդլայնմամբ:

Արտահայտության ձևաչափ

Ստանդարտ 5-դաշտ ձևաչափ (առաջարկվող)

minute hour day month weekday

Ընդլայնված 6-դաշտ ձևաչափ (խորհուրդ չի տրվում)

second minute hour day month weekday

⚠️ 6-դաշտ ձևաչափը խորհուրդ չի տրվում Զննարկչի միջավայրերը չեն կարող երաշխավորել վայրկյանական մակարդակի ճշգրտություն, և դա մեծացնում է կատարողական ծախսերը — ֆոնային էջի պլանավորումը կարող է հետաձգվել:

Յուրաքանչյուր դաշտի համար հասանելի շարահյուսություն

ՇարահյուսությունԻմաստՕրինակ
*Ցանկացած արժեք* (ամեն րոպե/ժամ)
numberՀատուկ արժեք5 (5-րդ րոպեն)
a,b,cԲազմաթիվ դիսկրետ արժեքներ1,15,30
a-bՀարակից միջակայք10-23
*/nԱմեն n միավորը*/5
a-b/nՄիջակայք քայլով10-50/10

Շաբաթվա օրվա կանոններ

  • 1–6. երկուշաբթիից շաբաթ
  • 0 կամ 7. կիրակի

once ընդլայնված շարահյուսությունը

Ի՞նչ է նշանակում once

Cron արտահայտության մեջ once օգտագործելը նշանակում է՝

Ընթացիկ ժամանակային ցիկլում թույլատրել միայն մեկ հաջող գործարկում

Նույնիսկ եթե նույն ցիկլի հետագա ժամանակային կետերը դեռ համընկնում են cron կանոնին, սկրիպտը նորից չի գործարկվի:

once ընդդեմ once(...)

ՇարահյուսությունԱյս դաշտի հիմքում ընկած cron արժեքըՆկարագրություն
once* (ցանկացած արժեք)Գործարկվում է ցիկլի առաջին համընկնման ժամանակ՝ առանց կոնկրետ ժամանակի
once(expr)exprԳործարկվում է միայն ցիկլի ընթացքում expr-ին համընկնող ժամանակներում, և միայն մեկ անգամ

once(expr)-ը թույլ է տալիս ճշգրիտ նշել թեկնածու ժամանակային կետերը՝ միաժամանակ պահպանելով «գործարկել միայն մեկ անգամ մեկ ցիկլում» կանոնը: Բոլոր ստանդարտ cron շարահյուսությունները (թվեր, միջակայքեր, քայլեր, ցուցակներ) աջակցվում են փակագծերի ներսում:

Օրինակների համեմատություն՝

* once * * * // any minute of every hour; runs on the first match, no further runs that hour
* once(9-17) * * * // between 9:00 and 17:59 every day, runs once per hour
0,30 once * * * // whichever of minute 0 or 30 is matched first each hour runs; no further runs that hour

once-ի դիրքը = այն ժամանակային ցիկլը, որը այն սահմանափակում է

Որտեղ էլ տեղադրվի once / once(...)-ը, այն նշանակում է «գործարկել միայն մեկ անգամ այդ ժամանակային գրանուլյարության սահմաններում»:

once դիրքըՎարքագիծ
րոպեի դաշտԳործարկվում է միայն մեկ անգամ մեկ րոպեում
ժամի դաշտԳործարկվում է միայն մեկ անգամ մեկ ժամում
օրվա դաշտԳործարկվում է միայն մեկ անգամ մեկ օրում
ամսվա դաշտԳործարկվում է միայն մեկ անգամ մեկ ամսում
շաբաթվա օրվա դաշտԳործարկվում է միայն մեկ անգամ մեկ շաբաթում

Օրինակներ՝

* once * * * // runs only once per hour
* * once * * // runs only once per day
* 9-18 once * * // runs only once between 9:00 and 18:59 each day

once-ը համակցված միջակայքերի / ցուցակների / քայլերի հետ

once / once(...)-ը կարող է համակցվել ցանկացած cron շարահյուսության հետ, բայց կա միայն մեկ կանոն՝

Նույն ցիկլում, երբ գործարկումը հաջողվել է, բոլոր հետագա համընկնող ժամանակային կետերը անտեսվում են

Օրինակ 1. Միջակայք

* 10 once * *

Իմաստը՝

  • Ամեն օր 10:00–10:59-ը թեկնածու ժամանակներ են
  • Օրվա առաջին համընկնումից հետո
  • 10:05–10:59-ը այլևս չի գործարկվի

Օրինակ 2. Ցուցակ

* 1,3,5 once * *

Իմաստը՝

  • Ամեն օր 1:00-ը, 3:00-ը և 5:00-ը թեկնածու ժամանակներ են
  • Եթե 1:00-ն արդեն գործարկվել է
  • 3:00-ը և 5:00-ը կշրջանցվեն

Օրինակ 3. Քայլ

* */4 once * *

Իմաստը՝

  • Ամեն օր 0:00-ը, 4:00-ը, 8:00-ը, 12:00-ը, 16:00-ը և 20:00-ը թեկնածու ժամանակներ են
  • Օրվա առաջին գործարկումից հետո
  • Ոչ մի հետագա ժամանակային կետ չի գործարկվի

Օրինակ 4. once(...)՝ թեկնածու ժամանակային կետեր նշելը

* once(9-17) * * *

Իմաստը՝

  • Ամեն օր 9:00-ից 17:00-ը թեկնածու ժամեր են
  • Ցիկլը վերակայվում է ամեն ժամ. մեկ ժամվա ընթացքում առաջին համընկնումը կանգնեցնում է հետագա գործարկումները
  • Արդյունք. ամեն օր գործարկվում է մեկ անգամ մեկ ժամում՝ 9:00-ից 17:00 միջակայքում, ընդհանուր 9 անգամ
* 9-18 once * *

Իմաստը՝

  • Ամեն օր 9:00–18:59-ը թեկնածու ժամանակներ են
  • Օրվա դաշտի once-ը կողպում է ցիկլը օրը մեկ անգամ
  • Օրվա առաջին համընկնումից հետո ոչինչ չի գործարկվում մինչև 18:59

@crontab օրինակներ

Սովորական

//@crontab * * * * * // runs once per minute
//@crontab * * * * * * // runs once per second (not recommended)
//@crontab 0 */6 * * * // runs on the hour every 6 hours
//@crontab 15 */6 * * * // runs at minute 15 every 6 hours
//@crontab * once * * * // runs at most once per hour
//@crontab * * once * * // runs at most once per day
//@crontab * 10 once * * // runs only once within the 10:00 hour each day (e.g. if it ran at 10:04, it won't run again from 10:05-10:59)
//@crontab * */4 once * * // checks at most once every 4 hours each day (e.g. if it ran at 4:00, it won't run again at 8, 12, 16, 20, 24, etc.)

Ընդլայնված

//@crontab * 1,3,5 once * * // runs once at 1:00, 3:00, or 5:00 each day (e.g. if it ran at 1:00, it won't run again at 3:00 or 5:00)
//@crontab * 10-23 once * * // runs once between 10:00 and 23:59 each day (e.g. if it ran at 10:04, it won't run again from 10:05-23:59)
//@crontab * once 13 * * // runs once per hour on the 13th of every month
//@crontab * once(9-17) * * * // runs once per hour between 9:00 and 17:00 each day
//@crontab 0,30 once * * * // whichever of minute 0 or 30 is matched first each hour runs; no repeat that hour
//@crontab * 9-18 once * * // runs only once between 9:00 and 18:00 each day

Օգտագործման առաջարկություններ

Լավ համապատասխանություն once-ի համար

  • Առաջադրանքներ, որոնք պետք է գործարկվեն միայն մեկ անգամ օրական/ժամում

  • Կարգավիճակի ստուգումներ, համաժամացման և հաշվետվության սկրիպտներ

  • Հետևյալ խնդիրներից խուսափելը՝

    • Զննարկիչը երկար ժամանակ չի բացվել
    • Ֆոնային էջի պլանավորման ուշացումներ
    • Զննարկչի վերագործարկման հետևանքով առաջացած կրկնակի գործարկում

Խորհուրդ չի տրվում once-ի համար

  • Առաջադրանքներ, որոնք պետք է գործարկվեն ճշգրիտ պահին
  • Սկրիպտներ, որոնց գործարկման ժամանակը կարող է զգալիորեն գերազանցել cron միջակայքը
  • Առաջադրանքներ՝ գործարկումների քանակի վերաբերյալ խիստ հետևողականության պահանջներով

Cron արտահայտությունների փորձարկում

Cron արտահայտություն փորձարկելիս խնդրում ենք ժամանակավորապես փոխարինել once / once(...)-ը դրանց հիմքում ընկած արժեքով՝

  • once*
  • once(expr)expr

Նշեք, որ փորձարկման գործիքները կարող են չաջակցել ընդլայնված 6-դաշտ ձևաչափին:

Առաջարկվող գործիքներ՝

Սկրիպտների ցուցակի էջում կուրսորը պահեք գործարկման կարգավիճակի սյունակի վրա՝ սկրիպտի հաջորդ պլանավորված գործարկման ժամանակը տեսնելու համար:

Լոգեր

Սկրիպտների ցուցակի էջում գործարկման կարգավիճակի սյունակի վրա կուրսորը պահելը ցույց է տալիս հուշում՝ սկրիպտի գործարկման կարգավիճակով; դրա վրա սեղմելը բացում է GM_log-ի միջոցով տպված լոգի բովանդակությունը:

Սկրիպտի վրիպազերծում

Ֆոնային սկրիպտները կարող են վրիպազերծվել ուղղակիորեն սկրիպտի խմբագրման էջից, բայց դա ունի հետևյալ սահմանափակումները՝

  • value-ը ճիշտ չի համաժամեցվում
  • registerMenu մենյուները ճիշտ չեն գործարկվում

Իրական գործարկման միջավայրը վրիպազերծելու համար միացրեք Մշակողի ռեժիմը ընդլայնման կարգավորումներում, այնուհետև բացեք ընդլայնման background.html էջը՝ վրիպազերծելու համար:

Գործարկման ժամանակ առաջացած սխալները կարող են դիտվել նաև գործարկման լոգում:

image-20210903144155450

Promise

Հետևյալ նախշը խիստ խորհուրդ է տրվում, քանի որ այն նաև թույլ է տալիս սկրիպտի կառավարիչին վերահսկել սկրիպտի գործարկումը: Եթե սկրիպտը կատարում է որևէ ասինխրոն գործողություն, այն պետք է վերադարձնի Promise:

// ==UserScript==
// @name Background Script
// @namespace wyz
// @version 1.0.0
// @author wyz
// @background
// ==/UserScript==
return new Promise((resolve, reject) => {
if (Math.round((Math.random() * 10) % 2)) {
resolve("ok"); // succeeded
} else {
reject("error"); // failed, with the error reason
}
});
// ==UserScript==
// @name Scheduled script that runs once a day
// @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"); // succeeded
} else {
reject("error"); // failed, with the error reason
}
});
// ==UserScript==
// @name Call an 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"); // succeeded
},
onerror() {
reject("error"); // failed, with the error reason
},
});
});

Խնդրում ենք համոզվել, որ resolve / reject կանչեք միայն սկրիպտի տրամաբանությունն իսկապես ավարտվելուց հետո: Կանչվելուց հետո կառավարիչը համարում է սկրիպտի գործարկումն ավարտված, և հետագա GM գործողություններն այլևս չեն գործի:

Սխալի կրկնափորձ

ScriptCat ֆոնային սկրիպտները աջակցում են սխալի կրկնափորձին: Երբ սկրիպտը ձախողվում է, այն կարող է reject անել CATRetryError-ով՝ կրկնափորձ գործարկելու համար:

  • Նվազագույն կրկնափորձի միջակայք. 5 վայրկյան
  • Խուսափեք սկրիպտի սեփական գործարկման ժամանակի հետ կոնֆլիկտից, հակառակ դեպքում կարող է տեղի ունենալ կրկնակի գործարկում
// ==UserScript==
// @name Retry example
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description try to take over the world!
// @author You
// @crontab * * once * *
// @grant GM_notification
// ==/UserScript==

return new Promise((resolve, reject) => {
GM_notification({
title: "retry",
text: "Retrying in 10 seconds",
});
reject(new CATRetryError("xxx error", 10));
});