经常在群里看到有人问nonebot怎么发图片,发语音等等,其实都可以通过CQ码发送,在nonebot第一代的时候可以通过调用MessageSegment下的方法发送图片等。
发送图片的方法如下
MessageSegment.image(...)
那为什么v2反而没有了呢?
我一开始也很疑惑,但后来就发现因为v2集成了更多的adapter,cqhttp也分离出来,一般默认导入的MessageSegment如下所示
from nonebot.adapters import MessageSegment
这个基类是没有封装cqhttp的API的,因此需要如下所示导入
from nonebot.adapters.cqhttp import MessageSegment
这时就可以调用类似MessageSegment.image(…)发送图片或其他类型的消息
进入MessageSegment就可以看到封装的各种消息类型
(有时候源码确实比文档好用)
如果你使用onebot,那么nonebot更偏向适配onebot的消息类型,但是如果你使用go-cqhttp,有些消息类型并没有被适配,这时我们可以用更一般的方式给go-cqhttp发送数据,给出实例如下
GroupIncrease = on_notice()
"""群成员增加事件"""
@GroupIncrease.handle()
async def handle_first_receive(bot: Bot, event: GroupIncreaseNoticeEvent, state: T_State):
rely = [
{
"type": "text",
"data": {
"text": "欢迎"
}
},
{
"type": "at",
"data": {
"qq": f"{event.user_id}"
}
},
{
"type": "text",
"data": {
"text": "进群"
}
},
{
"type": "image",
"data": {
"file": f"https://q4.qlogo.cn/headimg_dl?dst_uin={event.user_id}&spec=640"
}
}
]
await bot.send(event=event, message=rely)
基础模板就是
{
"type": ,#消息的类型,官方给出了各种类型的CQ码
"data": {
#这里对应不同类型消息的参数
}
}
go-cqhttp文档给出的CQ码
如果需要将多种消息合并发送只需要用数组封装即可,发送给go-cqhttp的数据也是数组封装的,所以即使只有一种消息类型也需要数组封装。