转发消息与消息结点

在前一部分 消息内容的数据结构 中我们说明了 OneBot 标准是如何表示单条 qq 消息中可能存在的多种类型的内容的(如文本、语音或图片),主要是通过 CQ 字符串消息段数组的形式。

但是如果是转发消息这种包含多条消息的消息,要如何表示呢?这个时候就需要转发消息段或消息结点了。

在 melobot 中,你不需要手动处理“转发消息段”、“消息结点”的数据结构。虽然无需手动处理,但是了解这些数据结构,有助于你使用 melobot 提供的相关方法

转发消息段

每一条已存在的转发消息,都对应一个唯一的转发 id。使用转发 id 就可以表示一条已存在的转发消息

两种格式的表示方法:

{
    "type": "forward",
    "data": {
        "id": "xxxxxxxxx"
    }
}
[CQ:forward,id=xxxxxxxxx]

参数名

可能的值

说明

id

-

转发 ID

消息结点

提示

在 OneBot 标准和其他一些文档中,习惯说“消息节点”,这与本文档中的“消息结点”完全是同一概念。

除了使用转发 ID 表示已存在的转发消息,我们也可以通过已存在的单条消息一条新消息来构造一条过去不存在的转发消息(新转发消息)

此时,已存在的单条消息一条新消息都需要用“消息结点”来表示。而消息结点的数组,自然也就可以表示整条“新转发消息”了。消息结点有两种:

  • 合并转发结点(对应“已存在的单条消息”,需要消息 ID 来标识)

  • 合并转发自定义结点(对应“一条新消息”,这条消息之前完全不存在)

合并转发结点

两种格式的表示方法:

{
    "type": "node",
    "data": {
        "id": "123456"
    }
}
[CQ:node,id=123456]

参数名

可能的值

说明

id

-

转发的消息 ID

消息 ID 在 melobot 中可通过消息事件的 id 属性获得。

合并转发自定义结点

提示

合并转发自定义结点的 content 字段,可以是“CQ字符串”或“消息段数组”。

例子 1:

{
    "type": "node",
    "data": {
        "user_id": "10001000",
        "nickname": "某人",
        "content": "[CQ:face,id=123]哈喽~"
    }
}
[CQ:node,user_id=10001000,nickname=某人,content=[CQ:face,id=123]哈喽~]

例子 2:

{
    "type": "node",
    "data": {
        "user_id": "10001000",
        "nickname": "某人",
        "content": [
            {"type": "face", "data": {"id": "123"}},
            {"type": "text", "data": {"text": "哈喽~"}}
        ]
    }
}

参数名

可能的值

说明

user_id

-

发送者 QQ 号

nickname

-

发送者昵称

content

-

消息内容,即上一章所述的单条消息内容

melobot 中的表示

在 melobot 中:

  • 转发消息段,属于消息段对象(类型注解为 MsgSegment 的字典)

  • 消息结点,使用类型注解为 MsgNode 的字典表示

  • 转发消息,使用消息结点的列表(list[MsgNode])表示