Pyrogram中media_group消息加载异常,用户Bot无法转发相册求助
解决Telegram Bot媒体组重复触发转发问题
问题核心:Telegram会将媒体组中的每张图片/文件作为独立消息推送,但同一组内所有消息共享同一个media_group.id,这导致你的处理逻辑会被触发N次(N为媒体组内文件数量),进而重复执行转发操作。
以下是直接可行的解决方案:
1. 通过媒体组ID去重
用一个缓存集合记录已处理过的media_group.id,确保同一媒体组只被处理一次:
# 全局集合存储已处理的媒体组ID,避免重复触发 processed_media_groups = set() @app.on_message(filters.media_group) async def handle_media_group(client, message): media_group_id = message.media_group.id # 跳过已处理的媒体组 if media_group_id in processed_media_groups: return # 标记该媒体组为已处理 processed_media_groups.add(media_group_id) # 获取整个媒体组的所有消息 media_group = await client.get_media_group(message.chat.id, message.id) # 构造转发所需的媒体对象列表(以图片为例) media_to_send = [] for msg in media_group: if msg.photo: # 取分辨率最高的图片 photo = msg.photo[-1] media_to_send.append({"type": "photo", "media": photo.file_id}) # 一次性转发整个媒体组到目标聊天 await client.send_media_group( chat_id="你的目标聊天ID", media=media_to_send )
2. 缓存清理优化(可选)
如果Bot长期运行,全局集合会不断占用内存,可以改用带超时的缓存(比如用字典存储media_group.id和处理时间,定期清理过期条目):
import time processed_media_groups = {} CACHE_EXPIRE_SECONDS = 3600 # 1小时过期 @app.on_message(filters.media_group) async def handle_media_group(client, message): media_group_id = message.media_group.id current_time = time.time() # 清理过期缓存 expired_ids = [mid for mid, timestamp in processed_media_groups.items() if current_time - timestamp > CACHE_EXPIRE_SECONDS] for mid in expired_ids: del processed_media_groups[mid] # 跳过已处理的媒体组 if media_group_id in processed_media_groups: return # 记录处理时间 processed_media_groups[media_group_id] = current_time # 后续获取媒体组、转发逻辑同上述代码 ...
关键说明:
- 同一媒体组的所有消息
media_group.id完全一致,通过这个标识去重是最可靠的方式 - 必须用
send_media_group一次性发送整个媒体组,而不是单条转发,这样才能在目标聊天中显示为相册
内容的提问来源于stack exchange,提问作者Proger
相关产品推荐
相关产品推荐

