Telethon中如何区分NewMessage与MessageEdited事件并解决重复触发?
解决Telethon区分新消息与编辑消息的问题
1. 修复编辑消息触发两次事件的问题
在注册NewMessage事件时添加exclude_edited=True参数,让编辑后的消息不再被识别为新消息触发该事件,从根源解决重复执行的问题:
client.add_event_handler( self.message_listener, events.NewMessage( chats=get_chat_ids("X", "Y", "Z"), exclude_edited=True # 排除编辑后的消息,避免重复触发 ), )
2. 正确区分事件类型
针对isinstance判断失效的情况,推荐两种可靠方法:
方法一:注册事件时绑定类型标识
使用functools.partial给监听函数绑定明确的类型标识,直接区分新消息和编辑消息:
from functools import partial class TelegramBot: def __init__(self): # 注册新消息事件,绑定"new"标识 client.add_event_handler( partial(self.message_listener, event_type="new"), events.NewMessage( chats=get_chat_ids("X", "Y", "Z"), exclude_edited=True ), ) # 注册编辑消息事件,绑定"edited"标识 client.add_event_handler( partial(self.message_listener, event_type="edited"), events.MessageEdited(chats=get_chat_ids("X", "Y")), ) async def message_listener(self, event, event_type): message = event.message.message message_id = event.message.id if event.chat_id in get_chat_ids("X", "Y"): if event_type == "new": # 新消息处理逻辑 print(f"新消息:{message}") elif event_type == "edited": # 编辑消息处理逻辑 print(f"编辑后的消息:{message}")
方法二:通过事件内部属性判断
Telethon的事件对象会保留原始更新类型,可通过内部属性判断:
async def message_listener(self, event): message = event.message.message message_id = event.message.id if event.chat_id in get_chat_ids("X", "Y"): # 判断是否为编辑消息 if hasattr(event, '_original_update') and isinstance(event._original_update, types.UpdateEditMessage): # 编辑消息处理逻辑 print(f"编辑后的消息:{message}") else: # 新消息处理逻辑 print(f"新消息:{message}")
补充说明
exclude_edited=True是核心配置,必须添加才能避免编辑消息同时触发两种事件。- 绑定类型标识的方法更直观易维护,推荐优先使用。
内容的提问来源于stack exchange,提问作者Qliver
相关产品推荐
相关产品推荐

