
在 Telethon 的 NewMessage 事件监听中,from_users 用于按消息发送者(即发信人)过滤,而 chats 用于按消息接收位置(即对话/群组/频道)过滤,二者语义不同、适用场景明确,不可互换。
在 telethon 的 `newmessage` 事件监听中,`from_users` 用于按消息发送者(即发信人)过滤,而 `chats` 用于按消息接收位置(即对话/群组/频道)过滤,二者语义不同、适用场景明确,不可互换。
虽然在某些简单场景下(例如你仅监听单个私聊用户且该用户既是聊天对象又是唯一发信人),from_users=[user] 和 chats=[user] 表现相似,但这只是巧合,并非设计等价。其根本区别如下:
-
✅
chats=:指定消息发生的对话上下文。匹配的是event.chat_id或event.peer_id所属的会话实体(如私聊、群组、频道)。例如:@client.on(events.NewMessage(chats=[-1001234567890])) # 监听指定频道的所有消息(无论谁发) async def handler(event): print(f"频道消息来自 {event.sender_id}: {event.text}") -
✅
from_users=:指定消息的发送者身份。匹配的是event.sender_id(即发信人的用户 ID),不限制消息发生在哪个聊天中。例如:@client.on(events.NewMessage(from_users=[654321, 987654])) # 监听这两位用户在任意地方(私聊/群/频道)发出的消息 async def handler(event): print(f"{event.sender_id} 在 {event.chat_id} 发了: {event.text}")
⚠️ 注意事项:
- 若同时使用
chats=和from_users=,则为逻辑与关系(必须同时满足); -
from_users不支持频道或机器人作为“发送者”(因频道消息的sender_id通常为None,需用post_author或检查event.is_channel+event.post); - 私聊中
chats=[user]和from_users=[user]行为重叠,是因为私聊中聊天对象 = 发信人;但在群组中,chats=[group]会捕获所有人发言,而from_users=[admin]仅捕获管理员发言; - 实体传入支持用户名、ID、甚至
InputPeer对象,但推荐统一使用await client.get_entity()解析以避免类型错误。
总结:chats 定义“在哪里听”,from_users 定义“听谁说”。理解这一职责分离,是编写健壮、可维护的 Telethon 机器人的关键基础。

















