nonebot2 二编写基础插件

本文最后更新于:2023年12月15日 晚上

前言

相信经过前面的学习 大家已经学会启动nonebot了 和 加载插件 那今天我们写一个插件

认识Nonebot文件结构

在上一篇中 我们创建了一个nb项目

以下是该文件结构

我们先打开pyproject.toml

内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[project]
name = "test" # 插件名字
version = "0.1.0" # 插件版本
description = "test" # 插件介绍
readme = "README.md" # 插件文档
requires-python = ">=3.8, <4.0" # 适用py版本 (勿动)

[tool.nonebot]
adapters = [
{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" }
] # 勿动
plugins = []
plugin_dirs = ["src/plugins"]
builtin_plugins = ["echo"]

看到

1
2
3
plugins = []
plugin_dirs = ["src/plugins"]
builtin_plugins = ["echo"]

plugins是加载成品的加载 也就是你从nb官网下载的插件

一般以这种形式开头

1
plugins = ["nonebot_plugin_xxxx"]

plugin_dirs 则是加载文件夹里的插件

1
plugin_dirs = ["src/plugins"] # 加载scr文件夹里的plugin文件夹下的插件

builtin_plugins 则是加载官方内置的插件 一般用不到 可以改为

1
builtin_plugins = []

改好之后保存即可

打开.env.dev

1
LOG_LEVEL=DEBUG

我们删除这句话 并添加如下内容

注意 这里不要使用系统自带记事本取修改 否则会报如下错误

1
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc5 in position 16: invalid continuation byte
1
2
3
4
5
6
HOST=0.0.0.0  # 配置 NoneBot 监听的 IP / 主机名 默认127.0.0.1
PORT=8080 # 配置 NoneBot 监听的端口 这里设置成你的cq对接的端口号
COMMAND_START=["/"] # 配置命令起始字符
COMMAND_SEP=["."] # 配置命令分割字符
SUPERUSERS=["你的qq号"] # nb超级管理员 输入你的qq号

这样配置基础就做好了

开启环境

在你的scr/plugins 创建一个py文件 名字随意

用vscode打开他

编写如下内容

1
2
3
4
5
6
7
from nonebot import on_command

a = on_command("你好") # 设置一个消息指令

@a.handle()
async def _(): # 当触发这个消息的时候 async def里的代码会被执行
await a.finish("hello world") # 结束事件返回一句 hello world

保存

启动你的nb和cq

向你的机器人回复一句你好 你便会收到一句hello world

插件编写

函数 作用
on_command 设置消息关键字 当消息开头包含关键字即触发
on_fullmatch 设置消息关键字 当关键字与消息完全一致时触发
on_keyword 设置消息关键字 当消息包含关键字时触发
random.randint(0,7) 生成一个0~7的随机数 可以随意更改
random.choice(a) 从a列表里随机挑一个出来
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from nonebot import on_fullmatch
import random

a = on_fullmatch("随机人生")

@a.handle()
async def _():
name = ["大音希声","恬静可人","珞珞如石"] # 姓名
age = random.randint(19,27) # 随机年龄
job = ["行政主管","企业主管","经理人","土木营造监工"] # 职业

name_ = random.choice(name) # 随机姓名
job_ = random.choice(job)

await a.finish(f"姓名:{name_}\n年龄:{age}\n职业:{job_}") # 结束事件并发送消息

以上为一个基础的插件 如不出意外 你会收到机器人回复

我们可以进一步的改进一下 例如加一些等待

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from nonebot import on_fullmatch
import random
import asyncio

a = on_fullmatch("随机人生")

@a.handle()
async def _():
name = ["大音希声","恬静可人","珞珞如石"] # 姓名
age = random.randint(19,27) # 随机年龄
job = ["行政主管","企业主管","经理人","土木营造监工"] # 职业

await a.send("请稍等,正在生成中") # 发送一条消息
await asyncio.sleep(3) # 冷却3秒

name_ = random.choice(name) # 随机姓名
job_ = random.choice(job)

await a.finish(f"姓名:{name_}\n年龄:{age}\n职业:{job_}") # 结束事件并发送消息

这样更完美了 当然你也可以加一些数据进去

这算是个基础插件编写了

后记

下一篇 我会讲解如何去调用管理员权限 以及 写连续对话的插件


nonebot2 二编写基础插件
http://blog.bingyue.top/2023/07/04/nonebot_teach_3/
作者
bingyue
发布于
2023年7月4日
许可协议