Telethon如何接收群组视频消息转发至其他群组并合并多视频同发
解决方案
问题根因
Telegram 把包含多个视频的媒体组消息拆成了多个独立的更新事件推送,每个事件对应一个视频,所有同组的事件会携带相同的grouped_id标识。你之前的代码每次收到单个媒体事件就直接发送,自然会拆成多条消息。
实现思路
- 用全局字典缓存同一
grouped_id下的所有媒体文件和对应的文案 - 加超时判断,避免因为网络波动漏收部分媒体导致一直不发送
- 收齐所有同组媒体后,调用
send_message时传入媒体列表即可合并为单条媒体组消息发送
可用代码示例
import asyncio from telethon import events # 缓存结构:key为grouped_id,value为{"medias": 媒体列表, "caption": 文案, "timer": 超时任务} group_cache = {} async def send_grouped_message(client, target, grouped_id): """延迟发送媒体组消息,确保收齐所有媒体""" await asyncio.sleep(1) # 可根据实际网络情况调整等待时长 group_data = group_cache.pop(grouped_id, None) if not group_data: return await client.send_message( target, group_data["caption"], file=group_data["medias"] ) @bot.on(events.NewMessage(func=lambda e: e.media)) async def forward_media(event): target = "me" # 替换为你的目标群组ID/用户名 # 处理单个媒体的普通消息 if not event.grouped_id: await event.client.send_message( target, event.text or "", file=event.media ) return # 处理媒体组消息 grouped_id = event.grouped_id if grouped_id not in group_cache: # 新的媒体组,初始化缓存+超时发送任务 group_cache[grouped_id] = { "medias": [], "caption": event.text or "", "timer": asyncio.create_task(send_grouped_message(event.client, target, grouped_id)) } # 把当前媒体加入对应分组 group_cache[grouped_id]["medias"].append(event.media)
注意事项
- 等待时长可根据你的服务器网络情况调整,一般1-2秒足够收齐全组媒体
- 如果处理高流量群组,可给缓存加过期清理逻辑避免内存占用过高
- 媒体组的文案默认取第一条消息的文案,和Telegram原生逻辑一致
内容的提问来源于stack exchange,提问作者jianwei923
相关产品推荐
相关产品推荐

