স্কিপ করে মূল কন্টেন্ট এ যান

ব্যাকগ্রাউন্ড স্ক্রিপ্ট

ব্যাকগ্রাউন্ড স্ক্রিপ্টগুলি এমন স্ক্রিপ্টগুলির জন্য উপযুক্ত যা ক্রমাগত চলতে থাকে। ব্যাকগ্রাউন্ড স্ক্রিপ্ট একটি ScriptCat-নির্দিষ্ট স্ক্রিপ্টের ধরন; তারা একটি স্যান্ডবক্সে চলে এবং DOM অ্যাক্সেস করতে পারে না। এগুলি Tampermonkey-এর মতো একই GM API ব্যবহার করে বিকাশ করা যায় এবং ডকুমেন্টেশনে সামঞ্জস্য নোট উল্লেখ করা হয়েছে।

ব্যাকগ্রাউন্ড স্ক্রিপ্ট (@background)

একটি ব্যাকগ্রাউন্ড স্ক্রিপ্ট @background বৈশিষ্ট্য দিয়ে ঘোষণা করা হয়। এটি স্ক্রিপ্টটিকে স্ক্রিপ্ট সক্রিয় হওয়ার পরে বা ব্রাউজার শুরু হওয়ার পরে ব্যাকগ্রাউন্ডে চলতে দেয়।

নির্ধারিত স্ক্রিপ্ট (@crontab)

একটি নির্ধারিত স্ক্রিপ্ট এক ধরনের ব্যাকগ্রাউন্ড স্ক্রিপ্ট যা একটি সময় চক্রে বারবার চলতে প্রয়োজন এমন কাজের জন্য উপযুক্ত।

একটি নির্ধারিত স্ক্রিপ্ট @crontab বৈশিষ্ট্য দিয়ে ঘোষণা করা হয়। এটি মিনিট-স্তরের এবং সেকেন্ড-স্তরের সময়সূচী সমর্থন করে এবং একই সময় চক্রের মধ্যে একাধিকবার চলা এড়াতে ScriptCat-এর বর্ধিত সিনট্যাক্স once / once(...) প্রদান করে।

⚠️ নোট:

  • একটি একক স্ক্রিপ্টে, শুধুমাত্র প্রথম @crontab কার্যকর হয়
  • সুপারিশ করা হয় যে স্ক্রিপ্টের একক নির্বাহের সময় + পুনরায় চেষ্টার সময় cron ব্যবধান অতিক্রম না করে, অন্যথায় নির্বাহগুলি ওভারল্যাপ হতে পারে

Cron এক্সপ্রেশন নোট

ScriptCat-এর cron বাস্তবায়ন node-cron-এর উপর ভিত্তি করে, স্ট্যান্ডার্ড cron সিনট্যাক্সের উপরে একটি ছোট এক্সটেনশন সহ।

এক্সপ্রেশন ফরম্যাট

স্ট্যান্ডার্ড ৫-ফিল্ড ফরম্যাট (প্রস্তাবিত)

minute hour day month weekday

বর্ধিত ৬-ফিল্ড ফরম্যাট (প্রস্তাবিত নয়)

second minute hour day month weekday

⚠️ ৬-ফিল্ড ফরম্যাট প্রস্তাবিত নয় ব্রাউজার পরিবেশ সেকেন্ড-স্তরের নির্ভুলতা নিশ্চিত করতে পারে না এবং এটি কর্মক্ষমতা ওভারহেড বাড়ায় — ব্যাকগ্রাউন্ড পৃষ্ঠার সময়সূচী বিলম্বিত হতে পারে।

প্রতি ফিল্ডে উপলব্ধ সিনট্যাক্স

