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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:57:02