nonebot2插件入门-你的第一个机器人插件(发送文字消息)
机器人需要各种插件来实现各种功能,只有个机器人框架是不够的。
教程开始
一、创建插件
插件要放在“src”文件夹下的“plugins”文件夹里(如果你的机器人框架按照前面的文章配置的话)
1、以文件夹形式创建插件(推荐)
接下来一个名为“test”的插件,操作方法是在如图所示目录下新建一个名为“test”的文件夹:
在新建的“test”文件夹下新建一个.py文件,命名为“__init__.py”
2、以文件的形式创建
二、示例代码
1、一个可以运行的插件
我们来简单编辑一下这个“__init__.py”(或者“test1.py”),代码如下:
1 import nonebot 2 from nonebot import on_command 3 from nonebot.adapters.onebot.v11 import Bot, Event 4 from nonebot.typing import T_State 5 test1 = on_command('测试') # 这个test1就是个变量名字,你写成 a = on_command('测试') 都可以,跟下面对应起来就行 6 @test1.handle() 7 async def test1_handle(bot: Bot, event: Event, state: T_State): 8 nonebot.logger.info("插件执行一次。") 9 await test1.finish() # 插件都要有这个 finish,表示结束这个插件的执行
上面程序的意思是:当机器人接收到指令“测试”的时候,在终端中会打印出[info]信息。
编辑好保存后运行测试一下,效果如下:
上图可以看到,发送“测试”,在终端中打印出了一条[info]信息。除了 nonebot.logger.info("要显示的文本") 还有nonebot.logger.success("要显示的文本") 和onebot.logger.warning("要显示的文本")等等,可自行尝试,用“print”的话是不会打印出字符来滴。
当然, test1 = on_command() 中除了,str型的指令文本还,还有很多参数,比如:
from nonebot.permission import SUPERUSER # 超级用户如何添加看前一篇文章 from nonebot.rule import to_me test1 = on_command("测试", aliases={'111', '222'},rule=to_me(), permission=SUPERUSER, priority=5)
aliases={'111', '222'} 指令别名,加上后,发送“测试”和发送“111”或发送“222”都可以触发插件,数量貌似没限制: aliases={'111', '222','333','444','lalal'}
rule=to_me() :英语很好懂吧,意思是当信息是发送给机器人的时候才算数,比如在群里你需要@机器人并发送“测试”,机器人才会有反应,不@而只发送“测试”,机器人就没反应。
permission=SUPERUSER 这一段的意思是,信息是超级用户发送的才算数。
priority=5:插件的优先级,这里写的是5,数字越小优先级越高。
代码中的注释可以看到所有可以写的参数:
它们的详细使用方法也可自行前往https://v2.nonebot.dev/docs/api/plugin/on#on_command 研究。
2、机器人实现发送信息功能
方法一(不推荐):
我们看finish的注释:
所以就有了:
1 import nonebot 2 from nonebot import on_command 3 from nonebot.adapters.onebot.v11 import Bot, Event 4 from nonebot.typing import T_State 5 test1 = on_command('你是谁') 6 @test1.handle() 7 async def test1_handle(bot: Bot, event: Event, state: T_State): 8 9 await test1.finish("我系外星人")
运行一下:
这种方法只能发送文字,不能发送表情或者图片,所以比较推荐使用第二种方法。
方法二(我自己这样用,比较推荐):
go-cqhttp给我们提供了很多api,比如我们要发送私聊消息,用到的内容如下图:
调用api的代码为:
1 await bot.call_api('send_private_msg', **{ 2 'user_id':int(user_id), 3 'message':msg 4 })
我们用它来继续完成我们的插件:
1 import nonebot 2 from nonebot import on_command 3 from nonebot.adapters.onebot.v11 import Bot, Event 4 from nonebot.typing import T_State 5 test1 = on_command('你是谁') 6 @test1.handle() 7 async def test1_handle(bot: Bot, event: Event, state: T_State): 8 user_id = str(event.get_user_id()) # 获取发送信息人的qq号码 9 msg = "我我我我是外星人" 10 11 await bot.call_api('send_private_msg', **{ 12 'user_id':int(user_id), 13 'message':msg 14 }) 15 16 await test1.finish()
学会举一反三,那么发送群聊消息的话用到的就是:
代码:
1 await bot.call_api('send_group_msg', **{ 2 'group_id':int(qunhao), 3 'message':msg 4 })
因此,完整的实现机器人发送 私聊或者群聊信息 的代码:
1 import nonebot 2 from nonebot import on_command 3 from nonebot.adapters.onebot.v11 import Bot, Event 4 from nonebot.typing import T_State 5 test1 = on_command('你是谁') 6 @test1.handle() 7 async def test1_handle(bot: Bot, event: Event, state: T_State): 8 9 msg = "我我我我是外星人" 10 session_id=event.get_session_id() #获取会话 id 的方法,用于判断当前事件属于哪一个会话,通常是用户 id、群组 id 组合 11 # nonebot.logger.info('会话ID:'+session_id) 12 13 if 'group' in session_id: 14 qunhao_tmplist = session_id.split('_') 15 qunhao = qunhao_tmplist[1] 16 # nonebot.logger.info('消息来自群聊'+qunhao) 17 msg = msg + "并且你的消息来自群聊" 18 await bot.call_api('send_group_msg', **{ #发送退出应用群聊消息 19 'group_id':int(qunhao), 20 'message':msg 21 }) 22 23 else: 24 # nonebot.logger.info('消息来自私聊') 25 user_id = str(event.get_user_id()) 26 msg = msg + "并且你的消息来自私聊" 27 await bot.call_api('send_private_msg', **{ #发送退出应用私聊消息 28 'user_id':int(user_id), 29 'message':msg 30 }) 31 32 await test1.finish()
运行结果如下:
go-cqhttp API介绍看这里:https://docs.go-cqhttp.org/api/#%E5%8F%91%E9%80%81%E7%A7%81%E8%81%8A%E6%B6%88%E6%81%AF
本文来自博客园,作者:精神小黑猫,转载请注明原文链接:https://www.cnblogs.com/daluobei/p/16746390.html,认为文章有用的小伙伴可以打赏打赏,万分感谢!