সিনট্যাক্সঅর্থউদাহরণ
*যেকোনো মান* (প্রতি মিনিট/ঘণ্টা)
সংখ্যানির্দিষ্ট মান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 * * * // প্রতি ঘণ্টার যেকোনো মিনিট; প্রথম ম্যাচে চলে, সেই ঘণ্টায় আর কোনো চালনা নেই
* once(9-17) * * * // প্রতিদিন 9:00 এবং 17:59-এর মধ্যে, প্রতি ঘণ্টায় একবার চলে
0,30 once * * * // প্রতি ঘণ্টায় মিনিট 0 বা 30 যেটি আগে মিলে সেটি চলে; সেই ঘণ্টায় আর কোনো চালনা নেই

once-এর অবস্থান = এটি যে সময় চক্রকে সীমাবদ্ধ করে

once / once(...) যেখানেই রাখা হয়, এর অর্থ "শুধুমাত্র একবার সেই সময়ের গ্রানুলারিটির মধ্যে চলবে।"

once অবস্থানআচরণ
মিনিট ফিল্ডপ্রতি মিনিটে শুধুমাত্র একবার চলে
ঘণ্টা ফিল্ডপ্রতি ঘণ্টায় শুধুমাত্র একবার চলে
দিন ফিল্ডপ্রতিদিন শুধুমাত্র একবার চলে
মাস ফিল্ডপ্রতি মাসে শুধুমাত্র একবার চলে
সপ্তাহের দিন ফিল্ডপ্রতি সপ্তাহে শুধুমাত্র একবার চলে

উদাহরণ:

* once * * * // প্রতি ঘণ্টায় শুধুমাত্র একবার চলে
* * once * * // প্রতিদিন শুধুমাত্র একবার চলে
* 9-18 once * * // প্রতিদিন 9:00 এবং 18:59-এর মধ্যে শুধুমাত্র একবার চলে

once পরিসর / তালিকা / ধাপের সাথে মিলিত

once / once(...) যেকোনো cron সিনট্যাক্সের সাথে মিলিত হতে পারে, তবে শুধুমাত্র একটি নিয়ম আছে:

একই চক্রের মধ্যে, একবার একটি চালনা সফল হলে, পরবর্তী সমস্ত মিলে যাওয়া সময় পয়েন্ট উপেক্ষা করা হয়

উদাহরণ ১: পরিসর

* 10 once * *

অর্থ:

  • প্রতিদিন, 10:00–10:59 ক্যান্ডিডেট সময়
  • দিনের প্রথম ম্যাচের পরে
  • 10:05–10:59 আর চলবে না

উদাহরণ ২: তালিকা

* 1,3,5 once * *

অর্থ:

  • প্রতিদিন, 1:00, 3:00 এবং 5:00 ক্যান্ডিডেট সময়
  • যদি 1:00 ইতিমধ্যে চলেছে
  • 3:00 এবং 5:00 বাদ যাবে

উদাহরণ ৩: ধাপ

* */4 once * *

অর্থ:

  • প্রতিদিন, 0:00, 4:00, 8:00, 12:00, 16:00 এবং 20:00 ক্যান্ডিডেট সময়
  • দিনের প্রথম চালনার পরে
  • আর কোনো সময় পয়েন্ট চলবে না

উদাহরণ ৪: once(...) ক্যান্ডিডেট সময় পয়েন্ট নির্দিষ্ট করা

* once(9-17) * * *

অর্থ:

  • প্রতিদিন, 9:00 থেকে 17:00 ক্যান্ডিডেট ঘণ্টা
  • চক্র প্রতি ঘণ্টায় রিসেট হয়; একটি ঘণ্টার মধ্যে, প্রথম ম্যাচ পরবর্তী চালনা বন্ধ করে
  • প্রভাব: প্রতিদিন 9:00 এবং 17:00-এর মধ্যে প্রতি ঘণ্টায় একবার চলে, মোট ৯ বার
* 9-18 once * *

অর্থ:

  • প্রতিদিন, 9:00–18:59 ক্যান্ডিডেট সময়
  • দিন ফিল্ডে once চক্রটিকে প্রতিদিন একবারে লক করে
  • দিনের প্রথম ম্যাচের পরে, 18:59-এর আগে আর কিছুই চলে না

@crontab উদাহরণ

সাধারণ

