mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-07-28 00:31:14 +00:00
Update docs
This commit is contained in:
@ -1,44 +1,31 @@
|
||||
# 计划任务
|
||||
|
||||
nonebot 内置了 apscheduler,
|
||||
通过`from nonebot import scheduler`获取,
|
||||
这是一个`AsyncIOScheduler`的实例,
|
||||
详细用法可见[官方文档](https://apscheduler.readthedocs.io/)。
|
||||
|
||||
这里列出一些常见的用法。
|
||||
NoneBot 可选地内置了计划任务功能,在指南的 [添加计划任务](../guide/scheduler.md) 已经进行了简单的介绍。这里列出更多常见的用法。
|
||||
|
||||
## 固定的计划任务
|
||||
|
||||
利用固定的*触发器*(trigger)来触发某些任务
|
||||
可以利用固定的*触发器*(trigger)来触发某些任务。
|
||||
|
||||
### 一次性任务
|
||||
|
||||
`date`触发器
|
||||
[完整文档](https://apscheduler.readthedocs.io/en/stable/modules/triggers/date.html#module-apscheduler.triggers.date)
|
||||
|
||||
固定时间触发,仅触发一次
|
||||
[`date` 触发器](https://apscheduler.readthedocs.io/en/stable/modules/triggers/date.html#module-apscheduler.triggers.date) 固定时间触发,仅触发一次:
|
||||
|
||||
```python
|
||||
from datetime import datetime
|
||||
|
||||
@nonebot.scheduler.scheduled_job(
|
||||
'cron',
|
||||
'date',
|
||||
run_date=datetime(2021, 1, 1, 0, 0),
|
||||
# timezone=None,
|
||||
)
|
||||
)
|
||||
async def _():
|
||||
await bot.send_group_msg(group_id=672076603,
|
||||
await bot.send_group_msg(group_id=123456,
|
||||
message="2021,新年快乐!")
|
||||
```
|
||||
|
||||
### 定期任务
|
||||
|
||||
`cron`触发器
|
||||
[完整文档](https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html#module-apscheduler.triggers.cron)
|
||||
|
||||
从`start_date`开始,每一个固定时间触发,到`end_date`结束
|
||||
|
||||
比如每小时、每个工作日早上8点
|
||||
[`cron` 触发器](https://apscheduler.readthedocs.io/en/stable/modules/triggers/cron.html#module-apscheduler.triggers.cron) 从 `start_date` 开始到 `end_date` 结束,根据类似 [Cron](https://wiki.archlinux.org/index.php/Cron_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)) 的规则触发任务:
|
||||
|
||||
```python
|
||||
@nonebot.scheduler.scheduled_job(
|
||||
@ -54,18 +41,15 @@ async def _():
|
||||
# start_date=None,
|
||||
# end_date=None,
|
||||
# timezone=None,
|
||||
)
|
||||
)
|
||||
async def _():
|
||||
await bot.send_group_msg(group_id=672076603,
|
||||
await bot.send_group_msg(group_id=123456,
|
||||
message="起床啦!")
|
||||
```
|
||||
|
||||
### 间隔任务
|
||||
|
||||
`interval`触发器
|
||||
[完整文档](https://apscheduler.readthedocs.io/en/stable/modules/triggers/interval.html#module-apscheduler.triggers.interval)
|
||||
|
||||
从`start_date`开始,每间隔一段时间触发,到`end_date`结束
|
||||
[`interval` 触发器](https://apscheduler.readthedocs.io/en/stable/modules/triggers/interval.html#module-apscheduler.triggers.interval) 从 `start_date` 开始,每间隔一段时间触发,到 `end_date` 结束:
|
||||
|
||||
```python
|
||||
@nonebot.scheduler.scheduled_job(
|
||||
@ -77,20 +61,17 @@ async def _():
|
||||
# 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=672076603,
|
||||
message="RC更新啦!")
|
||||
await bot.send_group_msg(group_id=123456,
|
||||
message="XX有更新啦!")
|
||||
```
|
||||
|
||||
## 动态的计划任务
|
||||
|
||||
有时,我们需要机器人在运行的过程中,添加一些计划任务,
|
||||
那么我们就需要 `scheduler.add_job` 来帮忙
|
||||
|
||||
这里,我们以*一次性任务*为例,其他类型的任务可以用相同的方法
|
||||
有时,我们需要机器人在运行的过程中,添加或删除计划任务,那么我们就需要 `scheduler.add_job` 来帮忙。这里,我们以*一次性任务*为例,其他类型的任务可以用相同的方法:
|
||||
|
||||
```python
|
||||
import datetime
|
||||
@ -112,27 +93,22 @@ async def _(session: CommandSession):
|
||||
|
||||
# 添加任务
|
||||
scheduler.add_job(
|
||||
func=session.send, # 要添加任务的函数,不要带参数
|
||||
trigger=trigger, # 触发器
|
||||
args=('不要再赖床啦!',), # 函数的参数列表,注意:只有一个值时,不能省略末尾的逗号
|
||||
func=session.send, # 要添加任务的函数,不要带参数
|
||||
trigger=trigger, # 触发器
|
||||
args=('不要再赖床啦!',), # 函数的参数列表,注意:只有一个值时,不能省略末尾的逗号
|
||||
# kwargs=None,
|
||||
misfire_grace_time=60, # 允许的误差时间,建议不要省略
|
||||
# jobstore='default', # 任务储存库,在下一小节中说明
|
||||
misfire_grace_time=60, # 允许的误差时间,建议不要省略
|
||||
# jobstore='default', # 任务储存库,在下一小节中说明
|
||||
)
|
||||
```
|
||||
|
||||
## 储存任务
|
||||
<!-- ## 持久化存储任务
|
||||
|
||||
有时,我们动态添加的一些计划任务需要长时间储存,
|
||||
而普通储存的任务会在重启后丢失,
|
||||
那么我们就需要 `jobstore` 来帮忙
|
||||
有时,我们动态添加的一些计划任务需要持久化储存,否则任务会在重启后丢失,这时我们就需要 `jobstore` 来帮忙。
|
||||
|
||||
apscheduler 可以将任务存储在内存中或数据库中,
|
||||
默认 jobstore 将所有任务储存在内存中,关闭后即丢失。
|
||||
APScheduler 可以将任务存储在内存中或数据库中,默认 jobstore 将所有任务储存在内存中,关闭后即丢失。这里,我们以 SQLite 为例,将任务添加到数据库中。
|
||||
|
||||
这里,我们以 SQLite 为例,将任务添加到数据库中,
|
||||
|
||||
我们先创建一个数据库
|
||||
我们先创建一个数据库:
|
||||
|
||||
```python
|
||||
import asyncio
|
||||
@ -151,10 +127,9 @@ scheduler.add_jobstore(store, alias='my_job_store')
|
||||
之后,我们在添加新任务时,可以指定任务的储存库
|
||||
|
||||
```python
|
||||
bot = get_bot()
|
||||
|
||||
def alarm(*args, **kwargs):
|
||||
asyncio.run(bot.send(*args, **kwargs))
|
||||
async def alarm(*args, **kwargs):
|
||||
bot = get_bot()
|
||||
await bot.send(*args, **kwargs)
|
||||
|
||||
@on_command('提醒收菜')
|
||||
async def _(session: CommandSession):
|
||||
@ -173,7 +148,7 @@ async def _(session: CommandSession):
|
||||
'message': '起床收菜啦!',
|
||||
},
|
||||
misfire_grace_time=60,
|
||||
jobstore='my_job_store', # 任务储存库,指定为刚才创建的储存库
|
||||
jobstore='my_job_store', # 任务储存库,指定为刚才创建的储存库
|
||||
)
|
||||
```
|
||||
|
||||
@ -183,4 +158,4 @@ async def _(session: CommandSession):
|
||||
所以必须将任务转化为同步任务再储存。
|
||||
并且 `apscheduler` 中的 `AsyncIOScheduler` 在执行同步任务时,会新建一个执行器(executor),
|
||||
导致这个任务里无法使用 `asyncio.get_running_loop()` 来获取事件循环,
|
||||
只能使用 `asyncio.run(...)` 来运行异步函数。
|
||||
只能使用 `asyncio.run(...)` 来运行异步函数。 -->
|
||||
|
@ -2,22 +2,38 @@
|
||||
|
||||
如果需要对 web 框架进行更详细的控制,可以通过 `bot.server_app` 访问到内部的 Quart 对象,之后可以像使用 Quart 的 app 对象一样添加路由、设置生命周期处理函数等。
|
||||
|
||||
::: tip 提示
|
||||
Quart 是一个与 Flask 具有相同 API 的异步 web 框架,其用法可以参考 [官方文档](https://pgjones.gitlab.io/quart/)。
|
||||
:::
|
||||
|
||||
## 自定义路由
|
||||
|
||||
### 简单的主页
|
||||
这里以一个简单的管理页面为例:
|
||||
|
||||
```python
|
||||
from nonebot import get_bot
|
||||
bot = get_bot()
|
||||
import nonebot
|
||||
|
||||
@bot.server_app.route('/')
|
||||
async def hello_world():
|
||||
await bot.send_private_msg(1002647525, '你的主页被访问了')
|
||||
return '欢迎来到我的主页'
|
||||
bot = nonebot.get_bot() # 在此之前必须已经 init
|
||||
|
||||
@bot.server_app.route('/admin')
|
||||
async def admin():
|
||||
await bot.send_private_msg(12345678, '你的主页被访问了')
|
||||
return '欢迎来到管理页面'
|
||||
```
|
||||
|
||||
启动 nonebot 后访问 <http://127.0.0.1:8080/>,你会看见主页的欢迎词,并收到机器人的提醒。
|
||||
启动 NoneBot 后访问 <http://127.0.0.1:8080/admin>,你会看见管理页面的欢迎词,并收到机器人的提醒。
|
||||
|
||||
### 更多应用
|
||||
## 处理生命周期事件
|
||||
|
||||
Quart 是一个与 Flask 具有相同 API 的异步 web 框架,其用法可以参考[Flask官方文档](https://flask.palletsprojects.com/)或它的[简中翻译版本](http://docs.jinkan.org/docs/flask/),关于 Quart 可以参考[Quart官方文档](https://pgjones.gitlab.io/quart/)
|
||||
有时可能需要在 NoneBot 启动时初始化数据库连接池,例如:
|
||||
|
||||
```python
|
||||
import nonebot
|
||||
|
||||
bot = nonebot.get_bot() # 在此之前必须已经 init
|
||||
|
||||
@bot.server_app.before_serving
|
||||
async def init_db():
|
||||
# 这会在 NoneBot 启动后立即运行
|
||||
pass
|
||||
```
|
||||
|
Reference in New Issue
Block a user