- 后端
- 即时通讯
- API设计
【免费下载链接】aiogram
aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio
导读
本文围绕 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 个字段:
| 字段名 | 类型 | 必填 | 说明 |
|---|---|---|---|
type | Literal[MessageOriginType.CHAT] | 是(有默认值) | 消息来源类型,恒为"chat" |
date | DateTime | 是 | 消息最初发送的时间(Unix 时间戳) |
sender_chat | Chat | 是 | 最初发送该消息的聊天 |
author_signature | str \| None | 否(默认None) | 当消息最初由匿名聊天管理员发送时,记录原作者签名 |
1.type:判别字段
type: Literal[MessageOriginType.CHAT] = MessageOriginType.CHAT """Type of the message origin, always 'chat'"""type是一个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_type=int, when_used="unless-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.py),MessageOriginChannel有chat与message_id(见 aiogram/types/message_origin_channel.py),而MessageOriginChat独有sender_chat。
类型区分的枚举定义在 aiogram/enums/message_origin_type.py:
class 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(discriminator="type"), ]Field(discriminator="type")意味着:当收到 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.0(2023 年 12 月 29 日更新)之前,转发消息的来源信息分散在多个顶层字段中。aiogram 在 aiogram/types/message.py 中将这些旧字段标记为deprecated:
forward_date:原消息发送时间;forward_from:原消息发送者;forward_from_chat:从频道或匿名管理员转发时的来源聊天;forward_from_message_id:频道原消息 ID;forward_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设计
【免费下载链接】aiogram
aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio
相关推荐
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设计
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考