上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

[脚本猫开发指南]后台脚本与定时脚本

[复制链接]
  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    290

    主题

    3879

    回帖

    3797

    积分

    管理员

    积分
    3797

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2021-9-14 16:31:49 | 显示全部楼层 | 阅读模式

    官方文档:后台脚本

    在之前的概念介绍中简单的介绍了一下后台脚本,本节来具体说明一下后台脚本,脚本猫系列的开发教程也是围绕着后台脚本来进行的,关于油猴脚本的可以,可以看【油猴脚本开发指南】,也可以使用脚本猫来运行。

    后台脚本简而言之就是在后台中运行的脚本,相比于普通的油猴脚本,它不需要打开浏览器运行,可以由自己控制运行时间。另外开启下面两项,可以让电脑开机的时候就运行脚本。(以Edge为例)

    image-20210914161221134.png

    后台脚本有两种类型:普通后台脚本与定时脚本。

    普通后台脚本

    普通后台脚本使用@background进行声明,运行时间为脚本开启时运行。在浏览器打开时,如果脚本是开启状态,也会开始运行。当然也可以手动在面板上点击运行一次进行运行。如果脚本的生命周期与浏览器的生命周期一致,可以使用本脚本类型。

    例如使用CAT_proxy实现代理的脚本;使用GM_addValueChangeListener实现的与普通油猴脚本进行交互的脚本。

    定时脚本

    定时脚本是一种特殊的后台脚本,如果你有定时执行的需求,可以直接使用@crontab去实现定时执行的需求,与普通后台脚本不同,定时脚本只会在crontab所定义的时间上运行,并且生命周期应该是执行一次脚本,时间不宜太长。crontab表达式,可以去下面的网站测试。

    crontab在线测试

    Crontab 例子

    //@crontab * * * * * * 每秒运行一次
    //@crontab * * * * * 每分钟运行一次
    //@crontab 0 */6 * * * 每6小时的0分时执行一次
    //@crontab 15 */6 * * * 每6小时的15分时执行一次
    //@crontab * once * * * 每小时运行一次
    //@crontab * * once * * 每天运行一次
    //@crontab * 10 once * * 每天10点检测运行一次
    //@crontab * 10-23 once * * 每天10点后检测运行一次
    //@crontab * once 13 * * 每个月13号中的每小时最多运行一次

    写法

    后台脚本必须使用Promise的形式,这样才能方便管理器进行管理,不遵循此规则的脚本可能会无法正常运行。除此之外,几乎与普通的油猴脚本没什么不同。因为后台脚本是在后台运行,所有针对window、dom的操作是无效的。另外为了满足后台脚本的一些交互,增强和扩展了一些API,具体可以看官方文档,教程后续也会继续讲解。

    // ==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");// 执行失败,并返回错误原因
      }
    });
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥

    该用户从未签到

    0

    主题

    3

    回帖

    41

    积分

    助理工程师

    积分
    41
    发表于 2021-9-15 17:36:01 | 显示全部楼层
    干货!!!
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表