详解与实战)
后端即时通讯API设计【免费下载链接】aiogramaiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio项目地址https://gitcode.com/gh_mirrors/ai/aiogram点击查看免费下载InputRichBlockBlockQuotation是 aiogram 中对应 Telegram Rich Message富消息体系里“块引用block quotation”这一块类型的输入侧模型语义上等价于 HTML 的blockquote标签。本文以该类型为核心讲解它的字段结构、嵌套用法、底层判别联合discriminated union机制并结合InputRichMessage与Bot.send_rich_message给出可直接运行的发送示例帮助你在构建 AI 对话式富消息、长文排版时正确使用块引用及其署名credit能力。一、定位富消息块体系中的 InputRichBlock 家族在 aiogram 中富消息Rich Message是 Telegram Bot API 提供的、以结构化“块block”为单位描述消息内容的方案对应sendRichMessage方法。aiogram 为这一体系提供了完整的类型实现InputRichMessage描述“要发送的富消息”其blocks字段接收一个InputRichBlockUnion列表SendRichMessage对应 Telegram 的sendRichMessage方法返回MessageInputRichBlock所有输入侧块的抽象基类目前共有24 种具体块类型包括段落Paragraph、标题SectionHeading、代码块Preformatted、列表List、图片/视频/音频等媒体块以及本文主角块引用BlockQuotation。InputRichBlockBlockQuotation正是InputRichBlock的其中一个具体子类源码位于 aiogram/types/input_rich_block_block_quotation.py。二、类速览三个字段构成一个块引用从源码看InputRichBlockBlockQuotation的完整定义如下省略了由butcher自动生成的、仅供 IDE 类型提示的__init__部分class InputRichBlockBlockQuotation(InputRichBlock): A block quotation, corresponding to the HTML tag blockquote. type: Literal[InputRichBlockType.BLOCKQUOTE] InputRichBlockType.BLOCKQUOTE Type of the block, always blockquote blocks: list[InputRichBlockUnion] Content of the block credit: RichTextUnion | None None *Optional*. Credit of the block各字段说明如下表字段类型必填含义typeLiteral[InputRichBlockType.BLOCKQUOTE]默认blockquote否有默认值块的判别标签恒为blockquote用于 Pydantic 判别联合路由到本类blockslist[InputRichBlockUnion]是块引用的正文内容由任意输入侧块递归组成支持块中嵌套块creditRichTextUnion \| None默认None否块引用的署名如引文出处可为普通字符串或格式化富文本2.1 判别标签type 字段type字段的类型是Literal[InputRichBlockType.BLOCKQUOTE]其取值来自枚举 aiogram/enums/input_rich_block_type.py 中的BLOCKQUOTE blockquote。该枚举还包含expandable_blockquote、pullquote等其它引用类变体以及paragraph、heading、pre、table等全部块类型标签。这个字段的关键作用不是业务数据而是联合类型的判别器aiogram 的输入侧块联合类型 InputRichBlockUnion 由 24 个块类组成并通过Field(discriminatortype)声明为 Pydantic 判别联合——反序列化时 Pydantic 直接根据type标签跳到对应成员类无需逐个尝试。2.2 正文内容blocks 字段blocks是块引用的核心它接收list[InputRichBlockUnion]意味着块引用内部可以放置段落、标题、列表、代码块甚至嵌套的块引用本身。这对应 Telegram 文档中块引用可递归包含其他块的语义是实现“引文中的引文”结构的基础。注意从源码结构看blocks是必填字段无默认值构造InputRichBlockBlockQuotation时必须提供即使只传一个空列表。2.3 可选署名credit 字段credit用于标注引文来源或作者类型为RichTextUnion其定义位于 aiogram/types/rich_text_union.py。RichTextUnion是一个更复杂的联合类型除普通str与list外还包含 28 种富文本样式加粗、斜体、下划线、删除线、spoiler、链接、代码、自定义表情等并且同样通过Discriminator(_rich_text_union_tag)实现判别式解析。因此署名既可以是一个简单的字符串也可以是一段带格式的富文本。credit字段默认为None表示不带署名。三、实战构造并发送带块引用的富消息3.1 构造一个基本块引用在 aiogram 中最直接的构造方式是实例化对象并传入blocksfrom aiogram.types import ( InputRichBlockBlockQuotation, InputRichBlockParagraph, InputRichMessage, ) quotation InputRichBlockBlockQuotation( blocks[ InputRichBlockParagraph(text行动胜于言语。), ], credit— 编程格言, ) rich_message InputRichMessage( blocks[ InputRichBlockParagraph(text下面是一段引用), quotation, ], )这里credit直接传了一个字符串由于RichTextUnion的第一个成员就是strPydantic 会自动按纯文本处理。3.2 嵌套块引用由于blocks的类型是list[InputRichBlockUnion]且InputRichBlockUnion中包含了InputRichBlockBlockQuotation自身所以块引用可以无限递归嵌套实现引文中的引文nested InputRichBlockBlockQuotation( blocks[ InputRichBlockBlockQuotation( blocks[InputRichBlockParagraph(text外层引文中的内层引文。)], ), ], credit嵌套示例, )这种递归结构在仓库的回归测试 tests/test_issues/test_1842_rich_block_union_discriminator.py 中被专门覆盖测试用{type: blockquote, blocks: [...]}构建了深度达 30 层的嵌套负载并断言每一层都被正确解析为InputRichBlockBlockQuotation、最内层解析为InputRichBlockParagraph。3.3 通过 sendRichMessage 发送构造好InputRichMessage后调用 Bot 实例的send_rich_message方法即可发送该方法定义于 aiogram/client/bot.py内部将参数封装为SendRichMessage调用from aiogram import Bot bot Bot(tokenYOUR_BOT_TOKEN) message await bot.send_rich_message( chat_idchat_id, rich_messagerich_message, )send_rich_message支持business_connection_id、message_thread_id、disable_notification、protect_content、reply_parameters、reply_markup等通用发送参数完整签名见 SendRichMessage。若消息中包含媒体类块则机器人必须具备向目标会话发送该类媒体的权限。四、底层机制判别联合如何保证嵌套验证的线性性能理解InputRichBlockBlockQuotation的嵌套能力绕不开InputRichBlockUnion的判别联合设计。在 input_rich_block_union.py 中24 个块类被合成为InputRichBlockUnion: TypeAlias Annotated[ InputRichBlockParagraph | InputRichBlockSectionHeading | ... | InputRichBlockBlockQuotation | ..., Field(discriminatortype), ]Pydantic 会依据每个块类固定的type字段值直接定位成员验证复杂度与深度成正比而不是对每个嵌套层做“智能联合”的指数级回溯。仓库测试 tests/test_issues/test_1842_rich_block_union_discriminator.py 对此提供了双重保障对{type: definitely_not_a_block}这类非法负载判别联合只会产生一条union_tag_invalid错误定位在blocks[0]而非智能联合逐成员报错通过 SIGALRM 定时器断言深度 30 的嵌套负载解析耗时低于 1 秒防止未来 Pydantic 升级导致退化为指数级验证。测试同时验证了输入侧InputRichBlockUnion与其镜像——输出侧 RichBlockBlockQuotationRichBlockUnion行为一致两类块使用相同的type标签与字段名同一份负载可以同时通过两侧验证。五、与输出侧类型的对应关系Telegram Bot API 中服务端返回的富消息块RichBlock与客户端发送的输入块InputRichBlock结构一一对应。InputRichBlockBlockQuotation的输出侧镜像为RichBlockBlockQuotation源码 aiogram/types/rich_block_block_quotation.py字段完全一致type恒为blockquote、blockslist[RichBlockUnion]、creditRichTextUnion | None。发送端通过sendRichMessage发出的块引用在接收端如 Webhook 收到的富消息更新或 RichMessage 模型会以RichBlockBlockQuotation的形式出现。六、相关资源导航若需进一步深入可参考仓库中的以下位置类型定义aiogram/types/input_rich_block_block_quotation.py、aiogram/types/input_rich_block.py基类与全部 24 种块、aiogram/types/input_rich_block_union.py判别联合发送方法aiogram/methods/send_rich_message.py、aiogram/client/bot.pysend_rich_message与流式草稿send_rich_message_draft后者适用于 AI 生成场景的 30 秒临时预览测试佐证tests/test_issues/test_1842_rich_block_union_discriminator.py嵌套块引用解析与判别联合性能API 文档索引docs/api/types/index.rstinput_rich_block_block_quotation条目位于其中。赞分享后端即时通讯API设计【免费下载链接】aiogramaiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio项目地址https://gitcode.com/gh_mirrors/ai/aiogram点击查看免费下载相关推荐ClawX 系统架构深度解析双进程 Host API、ACP 语义权威与 Gateway 存活恢复ClawX 系统架构深度解析双进程 Host API、ACP 语义权威与 Gateway 存活恢复 ClawX 是基于 Electron 的桌面应用为 Op后端即时通讯API设计aiogram 富消息块 RichBlockPullQuotationPull Quote 引用块深入解析与实战指南aiogram 富消息块 RichBlockPullQuotationPull Quote 引用块深入解析与实战指南 导读 本篇围绕 aiogram 中 T后端即时通讯API设计CTF-Wiki 深度解析Windows NT 内核基础知识全览对象管理、内存管理与系统调用CTF Wiki 深度解析Windows NT 内核基础知识全览对象管理、内存管理与系统调用 本文以 CTF Wiki 中文站的 Windows 内核态基后端即时通讯API设计上一篇MySQLTuner 2.8.30 版本深度解析容器化支持、InnoDB 事务隔离监控与 MariaDB 兼容性增强下一篇Dozzle Cloud 套餐与限额完全指南事件计量、超额采样与数据保留机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考