//@crontab * * * * * // প্রতি মিনিটে একবার চলে
//@crontab * * * * * * // প্রতি সেকেন্ডে একবার চলে (প্রস্তাবিত নয়)
//@crontab 0 */6 * * * // প্রতি ৬ ঘণ্টায় ঘণ্টায় চলে
//@crontab 15 */6 * * * // প্রতি ৬ ঘণ্টায় মিনিট ১৫-এ চলে
//@crontab * once * * * // প্রতি ঘণ্টায় সর্বোচ্চ একবার চলে
//@crontab * * once * * // প্রতিদিন সর্বোচ্চ একবার চলে
//@crontab * 10 once * * // প্রতিদিন 10:00 ঘণ্টার মধ্যে শুধুমাত্র একবার চলে (যেমন 10:04-এ চললে, 10:05-10:59-এ আবার চলবে না)
//@crontab * */4 once * * // প্রতিদিন প্রতি ৪ ঘণ্টায় সর্বোচ্চ একবার পরীক্ষা করে (যেমন 4:00-এ চললে, 8, 12, 16, 20, 24 ইত্যাদিতে আবার চলবে না)

উন্নত

//@crontab * 1,3,5 once * * // প্রতিদিন 1:00, 3:00 বা 5:00-এ একবার চলে (যেমন 1:00-এ চললে, 3:00 বা 5:00-এ আবার চলবে না)
//@crontab * 10-23 once * * // প্রতিদিন 10:00 এবং 23:59-এর মধ্যে একবার চলে (যেমন 10:04-এ চললে, 10:05-23:59-এ আবার চলবে না)
//@crontab * once 13 * * // প্রতি মাসের ১৩ তারিখে প্রতি ঘণ্টায় একবার চলে
//@crontab * once(9-17) * * * // প্রতিদিন 9:00 এবং 17:00-এর মধ্যে প্রতি ঘণ্টায় একবার চলে
//@crontab 0,30 once * * * // প্রতি ঘণ্টায় মিনিট 0 বা 30 যেটি আগে মিলে সেটি চলে; সেই ঘণ্টায় কোনো পুনরাবৃত্তি নেই
//@crontab * 9-18 once * * // প্রতিদিন 9:00 এবং 18:00-এর মধ্যে শুধুমাত্র একবার চলে

ব্যবহারের সুপারিশ

once-এর জন্য ভালো মানানসই

  • কাজ যা শুধুমাত্র একবার চলতে হবে প্রতি দিন/ঘণ্টা

  • অবস্থা পরীক্ষা, সিঙ্ক এবং রিপোর্টিং স্ক্রিপ্ট

  • নিম্নলিখিত সমস্যাগুলি এড়ানো:

    • ব্রাউজারটি দীর্ঘ সময় ধরে খোলা হয়নি
    • ব্যাকগ্রাউন্ড-পৃষ্ঠার সময়সূচী বিলম্ব
    • ব্রাউজার পুনরায় চালু হওয়ার কারণে সদৃশ নির্বাহ

once-এর জন্য প্রস্তাবিত নয়

  • কাজ যা অবশ্যই একটি নির্দিষ্ট মুহূর্তে চলতে হবে
  • স্ক্রিপ্ট যাদের নির্বাহের সময় cron ব্যবধান উল্লেখযোগ্যভাবে অতিক্রম করতে পারে
  • নির্বাহের সংখ্যার উপর কঠোর সামঞ্জস্যের প্রয়োজনীয়তা সহ কাজ

Cron এক্সপ্রেশন পরীক্ষা

একটি cron এক্সপ্রেশন পরীক্ষা করার সময়, অনুগ্রহ করে সাময়িকভাবে once / once(...) তাদের অন্তর্নিহিত মান দিয়ে প্রতিস্থাপন করুন:

  • once*
  • once(expr)expr

লক্ষ্য করুন যে পরীক্ষার সরঞ্জামগুলি বর্ধিত ৬-ফিল্ড ফরম্যাট সমর্থন নাও করতে পারে।

