nonebot2/docs/guide/scheduler.md

51 lines
2.4 KiB
Markdown
Raw Normal View History

2018-10-15 11:17:52 +08:00
# 添加计划任务
2018-08-26 12:35:53 +08:00
实际应用中还经常会有定时执行任务的需求为了方便这类需求的开发NoneBot 可选地包含了计划任务功能。
::: tip 提示
2018-12-27 20:23:45 +08:00
本章的完整代码可以在 [awesome-bot-6](https://github.com/richardchien/nonebot/tree/master/docs/guide/code/awesome-bot-6) 查看。
2018-08-26 12:35:53 +08:00
:::
2018-10-15 11:17:52 +08:00
## 安装 `scheduler` 可选功能
2018-08-26 12:35:53 +08:00
计划任务功能在 NoneBot 中是可选功能,只有当同时安装了 [APScheduler](https://github.com/agronholm/apscheduler) 时,才会启用。
2018-10-15 11:17:52 +08:00
使用下面命令安装可选功能(会自动安装 APScheduler
2018-08-26 12:35:53 +08:00
```bash
2019-01-21 15:25:45 +08:00
pip install "nonebot[scheduler]"
2018-08-26 12:35:53 +08:00
```
2018-12-27 20:23:45 +08:00
安装成功之后就可以通过 `nonebot.scheduler` 访问 [`AsyncIOScheduler`](https://apscheduler.readthedocs.io/en/latest/modules/schedulers/asyncio.html#apscheduler.schedulers.asyncio.AsyncIOScheduler) 对象。
2018-08-26 12:35:53 +08:00
## 定时发送消息
这里以一个整点报时的功能为例,来介绍定时任务的使用。
新建文件 `awesome/plugins/scheduler.py`,编写代码如下:
```python {8}
from datetime import datetime
2018-12-27 20:23:45 +08:00
import nonebot
2018-08-26 12:35:53 +08:00
import pytz
from aiocqhttp.exceptions import Error as CQHttpError
2018-12-27 20:23:45 +08:00
@nonebot.scheduler.scheduled_job('cron', hour='*')
2018-08-26 12:35:53 +08:00
async def _():
2018-12-27 20:23:45 +08:00
bot = nonebot.get_bot()
2018-08-26 12:35:53 +08:00
now = datetime.now(pytz.timezone('Asia/Shanghai'))
try:
await bot.send_group_msg(group_id=672076603,
message=f'现在{now.hour}点整啦!')
except CQHttpError:
pass
```
2018-12-27 20:23:45 +08:00
这里最主要的就是第 8 行,`nonebot.scheduler.scheduled_job()` 是一个装饰器,第一个参数是触发器类型(这里是 `cron`,表示使用 [Cron](https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron) 类型的触发参数)。这里 `hour='*'` 表示每小时都执行,`minute` 和 `second` 不填时默认为 `0`,也就是说装饰器所装饰的这个函数会在每小时的第一秒被执行。
2018-08-26 12:35:53 +08:00
2018-12-27 20:23:45 +08:00
除了 `cron`,还有两种触发器类型 `interval``date`。例如,你可以使用 `nonebot.scheduler.scheduled_job('interval', minutes=10)` 来每十分钟执行一次任务。
2018-08-26 12:35:53 +08:00
2018-12-27 20:23:45 +08:00
限于篇幅,这里无法给出太详细的接口介绍,`nonebot.scheduler` 是一个 APScheduler 的 `AsyncIOScheduler` 对象,因此关于它的更多使用方法,可以参考 [APScheduler 的官方文档](https://apscheduler.readthedocs.io/en/latest/userguide.html)。