前言
应粉丝群内粉丝要求,我也决定写一个Nonebot插件编写教程,从0开始教学。有些不对的地方也欢迎大家指正,修改。
开始
准备
- 合适的代码编辑器
- 一定的python基础
- 懂得提问的方式
代码编辑器
代码编辑器有很多种选择,比如 vscode ,pycharm 等等,我个人是比较倾向于使用pycharm,可能因为用习惯了吧,当然你也可以使用vscode,Nonebot官方也是推荐使用vscode来进行程序的编写
详情请参考 编辑器支持 | NoneBot
新建项目
我们随便找个地方来新建项目
比如我这里就是在D盘下Python开发->bot_class目录下新建了项目,那么怎么创建一个新的项目呢?在你想要创建项目的地方打开cmd,输入 nb create
接着按照引导一步一步来就行了,如果不会操作请移步我的bot搭建教程查看,链接放这: 新版nonebot,go-cqhttp搭建qq机器人保姆级教程_onebotqq机器人_萌新源的博客-CSDN博客
记住,我是比较习惯将插件放在src目录下,因为旧版nonebot就是如此,所以为了方便我选择将插件放在src目录下,你们可以自行选择放在项目根目录或者src目录下
第一个插件
先上全代码
from nonebot import on_regex
from nonebot.adapters.onebot.v11 import Bot, Event
cici = on_regex(pattern=r'^你好$')
@cici.handle()
async def cici_handle(bot: Bot, event: Event):
await cici.finish('你好啊,看起来你已经成功学会了关键词检测回复了呢')
导入包的作用
这里解释一下我们导入的包的作用
1.
from nonebot import on_regex
这行代码我们导入了on_regex包,其作用就是正则匹配,比如你发“你好”此时与我们设定的响应规则一致,于是插件就会开始工作,当然你也可以将命令修改为其他的,都可以。注意这里是正则匹配,不是关键词检测,比如我命令设置的是你好,但是用户发送你好呀此时我们的插件就不会响应,那如果想要你好呀也响应怎么办,下节课讲,有个包叫on_keyword,懂英语的同学一看就知道这个包是做什么的了吧
2.
from nonebot.adapters.onebot.v11 import Bot, Event
这里我们导入了Bot和Event,Bot的作用就是去调用gocqhttp[以下简称平台]的api,比如我们代码中await cici.finish('你好啊,看起来你已经成功学会了关键词检测回复了呢')
也可以调用平台api,这样写:await bot.send_group_msg(group_id=event.group_id,message='你好啊,看起来你已经成功学会了关键词检测回复了呢')
效果是一样的,只不过后者更麻烦一点
注册事件响应器
在代码中 cici = on_regex(pattern=r'^你好$')
我们注册了一个名为“cici”正则事件响应器,至于名字可以随意更换,跟着自己的感觉来就好
事件处理函数
在事件响应器中,事件处理流程可以由一个或多个“事件处理函数”组成,这些事件处理函数将会按照顺序依次对事件进行处理,直到全部执行完成或被中断。我们可以采用事件响应器的“事件处理函数装饰器”来添加这些“事件处理函数”。
顾名思义,“事件处理函数装饰器”是一个装饰器(decorator),那么它的使用方法也同函数定义中所展示的包装用法相同。
from nonebot import on_regex
from nonebot.adapters.onebot.v11 import Bot, Event
cici = on_regex(pattern=r'^你好$')
@cici.handle()
async def cici_handle(bot: Bot, event: Event):
pass #不做任何事
如上方示例所示,我们使用 cici
响应器的 handle
装饰器装饰了一个函数 cici_handle
。cici_handle
函数会被添加到 cici
的事件处理流程中。在 cici
响应器被触发之后,将会依次调用 cici
响应器的事件处理函数,即 cici_handle
来对事件进行处理。
事件响应器操作
在事件处理流程中,我们可以使用事件响应器操作来进行一些交互或改变事件处理流程,例如向机器人用户发送消息或提前结束事件处理流程等。
事件响应器操作与事件处理函数装饰器类似,通常作为事件响应器 Matcher
的类方法存在,因此事件响应器操作的调用方法也是 Matcher.func()
的形式。不过不同的是,事件响应器操作并不是装饰器,因此并不需要@进行标注。
from nonebot import on_regex
from nonebot.adapters.onebot.v11 import Bot, Event
cici = on_regex(pattern=r'^你好$')
@cici.handle()
async def cici_handle(bot: Bot, event: Event):
await cici.finish('你好啊,看起来你已经成功学会了关键词检测回复了呢')
#await cici.send('你好啊,看起来你已经成功学会了关键词检测回复了呢')
如上方示例所示,我们使用 cici
响应器的 finish
操作方法向机器人用户回复了 你好
并结束了事件处理流程。效果如下:
值得注意的是,在执行 finish
方法时,NoneBot 会在向机器人用户发送消息内容后抛出 FinishedException
异常来结束事件响应流程。也就是说,在 finish
被执行后,后续的程序是不会被执行的。如果你需要回复机器人用户消息但不想事件处理流程结束,可以使用注释的部分中展示的 send
方法。
结尾
至此,你已经完成了nonebot插件编写的第一课,你已经懂得如何注册一个事件响应器,并且让bot在触发命令的情况下回复用户信息。这是一个好的开始,也祝你能够早日成为大佬,也欢迎你加入Nonebot社区,为Nonebot社区贡献一份属于自己的力量