প্রস্তাবিত সরঞ্জাম:

স্ক্রিপ্ট তালিকা পৃষ্ঠায়, স্ক্রিপ্টের পরবর্তী নির্ধারিত নির্বাহের সময় দেখতে রান স্ট্যাটাস কলামে হোভার করুন।

লগ

স্ক্রিপ্ট তালিকা পৃষ্ঠায়, রান স্ট্যাটাস কলামে হোভার করলে স্ক্রিপ্টের রান স্ট্যাটাস সহ একটি টুলটিপ দেখায়; এটিতে ক্লিক করলে GM_log-এর মাধ্যমে মুদ্রিত লগ বিষয়বস্তু পপআপ হয়।

স্ক্রিপ্ট ডিবাগিং

ব্যাকগ্রাউন্ড স্ক্রিপ্টগুলি স্ক্রিপ্ট এডিটর পৃষ্ঠা থেকে সরাসরি ডিবাগ করা যায়, তবে এটির নিম্নলিখিত সীমাবদ্ধতা রয়েছে:

  • value সঠিকভাবে সিঙ্ক হয় না
  • registerMenu মেনু সঠিকভাবে ট্রিগার হয় না

প্রকৃত রানটাইম পরিবেশ ডিবাগ করতে, এক্সটেনশন সেটিংসে ডেভেলপার মোড সক্রিয় করুন, তারপর ডিবাগ করতে এক্সটেনশনের background.html পৃষ্ঠাটি খুলুন।

রানটাইমে উত্থাপিত ত্রুটিগুলিও রান লগে দেখা যায়।

image-20210903144155450

Promise

নিম্নলিখিত প্যাটার্নটি অত্যন্ত সুপারিশ করা হয়, কারণ এটি স্ক্রিপ্ট ম্যানেজারকে স্ক্রিপ্ট নির্বাহ পর্যবেক্ষণ করতে দেয়। যদি স্ক্রিপ্টটি কোনো অ্যাসিঙ্ক্রোনাস অপারেশন করে, এটি অবশ্যই একটি Promise ফিরিয়ে দেবে

// ==UserScript==
// @name ব্যাকগ্রাউন্ড স্ক্রিপ্ট
// @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 নির্ধারিত স্ক্রিপ্ট যা দিনে একবার চলে
// @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 একটি 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"); // ব্যর্থ, ত্রুটির কারণ সহ
},
});
});

অনুগ্রহ করে নিশ্চিত করুন যে স্ক্রিপ্টের লজিক সত্যিই শেষ হওয়ার পরেই resolve / reject কল করবেন। একবার কল করলে, ম্যানেজার স্ক্রিপ্টের নির্বাহ সম্পন্ন বলে মনে করে এবং পরবর্তী GM অপারেশনগুলির আর প্রভাব থাকবে না।

ত্রুটি পুনরায় চেষ্টা

ScriptCat ব্যাকগ্রাউন্ড স্ক্রিপ্টগুলি ত্রুটি পুনরায় চেষ্টা সমর্থন করে। যখন একটি স্ক্রিপ্ট ব্যর্থ হয়, এটি পুনরায় চেষ্টা ট্রিগার করতে একটি CATRetryError দিয়ে reject করতে পারে।

  • ন্যূনতম পুনরায় চেষ্টার ব্যবধান: ৫ সেকেন্ড
  • স্ক্রিপ্টের নিজস্ব নির্বাহের সময়ের সাথে সংঘর্ষ এড়ান, অন্যথায় সদৃশ নির্বাহ ঘটতে পারে
// ==UserScript==
// @name পুনরায় চেষ্টা উদাহরণ
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description বিশ্ব দখল করার চেষ্টা করুন!
// @author আপনি
// @crontab * * once * *
// @grant GM_notification
// ==/UserScript==

return new Promise((resolve, reject) => {
GM_notification({
title: "retry",
text: "১০ সেকেন্ডে আবার চেষ্টা করা হচ্ছে",
});
reject(new CATRetryError("xxx error", 10));
});