跳到主要内容

后台脚本

后台脚本适用于持续运行类型的脚本.后台脚本是脚本猫特有的脚本,后台脚本运行在沙盒中,无法操作 dom 对象.可使用与油猴一致的 GM API 进行开发,对于兼容性会在文档中标出.

后台脚本

后台脚本由@background属性声明,后台脚本将允许在开启脚本或者浏览器启动后,让脚本在后台持续运行.

定时脚本

定时脚本也属于后台脚本的一种,定时脚本适用于每隔一段时间执行一次的脚本.

定时脚本由@crontab属性声明,可以精确到秒级调用,提供了一个once参数,表示某个时间段内会执行一次(考虑浏览器未打开的情况).建议脚本的运行时间和重试时间不要大于定时时间的间隔.

可使用在线工具测试 cron 表达式,扩展中的once替换成*:cron 在线测试

在控制台页面,鼠标放置运行状态栏时会显示下一次的运行时间.

Crontab 例子

请注意一个脚本中只有第一个 crontab 表达式生效,once语义为只在当前的时间位上运行一次

//@crontab * * * * * * 每秒运行一次
//@crontab * * * * * 每分钟运行一次
//@crontab 0 */6 * * * 每6小时的0分时执行一次
//@crontab 15 */6 * * * 每6小时的15分时执行一次
//@crontab * once * * * 每小时运行一次
//@crontab * * once * * 每天运行一次
//@crontab * 10 once * * 每天10点-10:59中运行一次,假设当10:04时运行了一次,10:05-10:59的后续的时间将不会再运行
//@crontab * 1,3,5 once * * 每天1点3点5点中运行一次,假设当1点时运行了一次,3,5点将不会再运行
//@crontab * */4 once * * 每天每隔4小时检测运行一次,假设当4点时运行了一次,8,12,16,20,24点等后续的时间将不会再运行
//@crontab * 10-23 once * * 每天10点-23:59中运行一次,假设当10:04时运行了一次,10:05-23:59的后续时间将不会再运行
//@crontab * once 13 * * 每个月的13号的每小时运行一次

日志

在脚本列表页面,鼠标放置运行状态栏会提示脚本的运行状态,点击可弹出通过GM_log打印的日志内容

脚本调试

后台脚本可直接在脚本编辑页面进行调试,但是存在下面问题: value 无法正常同步,registerMenu 菜单无法正常触发.

如果是运行的环境请前往扩展开启开发人员模式然后在点击扩展的 background.html 进行调试,运行时产生的错误也可以在运行日志中查看

image-20210903144155450

Promise

十分推荐这种写法,也便于脚本管理器的脚本监控,对于有异步执行的,必须使用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"); // 执行失败,并返回错误原因
}
});

请注意将resolve/reject的操作放入执行完毕后的步骤中,resolve/reject后管理器会认为脚本执行完毕,后续的所有 GM 操作将不会生效.如果是希望持续运行的后台脚本,可以不调用resolve.

// ==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"); // 执行失败,并返回错误原因
},
});
});

错误重试

脚本猫后台脚本可以进行重试, 当你的脚本出现错误时, 可以 reject 返回CATRetryError, 以便脚本猫重试 重试时间请注意不要与脚本执行时间冲突, 否则可能会导致重复执行, 最小重试时间为 5s

// ==UserScript==
// @name 重试示例
// @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) => {
// Your code here...
GM_notification({
title: "retry",
text: "10秒后重试",
});
reject(new CATRetryError("xxx错误", 10));
});