Skip to content

Commit 2d49902

Browse files
committed
docs(advanced): 更新富文本消息文档
- 修改示例代码,展示 CQ Code 字符串的使用 - 调整字符串自动解析的描述,强调 CQ Code 格式 - 增加对 CQ Code 解析严格性的说明,不推荐使用 - 更新 `add` 方法描述,增加链式调用示例 - 澄清 `render` 方法的用途,增加 `strip` 方法说明 - 补充 `Segment` 类的说明,增加索引和布尔运算支持 - 添加对 XML 和 JSON 消息段的说明 - 增加对 Onebot11 协议和 MRB2 代码的引用
1 parent c8ffe82 commit 2d49902

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

docs/advanced/rich-text.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def handle_rich_test(event: CommandManager.CommandEvent):
2323
message_to_send = QQRichText.QQRichText(
2424
QQRichText.Reply(event.message_id), # 回复触发命令的消息
2525
QQRichText.At(event.user_id), # @ 发送者
26-
" 你好!这是一条包含多种元素的消息:\n", # 字符串会自动转为 Text 段
26+
" 你好!这是一条包含多种元素的消息:\n[CQ:video,file=https://www.example.com/video.mp4]", # 字符串会自动按照CQCode 格式解析为消息段
2727
QQRichText.Face(178), # QQ 系统表情
2828
QQRichText.Image("https://www.example.com/logo.png") # 网络图片
2929
)
@@ -75,7 +75,7 @@ def handle_rich_test(event: CommandManager.CommandEvent):
7575
如开篇示例所示,`QQRichText` 的构造函数非常灵活,可以接受多种类型的输入:
7676

7777
- **单个或多个 `Segment` 对象**: `QQRichText(QQRichText.Text("你好"), QQRichText.At(123))`
78-
- **字符串**: 会被自动解析为 CQ Code 和文本段。`QQRichText("[CQ:at,qq=123] 你好")`
78+
- **字符串**: 会被自动按 CQ Code 解析: `QQRichText("[CQ:at,qq=123] 你好")` 目前 MRB2 的 CQ Code 解析器非常严格,请注意格式,不推荐使用,并且如果输入内容可能不安全,且仅需文本,请使用 `QQRichText.Text()` 来创建。
7979
- **`Segment` 对象的列表或元组**: `QQRichText([QQRichText.Text("..."), ...])`
8080
- **消息段数组**: `QQRichText([{'type': 'text', 'data': {'text': '...'}}, ...])`
8181
- **混合以上所有类型**: `QQRichText(QQRichText.Reply(123), "请看图:", [CQ:image,...])`
@@ -84,21 +84,24 @@ def handle_rich_test(event: CommandManager.CommandEvent):
8484
### 主要方法和属性
8585

8686
- **`add(*segments)`**:
87-
- 向当前 `QQRichText` 对象的末尾追加一个或多个消息段。
88-
- `message.add(QQRichText.Text("..."), QQRichText.Face(1))`
87+
- 向当前 `QQRichText` 对象的末尾追加一个或多个消息段,同时返回self,可以链式调用
88+
- `message.add(QQRichText.Text("..."), QQRichText.Face(1)).add(QQRichText.At(1))`
8989

9090
- **`__str__()`**:
9191
-`QQRichText` 对象转换为 **CQ Code 字符串**。非常适合用于日志记录和调试。
9292
- `print(f"将发送: {message_to_send}")`
9393

9494
- **`get_array() -> list[dict]`**:
9595
- **重要方法**。返回符合 OneBot 标准的消息段数组格式。
96-
- 当你需要手动调用 `Actions.SendMsg` 等底层 API 时,这个方法非常有用。不过,通常情况下,`event.reply/send``CommandManager` 会自动处理转换,你只需传递 `QQRichText` 对象即可。
96+
- 当你需要手动调用底层 API 时,这个方法非常有用。不过,通常情况下,`event.reply/send``CommandManager` 会自动处理转换,你只需传递 `QQRichText` 对象即可。
9797

9898
- **`render(group_id=None)`**:
9999
- 生成一个**人类可读**的字符串,会尝试将 `@` 显示为昵称,将图片/语音等显示为 `[类型: 描述]`
100-
- **主要用于日志和控制台输出,不用于发送消息**
100+
- **主要用于日志和控制台输出,不同于CQ Code,不可用于发送消息和反向转换**
101+
- 其的目的主要是为了解决 CQ Code 的各种转码导致你想打开图片都得加载转码的问题。
101102
- `logger.info(f"收到消息: {event.message.render(event.group_id)}")`
103+
- **`strip()`**:
104+
- 移出像消息段开头和结尾的可能的Text消息段开头和结尾的空格和换行,然后返回一个新的 `QQRichText` 对象。
102105

103106
### 操作符重载
104107

@@ -109,6 +112,8 @@ def handle_rich_test(event: CommandManager.CommandEvent):
109112
combined_rt = rt1 + rt2 + " Part 3"
110113
```
111114
- **`==` (等于)**: 比较两个 `QQRichText` 对象的内部消息段列表是否完全相同。
115+
- **`[index]` (索引)**: 返回索引处的消息段。
116+
- **bool**: 如果 `QQRichText` 对象为空,则返回 False。否则返回 True
112117

113118
## `Segment` 类:消息的基本单元
114119

@@ -119,7 +124,7 @@ def handle_rich_test(event: CommandManager.CommandEvent):
119124
* **`Image(file: str)`**: 图片。`file` 参数可以是:
120125
* 本地绝对路径: `"/home/user/img.png"` (会自动转为 `file:///...`)
121126
* 网络 URL: `"http://example.com/image.jpg"`
122-
* Base64 编码: `"base64://..."`
127+
* Base64 编码: `"base64://..."`,需要注意的是部分实现段对消息段长度有限制,Base64可能过长导致发送失败
123128

124129
* **`At(qq: int | str)`**: @某人。`qq` 参数可以是 QQ 号,或 `"all"` (需机器人有权限)。
125130

@@ -143,6 +148,8 @@ def handle_rich_test(event: CommandManager.CommandEvent):
143148

144149
* **`XML(data: str)`** / **`JSON(data: str)`**: XML/JSON 卡片消息。
145150

151+
剩余的封装请看 [Onebot11协议原文](https://github.com/botuniverse/onebot-11/blob/master/message/segment.md)和MRB2代码
152+
146153
## 工具函数
147154

148155
模块内还包含一些底层转换函数,一般由框架内部调用,了解即可:

0 commit comments

Comments
 (0)