计划任务

NoneBot 可选地内置了计划任务功能,在指南的 添加计划任务 已经进行了简单的介绍。这里列出更多常见的用法。

固定的计划任务

可以利用固定的触发器(trigger)来触发某些任务。

一次性任务

date 触发器 (opens new window) 固定时间触发,仅触发一次:

from datetime import datetime

@nonebot.scheduler.scheduled_job(
    'date',
    run_date=datetime(2021, 1, 1, 0, 0),
    # timezone=None,
)
async def _():
    await bot.send_group_msg(group_id=123456,
                             message="2021,新年快乐!")
1
2
3
4
5
6
7
8
9
10

定期任务

cron 触发器 (opens new window)start_date 开始到 end_date 结束,根据类似 Cron (opens new window) 的规则触发任务:

@nonebot.scheduler.scheduled_job(
    'cron',
    # year=None,
    # month=None,
    # day=None,
    # week=None,
    day_of_week="mon,tue,wed,thu,fri",
    hour=7,
    # minute=None,
    # second=None,
    # start_date=None,
    # end_date=None,
    # timezone=None,
)
async def _():
    await bot.send_group_msg(group_id=123456,
                             message="起床啦!")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

间隔任务

interval 触发器 (opens new window)start_date 开始,每间隔一段时间触发,到 end_date 结束:

@nonebot.scheduler.scheduled_job(
    'interval',
    # weeks=0,
    # days=0,
    # hours=0,
    minutes=5,
    # seconds=0,
    # start_date=time.now(),
    # end_date=None,
)
async def _():
    has_new_item = check_new_item()
    if has_new_item:
        await bot.send_group_msg(group_id=123456,
                                 message="XX有更新啦!")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

动态的计划任务

有时,我们需要机器人在运行的过程中,添加或删除计划任务,那么我们就需要 scheduler.add_job 来帮忙。这里,我们以一次性任务为例,其他类型的任务可以用相同的方法:

import datetime

from apscheduler.triggers.date import DateTrigger # 一次性触发器
# from apscheduler.triggers.cron import CronTrigger # 定期触发器
# from apscheduler.triggers.interval import IntervalTrigger # 间隔触发器
from nonebot import on_command, scheduler

@on_command('赖床')
async def _(session: CommandSession):
    await session.send('我会在5分钟后再喊你')

    # 制作一个“5分钟后”触发器
    delta = datetime.timedelta(minutes=5)
    trigger = DateTrigger(
        run_date=datetime.datetime.now() + delta
    )

    # 添加任务
    scheduler.add_job(
        func=session.send,  # 要添加任务的函数,不要带参数
        trigger=trigger,  # 触发器
        args=('不要再赖床啦!',),  # 函数的参数列表,注意:只有一个值时,不能省略末尾的逗号
        # kwargs=None,
        misfire_grace_time=60,  # 允许的误差时间,建议不要省略
        # jobstore='default',  # 任务储存库,在下一小节中说明
    )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26