Telethon中收到相册消息时如何取消触发NewMessage事件?
解决Telethon中Album与NewMessage事件重复触发的问题
当Telethon收到相册消息时,确实会同时触发Album和NewMessage事件——因为Album事件本质是对多条带grouped_id的NewMessage的封装。要实现相册消息只走Album事件、不触发NewMessage事件,有两种简洁的实现方式:
方法一:通过事件过滤直接排除相册消息
利用NewMessage事件的func参数,过滤掉带有grouped_id的消息(相册内的消息都会携带这个标识),这样非相册的消息才会进入NewMessage的处理逻辑:
@client.on(events.Album) async def my_event_handler(event): if event.messages[0].peer_id.channel_id == 1859055581: await event.forward_to(1859055581) print("Album function") @client.on(events.NewMessage(func=lambda e: e.message.grouped_id is None)) async def my_event_handler3(event): if event.message.peer_id.channel_id == 1859055581: if event.message.text: await event.message.forward_to(1859055581) print(event.message.photo) else: print(event.message)
方法二:标记已处理的相册消息(适合复杂场景)
如果需要更灵活的控制,可以维护一个集合记录已处理的相册消息ID,在NewMessage事件中跳过这些消息:
# 全局集合存储已处理的相册消息ID processed_album_msg_ids = set() @client.on(events.Album) async def my_event_handler(event): if event.messages[0].peer_id.channel_id == 1859055581: await event.forward_to(1859055581) print("Album function") # 将相册内所有消息ID加入已处理集合 for msg in event.messages: processed_album_msg_ids.add(msg.id) @client.on(events.NewMessage) async def my_event_handler3(event): # 检查当前消息是否属于已处理的相册,是则跳过 msg_id = event.message.id if msg_id in processed_album_msg_ids: processed_album_msg_ids.remove(msg_id) # 清理集合,避免内存占用 return if event.message.peer_id.channel_id == 1859055581: if event.message.text: await event.message.forward_to(1859055581) print(event.message.photo) else: print(event.message)
为什么你之前的方法无效?
你直接在NewMessage事件中调用Album事件的处理函数是行不通的——两个事件的event对象类型不同:AlbumEvent包含整个相册的messages列表,而NewMessageEvent只是单条消息,参数不匹配自然无法生效。
内容的提问来源于stack exchange,提问作者Deraxus
相关产品推荐
相关产品推荐

