From 45ecbeda3633f445ddb8cb9aebcf966ff9934750 Mon Sep 17 00:00:00 2001
From: SessionHu <102411014+SessionHu@users.noreply.github.com>
Date: Tue, 8 Jul 2025 11:08:21 +0800
Subject: [PATCH] feat: rich text nodes for opus or dynamic
---
docs/dynamic/all.md | 62 +----
docs/dynamic/dynamic_enum.md | 23 +-
docs/opus/rich_text_nodes.md | 422 +++++++++++++++++++++++++++++++++++
3 files changed, 425 insertions(+), 82 deletions(-)
create mode 100644 docs/opus/rich_text_nodes.md
diff --git a/docs/dynamic/all.md b/docs/dynamic/all.md
index 693854a..169337b 100644
--- a/docs/dynamic/all.md
+++ b/docs/dynamic/all.md
@@ -277,48 +277,9 @@
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
-| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) |
+| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型) |
| text | str | 动态的文字内容 | |
-`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o]`:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| orig_text | str | 原始文本 | |
-| text | str | 替换后的文本 | |
-| type | str | 节点类型 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) |
-| emoji | obj | 表情信息 | |
-| jump_url | str | 跳转URL | |
-| rid | str | 关联id | |
-| goods | obj | 商品信息 | |
-| icon_name | str | 图标名称 | `taobao` |
-| pics | arr | 图片信息 | |
-
-`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o].emoji`:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| icon_url | str | 表情图片URL | |
-| size | num | 表情尺寸 | `1` `2` |
-| text | str | 表情的文字代码 | |
-| type | num | 表情类型 | `1` `2` `3` |
-
-`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o].goods`:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| jump_url | str | 跳转URL | |
-| type | num | `1` | |
-
-`data.items[n].modules.module_dynamic.desc.rich_text_nodes[o].pics[p]`:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| height | num | 高度 | |
-| size | num | 大小? | 单位为 K |
-| src | str | 图片 URL | |
-| width | num | 宽度 | |
-
`data.items[n].modules.module_dynamic.major`:
| 字段 | 类型 | 内容 | 备注 |
@@ -584,28 +545,9 @@
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
-| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) |
+| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型) |
| text | str | 评论内容 | |
-`data.items[n].modules.module_interaction.items[o].desc.rich_text_nodes`数组中的:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| orig_text | str | 原始文本 | |
-| rid | str | 关联ID | 用户UID |
-| text | str | 替换后文本 | |
-| type | str | 富文本节点类型 | [富文本节点类型](./dynamic_enum.md#富文本节点类型) |
-| emoji | obj | 表情信息 | |
-
-`data.items[n].modules.module_interaction.items[o].desc.rich_text_nodes[n].emoji`:
-
-| 字段 | 类型 | 内容 | 备注 |
-| --- | --- | --- | --- |
-| icon_url | str | 表情图片URL | |
-| size | num | 表情尺寸 | `1` `2` |
-| text | str | 表情的文字代码 | |
-| type | num | 表情类型 | `1` `2` `3` |
-
`data.items[n].modules.module_fold`:
| 字段 | 类型 | 内容 | 备注 |
diff --git a/docs/dynamic/dynamic_enum.md b/docs/dynamic/dynamic_enum.md
index bdab471..1ae2919 100644
--- a/docs/dynamic/dynamic_enum.md
+++ b/docs/dynamic/dynamic_enum.md
@@ -29,28 +29,7 @@
## 富文本节点类型
-| 类型 | 说明 | 示例 |
-|---------------------------------|------|-----------------------------------------------------------------|
-| RICH_TEXT_NODE_TYPE_NONE | | |
-| RICH_TEXT_NODE_TYPE_TEXT | 文字节点 | [721295772787671059](https://t.bilibili.com/721295772787671059) |
-| RICH_TEXT_NODE_TYPE_AT | @用户 | [721296515797090324](https://t.bilibili.com/721296515797090324) |
-| RICH_TEXT_NODE_TYPE_LOTTERY | 互动抽奖 | [720907383182721040](https://t.bilibili.com/720907383182721040) |
-| RICH_TEXT_NODE_TYPE_VOTE | 投票 | [721203899129659408](https://t.bilibili.com/721203899129659408) |
-| RICH_TEXT_NODE_TYPE_TOPIC | 话题 | [721188862459641879](https://t.bilibili.com/721188862459641879) |
-| RICH_TEXT_NODE_TYPE_GOODS | 商品链接 | [721282703208480790](https://t.bilibili.com/721282703208480790) |
-| RICH_TEXT_NODE_TYPE_BV | 视频链接 | [716752002311258165](https://t.bilibili.com/716752002311258165) |
-| RICH_TEXT_NODE_TYPE_AV | | |
-| RICH_TEXT_NODE_TYPE_EMOJI | 表情 | [716751108968546393](https://t.bilibili.com/716751108968546393) |
-| RICH_TEXT_NODE_TYPE_USER | | |
-| RICH_TEXT_NODE_TYPE_CV | | |
-| RICH_TEXT_NODE_TYPE_VC | | |
-| RICH_TEXT_NODE_TYPE_VIEW_PICTURE | 查看图片 | [1069394178937454662](https://t.bilibili.com/1069394178937454662) |
-| RICH_TEXT_NODE_TYPE_WEB | 网页链接 | [716751027361022055](https://t.bilibili.com/716751027361022055) |
-| RICH_TEXT_NODE_TYPE_TAOBAO | | |
-| RICH_TEXT_NODE_TYPE_MAIL | 邮箱地址 | [721314095109767220](https://t.bilibili.com/721314095109767220) |
-| RICH_TEXT_NODE_TYPE_OGV_SEASON | 剧集信息 | [721282046064853080](https://t.bilibili.com/721282046064853080) |
-| RICH_TEXT_NODE_TYPE_OGV_EP | | |
-| RICH_TEXT_NODE_TYPE_SEARCH_WORD | | |
+参见 [图文富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型)
## 作者类型
diff --git a/docs/opus/rich_text_nodes.md b/docs/opus/rich_text_nodes.md
new file mode 100644
index 0000000..9695004
--- /dev/null
+++ b/docs/opus/rich_text_nodes.md
@@ -0,0 +1,422 @@
+# 富文本节点
+
+补充: 已知动态与图文接口获取结果的富文本节点与发送时的 `type` 等有关
+
+## 富文本节点类型
+
+| 类型 | 说明 | type | biz_id | 示例 |
+| ---- | ---- | ---- | ------ | ---- |
+| RICH_TEXT_NODE_TYPE_NONE | | | | |
+| RICH_TEXT_NODE_TYPE_TEXT | 文字节点 | 1 | 空 | [106514206257210983](https://t.bilibili.com/106514206257210983) |
+| RICH_TEXT_NODE_TYPE_AT | @用户 | 2 | 用户 mid (UID) | [721296515797090324](https://t.bilibili.com/721296515797090324) |
+| RICH_TEXT_NODE_TYPE_LOTTERY | 互动抽奖 | 3 | 抽奖 id | [720907383182721040](https://t.bilibili.com/720907383182721040) |
+| RICH_TEXT_NODE_TYPE_VOTE | 投票 | 4 | 投票 id | [721203899129659408](https://t.bilibili.com/721203899129659408) |
+| RICH_TEXT_NODE_TYPE_TOPIC | 话题 | | | [721188862459641879](https://t.bilibili.com/721188862459641879) |
+| RICH_TEXT_NODE_TYPE_GOODS | 商品链接 | | | [721282703208480790](https://t.bilibili.com/721282703208480790) |
+| RICH_TEXT_NODE_TYPE_BV | 视频链接 | | | [716752002311258165](https://t.bilibili.com/716752002311258165) |
+| RICH_TEXT_NODE_TYPE_AV | | | | |
+| RICH_TEXT_NODE_TYPE_EMOJI | 表情 | 9 | 空 | [1069394178937454662](https://t.bilibili.com/1069394178937454662) |
+| RICH_TEXT_NODE_TYPE_CV | 专栏 | | | |
+| RICH_TEXT_NODE_TYPE_VIEW_PICTURE | 查看图片 | | | [1069394178937454662](https://t.bilibili.com/1069394178937454662) |
+| RICH_TEXT_NODE_TYPE_WEB | 网页链接 | | | [716751027361022055](https://t.bilibili.com/716751027361022055) |
+| RICH_TEXT_NODE_TYPE_TAOBAO | | | | |
+| RICH_TEXT_NODE_TYPE_MAIL | 邮箱地址 | | | ~~721314095109767220~~ |
+| RICH_TEXT_NODE_TYPE_OGV_SEASON | 剧集信息 | | | ~~721282046064853080~~ |
+| RICH_TEXT_NODE_TYPE_OGV_EP | | | | |
+
+## 富文本节点对象
+
+### RICH_TEXT_NODE_TYPE_TEXT
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| orig_text | string | 原始文本 | |
+| text | string | 显示文本 | 一般与 `orig_text` 内容相同 |
+| type | string | `RICH_TEXT_NODE_TYPE_TEXT` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "orig_text": "【洛天依·共鸣宝石收藏家】设定也分享给大家~!",
+ "text": "【洛天依·共鸣宝石收藏家】设定也分享给大家~!",
+ "type": "RICH_TEXT_NODE_TYPE_TEXT"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_AT
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| orig_text | string | 原始文本 | |
+| rid | string | 用户 mid (UID) | |
+| text | string | 显示文本 | 一般与 `orig_text` 内容相同 |
+| type | string | `RICH_TEXT_NODE_TYPE_AT` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "orig_text": "@wuziqian211 ",
+ "rid": "425503913",
+ "text": "@wuziqian211 ",
+ "type": "RICH_TEXT_NODE_TYPE_AT"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_LOTTERY
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| orig_text | string | 原始文本 | 一般为 `互动抽奖` |
+| rid | string | 抽奖 id | |
+| text | string | 显示文本 | 一般为 `互动抽奖` |
+| type | string | `RICH_TEXT_NODE_TYPE_LOTTERY` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "orig_text": "互动抽奖",
+ "rid": "116067",
+ "text": "互动抽奖",
+ "type": "RICH_TEXT_NODE_TYPE_LOTTERY"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_VOTE
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| orig_text | string | 原始文本 | |
+| rid | string | 抽奖 id | |
+| text | string | 显示文本 | 一般与 `orig_text` 一致 |
+| type | string | `RICH_TEXT_NODE_TYPE_VOTE` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "orig_text": "次の文の ★ に入る最もよいものを一つ選びなさい。",
+ "rid": "3925886",
+ "text": "次の文の ★ に入る最もよいものを一つ選びなさい。",
+ "type": "RICH_TEXT_NODE_TYPE_VOTE"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_TOPIC
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | 跳转 URL | 无协议头 |
+| orig_text | string | 原始文本 | |
+| text | string | 显示文本 | 一般与 `orig_text` 一致 |
+| type | string | `RICH_TEXT_NODE_TYPE_TOPIC ` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "jump_url": "//search.bilibili.com/all?keyword=ASOUL%E7%9A%84%E5%A5%87%E5%A6%99%E5%AE%87%E5%AE%99",
+ "orig_text": "#ASOUL的奇妙宇宙#",
+ "text": "#ASOUL的奇妙宇宙#",
+ "type": "RICH_TEXT_NODE_TYPE_TOPIC"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_GOODS
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| goods | object | 商品信息 | |
+| icon_name | string | 图标名称 | `shop` `taobao` |
+| jump_url | string | 跳转 URL | |
+| orig_text | string | 原始文本 | |
+| rid | string | | |
+| text | string | 显示文本 | 一般与 `orig_text` 一致 |
+| type | string | `RICH_TEXT_NODE_TYPE_GOODS` | |
+
+`goods` 对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | 跳转 URL | 一般与根对象下的 `jump_url` 相同 |
+| type | number | `1` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "goods": {
+ "jump_url": "https://s.click.taobao.com/t?e=m%3D2%26s%3DhRVW5Ol4GrZw4vFB6t2Z2ueEDrYVVa64XoO8tOebS%2BdRAdhuF14FMcvdLjw%2BYA8F1aH1Hk3GeOgLhuv3v%2BUO0FVeaszYyErWfp5XqHpg%2Bfwn9kK7XrZu6WxZ8BPtnRZfqGXK58Jc1%2BhtJfOipEYQaSY0lFm97JITUXK%2FCnFktAT05J9EjZ4Cg6Q6sZp7gNLmb4%2BNtrBbTSxr7mxbAs%2BuXGY7X5f4YTwUTi8eJkfcZdQxNgzykgJnxNGRxz%2FytfH1UnsQ1Sg4FG%2Fgk553RHFro7zDM6tzzB%2FwUFU78FEla0%2F6liDBUuxx%2BfRWY0eqeyPKGJZJ34Yh7cK34L0nA6HzjPrdYgTMW7Qubh8ReVU%2F9k2Huec2Q%2B1T%2BJwkZZwMWMdb2FGsw09L73Dq%2F8VFknkEdmd1Il7G%2BufOO%2FbGmELtDp4hhQs2DjqgEA%3D%3D&union_lens=lensId:TAPI@1674460806@212ccf35_0bed_185dda43d7a_a840@01",
+ "type": 1
+ },
+ "icon_name": "taobao",
+ "jump_url": "https://s.click.taobao.com/t?e=m%3D2%26s%3DhRVW5Ol4GrZw4vFB6t2Z2ueEDrYVVa64XoO8tOebS%2BdRAdhuF14FMcvdLjw%2BYA8F1aH1Hk3GeOgLhuv3v%2BUO0FVeaszYyErWfp5XqHpg%2Bfwn9kK7XrZu6WxZ8BPtnRZfqGXK58Jc1%2BhtJfOipEYQaSY0lFm97JITUXK%2FCnFktAT05J9EjZ4Cg6Q6sZp7gNLmb4%2BNtrBbTSxr7mxbAs%2BuXGY7X5f4YTwUTi8eJkfcZdQxNgzykgJnxNGRxz%2FytfH1UnsQ1Sg4FG%2Fgk553RHFro7zDM6tzzB%2FwUFU78FEla0%2F6liDBUuxx%2BfRWY0eqeyPKGJZJ34Yh7cK34L0nA6HzjPrdYgTMW7Qubh8ReVU%2F9k2Huec2Q%2B1T%2BJwkZZwMWMdb2FGsw09L73Dq%2F8VFknkEdmd1Il7G%2BufOO%2FbGmELtDp4hhQs2DjqgEA%3D%3D&union_lens=lensId:TAPI@1674460806@212ccf35_0bed_185dda43d7a_a840@01",
+ "orig_text": "啊脑袋周边抱枕",
+ "rid": "688066082845462528",
+ "text": "啊脑袋周边抱枕",
+ "type": "RICH_TEXT_NODE_TYPE_GOODS"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_BV
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | 跳转 URL | |
+| orig_text | string | 原始文本 | |
+| rid | string | 视频 bvid | |
+| text | string | 显示文本 | 视频标题 |
+| type | string | `RICH_TEXT_NODE_TYPE_BV` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "jump_url": "https://www.bilibili.com/video/BV1xx411c7mD/",
+ "orig_text": "https://www.bilibili.com/video/BV1xx411c7mD/",
+ "rid": "BV1xx411c7mD",
+ "text": "字幕君交流场所",
+ "type": "RICH_TEXT_NODE_TYPE_BV"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_EMOJI
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| emoji | object | 表情信息 | |
+| orig_text | string | 原始文本 | |
+| text | string | 显示文本 | 一般与 `orig_text` 一致 |
+| type | string | `RICH_TEXT_NODE_TYPE_EMOJI` | |
+
+`emoji` 对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| icon_url | string | 表情图片 URL | |
+| size | number | 表情尺寸 | 1: small
2: middle |
+| text | string | 表情的文字代码 | 一般与根对象的 `text` 一致 |
+| type | number | 表情类型 | `1` `2` `3` |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "emoji": {
+ "icon_url": "https://i0.hdslb.com/bfs/emote/5ce649d5f716566db41dbf68c2e319517516d321.png",
+ "size": 2,
+ "text": "[热词系列_干杯]",
+ "type": 1
+ },
+ "orig_text": "[热词系列_干杯]",
+ "text": "[热词系列_干杯]",
+ "type": "RICH_TEXT_NODE_TYPE_EMOJI"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_CV
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | 跳转 URL | 无协议名 |
+| orig_text | string | 原始文本 | |
+| rid | string | 专栏 CV 号 | |
+| text | string | 显示文本 | |
+| type | string | `RICH_TEXT_NODE_TYPE_CV` | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "jump_url": "//www.bilibili.com/read/cv1/",
+ "orig_text": "1",
+ "rid": "1",
+ "text": "未知的光",
+ "type": "RICH_TEXT_NODE_TYPE_CV"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_VIEW_PICTURE
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | | |
+| orig_text | string | 原始文本 | |
+| pics | object[] | 图片信息 | |
+| rid | string | 本条动态 id | |
+| text | string | 显示文本 | 一般与 `orig_text` 一致 |
+| type | string | `RICH_TEXT_NODE_TYPE_VIEW_PICTURE ` | |
+
+`pics[]` 对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| height | number | 高度 | |
+| size | number | 大小? | 单位为 K |
+| src | string | 图片 URL | |
+| width | number | 宽度 | |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "jump_url": "//www.bilibili.com/read/cv/",
+ "orig_text": "查看图片",
+ "pics": [
+ {
+ "height": 4000,
+ "size": 4218.501,
+ "src": "http://i0.hdslb.com/bfs/new_dyn/d13a5793f7101824e9c9181ebc4df1a936081646.png",
+ "width": 6411
+ }
+ ],
+ "rid": "1069394178937454662",
+ "text": "查看图片",
+ "type": "RICH_TEXT_NODE_TYPE_VIEW_PICTURE"
+}
+```
+
+
+
+
+## RICH_TEXT_NODE_TYPE_WEB
+
+根对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| jump_url | string | 跳转 URL | |
+| orig_text | string | 原始文本 | |
+| style | object \| null | 样式信息 | |
+| text | string | 显示文本 | |
+| type | string | `RICH_TEXT_NODE_TYPE_WEB` | |
+
+`style` 对象:
+
+| 字段 | 类型 | 内容 | 备注 |
+| ---- | ---- | ---- | ---- |
+| font_level | string | 字体等级 | `regular` |
+| font_size | number | 字体大小 | `17` |
+
+**示例:**
+
+
+查看示例:
+
+```json
+{
+ "jump_url": "https://api.bilibili.com/x/web-interface/nav",
+ "orig_text": "https://api.bilibili.com/x/web-interface/nav",
+ "style": {
+ "font_level": "regular",
+ "font_size": 17
+ },
+ "text": "网页链接",
+ "type": "RICH_TEXT_NODE_TYPE_WEB"
+}
+```
+
+```json
+{
+ "jump_url": "//www.bilibili.com/video/av1",
+ "orig_text": "//www.bilibili.com/video/av1",
+ "style": null,
+ "text": "av1",
+ "type": "RICH_TEXT_NODE_TYPE_WEB"
+}
+```
+
+
+
+
+
+## RICH_TEXT_NODE_TYPE_OGV_SEASON
+
+参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv)
+
+## RICH_TEXT_NODE_TYPE_OGV_EP
+
+参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv)
+
+## RICH_TEXT_NODE_TYPE_AV
+
+参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv)