You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telethon中from_users与chats参数的区别及工作机制疑问

Telethon中from_users与chats参数的区别及工作机制疑问

嘿,这个问题问得相当到位!我来给你捋清楚Telethon里from_users和chats这俩参数的区别,还有为啥你用频道测试时效果会看起来完全一样~

首先得明确这两个参数的设计初衷:

  • chats参数:它针对的是消息所在的「会话主体」,简单说就是这条消息是在哪个聊天窗口里发出来的——不管是私聊、群聊还是频道,只要消息属于这个会话,就会被过滤器匹配到。
  • from_users参数:它针对的是消息的「实际发送者」,也就是这条消息是谁发出来的——可以是普通用户、机器人,也包括频道本身(比如频道官方发布的公告、自动推送的消息)。

那为啥你用频道测试时,这俩写法效果一样呢?这是因为频道这个实体比较特殊:
它既是一个独立的会话(对应chats匹配的对象),同时当消息是以频道身份发出的时候(比如频道官方的公告),它又会成为消息的发送者(对应from_users匹配的对象)。Telethon的事件过滤器在处理频道对象时,内部做了兼容判断,所以当你把频道传给这两个参数时,刚好在你测试的场景下(比如只看频道官方发的消息),两者的匹配结果就重叠了。

但其实它们并非完全等价,换个场景就能看出区别:
比如在有管理员的频道里,如果某个管理员用自己的个人账号在频道发消息:

  • 用chats=channels的话,这条消息会被捕获,因为它确实是在这个频道会话里发的;
  • 但用from_users=channels的话,这条消息不会被捕获,因为它的发送者是管理员的个人账号,不是频道本身。

再举个更直观的对比例子:

  • 针对群聊:
    • @client.on(events.NewMessage(chats=my_group)):会捕获群里所有成员发的消息,不管是谁发的;
    • @client.on(events.NewMessage(from_users=my_friend)):只会捕获这个朋友发的消息——不管他是在这个群里发的,还是和你私聊时发的。

总结一下:

  • chats是按「消息所在的对话范围」来过滤,范围更广;
  • from_users是按「消息是谁发的」来过滤,针对性更强;
  • 频道的双重身份导致了部分场景下两者效果重叠,但本质逻辑完全不同哦~

备注:内容来源于stack exchange,提问作者user29715306

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:43:09