Skip to content

消息构造器

AniaBot 提供链式调用风格的消息构造器,支持文本、图片、视频、文件、语音、表情、@ 等所有消息类型,以及合并转发消息。

创建构造器

go
import "github.com/jeanhua/AniaBot/common/msgchain"

// 群聊消息构造器
builder := msgchain.Builder().Group()

// 私聊消息构造器
builder := msgchain.Builder().Friend()

// 群聊合并转发构造器
fwd := msgchain.Builder().GroupForward()

// 私聊合并转发构造器
fwd := msgchain.Builder().FriendForward()

方法速览

方法群聊私聊说明
Text(text)文本消息
Face(faceId)QQ 表情
Reply(msgId)引用回复
ImageUrl(url)图片(URL)
ImageLocal(path)图片(本地路径)
ImageBase64(bs64)图片(Base64)
VideoUrl(url)视频(URL)
VideoLocal(path)视频(本地路径)
VideoBase64(bs64)视频(Base64)
RecordUrl(url)语音(URL)
RecordLocal(path)语音(本地路径)
RecordBase64(bs64)语音(Base64)
FileUrl(name, url)文件(URL)
FileLocal(name, path)文件(本地路径)
FileBase64(name, bs64)文件(Base64)
Mention(userId)@ 某人
Raw(segments...)原始 OB11 消息段

文本

go
builder.Text("这是一段文本")

支持换行:

go
builder.Text("第一行\n第二行")

表情

传入 QQ 表情 ID:

go
builder.Face(14)  // 微笑
builder.Face(76)  // 再见

引用回复

go
builder.Reply(msg.MessageId)

WARNING

Reply 通常放在消息链最前面。

图片

支持 URL、本地文件、Base64 三种来源:

go
// URL
builder.ImageUrl("https://example.com/image.jpg")

// 本地文件(绝对路径),注意如果是容器化需要针对协议程序的路径
builder.ImageLocal("/data/images/avatar.png")

// Base64(不含 data:image/... 前缀,直接传编码字符串)
builder.ImageBase64("iVBORw0KGgoAAAANSUhEUgAA...")

视频

go
builder.VideoUrl("https://example.com/video.mp4")
builder.VideoLocal("/data/videos/clip.mp4")
builder.VideoBase64("AAAAIGZ0eXBpc29t...")

语音

go
builder.RecordUrl("https://example.com/audio.mp3")
builder.RecordLocal("/data/audio/hello.silk")
builder.RecordBase64("AAAA...")

INFO

napcat 支持的语音格式以其文档为准,通常为 silk 或 mp3。

文件

文件方法比图片多一个 name 参数(显示的文件名):

go
builder.FileUrl("报告.pdf", "https://example.com/report.pdf")
builder.FileLocal("数据.xlsx", "/data/export/data.xlsx")
builder.FileBase64("说明.txt", "SGVsbG8gV29ybGQ=")

@ 某人(仅群聊)

go
builder.Mention(msg.Sender.UserId)  // @ 消息发送者
builder.Mention(12345678)           // @ 指定 QQ 号

链式调用

所有方法均返回构造器自身,支持链式调用:

go
b.SendGroupMsg(msg.GroupId,
    msgchain.Builder().Group().
        Reply(msg.MessageId).
        Mention(msg.Sender.UserId).
        Text(" 你好!").
        Face(14).
        Build(),
)

发送消息

go
// 发送群聊消息
b.SendGroupMsg(msg.GroupId, builder.Build())

// 发送私聊消息
b.SendFriendMsg(msg.Sender.UserId, builder.Build())

合并转发消息

将多条消息合并成一条「聊天记录」形式发送。

群聊合并转发

go
fwd := msgchain.Builder().GroupForward()

// 添加消息节点(模拟不同用户发言)
fwd.Message(
    msg.Sender.UserId,
    msg.Sender.Nickname,
    msgchain.Builder().Group().Text("第一条消息").Build(),
)
fwd.Message(
    bot.SelfId(),
    "AniaBot",
    msgchain.Builder().Group().Text("第二条消息").ImageUrl("https://example.com/img.jpg").Build(),
)

b.SendGroupForwardMsg(msg.GroupId, fwd.Build())

私聊合并转发

go
fwd := msgchain.Builder().FriendForward()

fwd.Message(
    msg.Sender.UserId,
    msg.Sender.Nickname,
    msgchain.Builder().Friend().Text("这是转发内容").Build(),
)

b.SendFriendForwardMsg(msg.Sender.UserId, fwd.Build())

Raw — 原始消息段

当内置方法不满足需求时,可直接构造 OB11 消息段:

go
import "github.com/jeanhua/AniaBot/common/model/message"

builder.Raw(message.OB11Segment{
    Type: "share",
    Data: map[string]any{
        "url":     "https://example.com",
        "title":   "分享标题",
        "content": "分享描述",
        "image":   "https://example.com/thumb.jpg",
    },
})

基于 MIT 许可证发布