本文最后更新于: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"
[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"]
|
builtin_plugins 则是加载官方内置的插件 一般用不到 可以改为
改好之后保存即可
打开.env.dev
我们删除这句话 并添加如下内容
注意 这里不要使用系统自带记事本取修改 否则会报如下错误
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 PORT=8080 COMMAND_START=["/"] COMMAND_SEP=["."] SUPERUSERS=["你的qq号"]
|
这样配置基础就做好了
开启环境
在你的scr/plugins
创建一个py文件 名字随意
用vscode打开他
编写如下内容
1 2 3 4 5 6 7
| from nonebot import on_command
a = on_command("你好")
@a.handle() async def _(): await a.finish("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)
name_ = random.choice(name) job_ = random.choice(job)
await a.finish(f"姓名:{name_}\n年龄:{age}\n职业:{job_}")
|
这样更完美了 当然你也可以加一些数据进去
这算是个基础插件编写了
后记
下一篇 我会讲解如何去调用管理员权限 以及 写连续对话的插件