
在 Telethon 的 NewMessage 事件监听中,from_users 过滤消息发送者(谁发的),而 chats 过滤消息接收位置(在哪发的);二者语义不同、作用域独立,常被误认为等效,实则不可互换。
在 telethon 的 `newmessage` 事件监听中,`from_users` 过滤消息发送者(谁发的),而 `chats` 过滤消息接收位置(在哪发的);二者语义不同、作用域独立,常被误认为等效,实则不可互换。
虽然在某些简单场景下(例如仅监听某位用户私聊你时的消息),from_users=[user_id] 和 chats=[user_id] 看似行为一致,但这只是巧合——其底层逻辑和适用场景有根本性差异:
? chats=:按「对话会话」过滤
指定一个或多个聊天实体(如用户 ID、群组 ID、频道 username),表示只监听发生在这些聊天上下文中的所有新消息,无论发送者是谁。
✅ 适用场景:监听某个群组内的全员发言、监控某频道的所有帖子、接收与某联系人的全部私聊(含你主动发送后的回复)。
? from_users=:按「发送者身份」过滤
指定一个或多个用户实体,表示只监听由这些用户发出的任意消息,无论消息发到了哪个聊天(私聊、群组、频道甚至你未加入的公开群)。
✅ 适用场景:全局追踪某位好友的所有动态(如他在多个群里的发言)、监控 Bot 的所有输出、聚合某作者在不同频道发布的消息。
⚠️ 关键注意事项:
-
from_users不隐含权限校验:若目标用户在你未加入的群中发言,且该群为私密群,Telethon 默认无法获取该消息(受限于 Telegram API 权限),因此实际生效范围仍受账号可见性约束; - 二者可组合使用,实现精准筛选:
@client.on(events.NewMessage(chats=[-1001234567890], from_users=[654321])) async def handler(event): # 仅响应「ID 为 -1001234567890 的群组中,由用户 654321 发出的消息」 print(f"Admin posted in group: {event.text}") - 实体传入支持多种形式:
int(ID)、str(username 或 phone)、User/Chat对象,Telethon 会自动解析。
? 总结:chats 定义「消息发生的地点」,from_users 定义「消息发出的主体」。理解这一分离设计,是编写健壮、可扩展 Telegram 自动化脚本的基础。切勿因局部等效而忽视语义差异,否则在复杂多聊场景中极易出现漏监听或误触发问题。

















