Telethon/Pyrogram转发专辑消息异常:仅转最后媒体且无Caption
解决Telethon转发媒体专辑不完整的问题
问题描述
使用Telethon的client.iter_messages(channel_id, limit=1)配合message.forward_to(group_id),或Pyrogram对应方法转发指定频道最新消息时,遇到以下问题:
- 若目标消息为媒体专辑,仅会转发专辑中的最后一个媒体文件
- 原消息的Caption(标题/说明文字)未被一同转发
已知Telethon有events.Album机制,也了解grouped_id可能是解决关键,但不清楚具体实现方式。
附原Telethon代码:
from telethon import TelegramClient client = TelegramClient('telethon-client', api_id, api_hash) async def main(): async for message in client.iter_messages(test_channel_id, limit=1): await message.forward_to(test_group_id) with client: client.loop.run_until_complete(main())
解决方案
媒体专辑内的所有消息共享同一个grouped_id标识,通过该ID可以筛选出完整的专辑内容,再按顺序转发即可保留原结构和Caption。
修正后的Telethon代码
from telethon import TelegramClient client = TelegramClient('telethon-client', api_id, api_hash) async def main(): # 获取频道最新的一条消息 async for latest_msg in client.iter_messages(test_channel_id, limit=1): # 判断是否属于媒体专辑 if latest_msg.grouped_id: # 筛选出同grouped_id的所有消息(完整专辑) album_messages = [] async for msg in client.iter_messages( test_channel_id, filter=None, # 不限制消息类型,确保获取全部专辑内容 search=f"grouped_id:{latest_msg.grouped_id}" ): album_messages.append(msg) # 按消息ID排序,保证转发顺序与原专辑一致 album_messages.sort(key=lambda x: x.id) # 批量转发整个专辑 await client.forward_messages(test_group_id, album_messages) else: # 非专辑消息直接转发 await latest_msg.forward_to(test_group_id) with client: client.loop.run_until_complete(main())
关键细节说明
grouped_id的作用:媒体专辑内的每条消息都会携带相同的grouped_id,这是识别完整专辑的核心标识- 筛选专辑内容:使用
search=f"grouped_id:{latest_msg.grouped_id}"精准定位同专辑的所有消息,必须设置filter=None避免过滤掉部分媒体类型 - 排序保证顺序:
iter_messages默认按消息ID倒序返回,通过sort(key=lambda x: x.id)将消息恢复为原发送顺序 - 批量转发优势:使用
client.forward_messages批量转发比逐个调用forward_to更高效,且能保留专辑的关联结构
内容的提问来源于stack exchange,提问作者user16082897
相关产品推荐
相关产品推荐

