aiogram 中的 MessageOriginChat 类型详解:掌握“以聊天名义转发“的消息来源机制 后端即时通讯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点击查看免费下载导读本文围绕 aiogram 的 API 参考文档 message_origin_chat.rst 所对应的核心类型MessageOriginChat讲解其字段结构、判别机制与实战用法。Telegram 消息转发场景中当一条消息最初是以某个群组聊天的名义发出例如匿名管理员发言并被转发到其他群聊时aiogram 就会在消息的forward_origin字段中给出MessageOriginChat对象。读完本文你将掌握如何判断转发来源、读取发送方聊天与作者签名并理解它与MessageOriginUser、MessageOriginChannel等兄弟类型的差异。一、MessageOriginChat 是什么MessageOriginChat是 Telegram Bot API 中MessageOrigin对象的四种具体实现之一。它的语义在源码 docstring 中定义得非常明确The message was originally sent on behalf of a chat to a group chat.即一条消息最初以某个聊天chat的名义发送到一个群聊中随后这条消息被转发时它的来源会被描述为MessageOriginChat。典型场景包括群组中匿名管理员发送的消息转发后来源就是该群组本身以频道channel名义发送到关联讨论群的消息转发后来源也可能是该聊天。在 aiogram 的类型体系中它继承自 aiogram/types/message_origin.py 中的抽象基类MessageOrigin继承自TelegramObject是一个基于 pydantic 的数据模型可以直接用于类型校验、序列化和类型推断。二、字段结构与源码解读MessageOriginChat的完整字段定义位于 aiogram/types/message_origin_chat.py共包含 4 个字段字段名类型必填说明typeLiteral[MessageOriginType.CHAT]是有默认值消息来源类型恒为chatdateDateTime是消息最初发送的时间Unix 时间戳sender_chatChat是最初发送该消息的聊天author_signaturestr \| None否默认None当消息最初由匿名聊天管理员发送时记录原作者签名1.type判别字段type: Literal[MessageOriginType.CHAT] MessageOriginType.CHAT Type of the message origin, always chattype是一个Literal类型值恒为chat且带有默认值。它既是 Telegram 响应的固定标识也是 aiogram 用于区分四种来源类型的判别器discriminator具体机制见第三节。2.date原始发送时间date: DateTime Date the message was sent originally in Unix time表示消息最初被发送的 Unix 时间。值得注意这里的DateTime并非普通datetime而是 aiogram/types/custom.py 中定义的带自定义序列化器的类型DateTime Annotated[ datetime, PlainSerializer( func_datetime_serializer, return_typeint, when_usedunless-none, ), ]也就是说在 aiogram 内部它以 Pythondatetime对象形式存在方便开发者直接进行时间运算而当需要把对象序列化回 Telegram Bot API 的请求/响应结构时会通过_datetime_serializer在非 Windows 平台即round(value.timestamp())自动转换为 Unix 时间戳整数。3.sender_chat最初发送消息的聊天sender_chat: Chat Chat that sent the message originally保存最初发出这条消息的Chat对象aiogram/types/chat.py 中定义的完整聊天模型。由于是完整对象你可以直接访问其id、type、title、username等属性无需额外调用getChat。例如判断是否来自某个特定群组或提取群组标题作为展示文案。4.author_signature匿名管理员的签名author_signature: str | None None *Optional*. For messages originally sent by an anonymous chat administrator, original message author signature可选字段仅在消息最初由匿名聊天管理员发送时存在保存管理员设置的公开签名例如自定义署名。在渲染转发自 ……样式文案时如果存在author_signature优先展示它会更贴近 Telegram 客户端的行为。三、MessageOrigin 类型家族与判别机制MessageOriginChat并不是孤立存在的类型。它的基类 aiogram/types/message_origin.py 明确列出了四种可能的来源MessageOriginUser消息最初由已知用户发送MessageOriginHiddenUser消息最初由隐藏用户发送MessageOriginChat消息最初以聊天名义发送本文主题MessageOriginChannel消息最初发送到频道。四种类型共享两个字段type与date其余字段各不相同例如MessageOriginUser有sender_user见 aiogram/types/message_origin_user.pyMessageOriginChannel有chat与message_id见 aiogram/types/message_origin_channel.py而MessageOriginChat独有sender_chat。类型区分的枚举定义在 aiogram/enums/message_origin_type.pyclass MessageOriginType(str, Enum): USER user HIDDEN_USER hidden_user CHAT chat CHANNEL channel为了让 pydantic 能够根据响应的type字符串自动解析成正确的子类aiogram 在 aiogram/types/message_origin_union.py 中定义了带判别字段的联合类型MessageOriginUnion: TypeAlias Annotated[ MessageOriginUser | MessageOriginHiddenUser | MessageOriginChat | MessageOriginChannel, Field(discriminatortype), ]Field(discriminatortype)意味着当收到 Telegram 推送的forward_origin数据且type chat时pydantic 会自动将其反序列化为MessageOriginChat实例。你完全不需要手动判断构造哪种类型。四、实战通过 forward_origin 读取转发来源MessageOriginChat最常见的出现位置是消息对象的forward_origin字段。在 aiogram/types/message.py 中定义如下forward_origin: MessageOriginUnion | None None *Optional*. Information about the original message for forwarded messages一个典型的处理示例——在 aiogram 的处理器中判断转发来源并分别处理from aiogram import Router from aiogram.types import Message from aiogram.types.message_origin_chat import MessageOriginChat from aiogram.types.message_origin_channel import MessageOriginChannel from aiogram.types.message_origin_user import MessageOriginUser router Router() router.message() async def handle_forward(message: Message) - None: origin message.forward_origin if origin is None: return if isinstance(origin, MessageOriginChat): # 消息最初以某个聊天的名义发送例如匿名管理员发言被转发 chat origin.sender_chat await message.answer( f转发自聊天{chat.title or chat.id}{chat.type} f匿名签名{origin.author_signature or 无} ) elif isinstance(origin, MessageOriginChannel): await message.answer(f转发自频道原消息 ID{origin.message_id}) elif isinstance(origin, MessageOriginUser): await message.answer(f转发自用户{origin.sender_user.full_name}) else: await message.answer(转发自隐藏用户)由于forward_origin的运行时类型已经由判别器保证isinstance判断是稳妥且符合 aiogram 惯例的做法。同时origin.date是可直接参与时间运算的datetime对象例如计算消息被转发的年龄from datetime import datetime, timezone elapsed datetime.now(timezone.utc) - origin.date五、与旧字段的对比API 7.0 的演进在 Telegram Bot API 7.02023 年 12 月 29 日更新之前转发消息的来源信息分散在多个顶层字段中。aiogram 在 aiogram/types/message.py 中将这些旧字段标记为deprecatedforward_date原消息发送时间forward_from原消息发送者forward_from_chat从频道或匿名管理员转发时的来源聊天forward_from_message_id频道原消息 IDforward_sender_name原消息发送者名称。这些字段在 pydantic 定义上均标注了json_schema_extra{deprecated: True}提示开发者迁移到新的forward_origin字段。相比旧的分散式设计MessageOrigin家族通过统一的判别字段把来源类型 来源详情 原始时间封装为一个自包含对象类型安全性更高代码也更易读。MessageOriginChat正是这一演进中承接来自聊天/匿名管理员转发场景的载体。六、源码位置与进一步阅读类型定义aiogram/types/message_origin_chat.py基类与类型家族说明aiogram/types/message_origin.py判别联合类型aiogram/types/message_origin_union.py来源类型枚举aiogram/enums/message_origin_type.py使用场景字段转发消息来源aiogram/types/message.py时间戳序列化实现aiogram/types/custom.py类型导出入口aiogram/types/init.py此外官方 API 参考文档中与本文主题相关的页面还有 message_origin_chat.rst 的兄弟页面MessageOriginUser、MessageOriginHiddenUser、MessageOriginChannel以及MessageOriginType枚举页均位于 docs/api/types 与 docs/api/enums 目录下可作为完整理解消息来源机制的对照阅读材料。小结MessageOriginChat是 aiogram 中描述以聊天名义发送后转发场景的标准类型type恒为chat用于判别date保存原始时间sender_chat提供完整聊天对象author_signature补充匿名管理员的签名信息。配合MessageOriginUnion的判别器机制aiogram 会自动完成类型解析开发者只需在处理器中对message.forward_origin做isinstance分支即可优雅地处理四种来源。结合 API 7.0 后旧字段的废弃背景尽早切换到forward_origin方案会让代码更健壮、更面向未来。赞分享后端即时通讯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点击查看免费下载相关推荐Frosted Glass Lite 主题实测树莓派帧率提升 60% 的切换指南Frosted Glass Lite 主题实测树莓派帧率提升 60% 的切换指南 滑到第 5 张卡片仪表盘开始一顿一顿再往下滑就找不回刚才的位置。如果你的后端即时通讯API设计aiogram 中 ChatBoostAdded 类型详解捕获用户为聊天加 Boost 的服务消息aiogram 中 ChatBoostAdded 类型详解捕获用户为聊天加 Boost 的服务消息 导读 ChatBoostAdded 是 aiogram 中后端即时通讯API设计Zcash 2.0.6-rc1 版本技术解析Equihash 参数进共识层、CChainParams 去全局化与 getrawtransaction spentindex 增强Zcash 2.0.6 rc1 版本技术解析Equihash 参数进共识层、CChainParams 去全局化与 getrawtransaction spen后端即时通讯API设计上一篇全能音乐歌词解决方案163MusicLyrics提升音乐管理效率的终极工具下一篇TradingAgents-CN多智能体协作的智能交易决策系统技术详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考