2018-10-15 11:17:52 +08:00
|
|
|
|
# 添加计划任务
|
2018-08-26 12:35:53 +08:00
|
|
|
|
|
|
|
|
|
实际应用中还经常会有定时执行任务的需求,为了方便这类需求的开发,NoneBot 可选地包含了计划任务功能。
|
|
|
|
|
|
2020-03-16 21:10:26 +08:00
|
|
|
|
:::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)。
|