使用Telethon Bot发送Telegram频道抓取消息时遇MediaEmptyError问题
问题分析与解决:Telethon Bot发送消息触发MediaEmptyError及代码优化
问题背景
使用USER客户端抓取Telegram频道消息,通过Bot客户端转发给用户时,抓取环节正常,但发送阶段触发telethon.errors.rpcerrorlist.MediaEmptyError错误。Bot运行流程:
- 用户向Bot发送频道链接
- Bot抓取该频道消息并发送给用户
相关代码片段:
async def scrape_channel(channel_name,chat_id): async for message in client2.iter_messages(entity=channel_name,limit=6, reverse=True,filter=types.InputMessagesFilterEmpty): if message.text or message.media and not message.sticker: await client.send_message(chat_id, messages=message)#chat_id here is the chat between the user and bot
代码低效问题
- 串行发送阻塞流程:循环内逐条调用
await client.send_message,会等待当前消息发送完成才处理下一条,6条消息需依次等待API响应,整体耗时随消息数量线性增加。 - 未利用批量发送能力:Telethon支持批量消息发送接口,当前逐条发送的方式增加了网络往返次数和API调用开销。
- 条件判断逻辑不清晰:
message.text or message.media and not message.sticker因运算符优先级问题,实际解析为message.text or (message.media and not message.sticker),写法易引发误解,可读性差。
MediaEmptyError错误解决方法
该错误源于尝试发送的媒体消息为空或Bot客户端无法正确获取媒体内容,可通过以下方式解决:
- 强化媒体有效性校验:发送前确保媒体对象存在且为有效类型,避免空媒体触发错误:
from telethon.tl.types import MessageMediaDocument, MessageMediaPhoto # 优化条件判断,明确优先级并校验媒体类型 if (message.text and message.text.strip()) or ( message.media and isinstance(message.media, (MessageMediaDocument, MessageMediaPhoto)) and not message.sticker ): # 执行发送逻辑 - 改用转发接口替代直接发送:直接传递
message对象时,Bot客户端可能无法复用USER客户端的媒体上下文,使用转发接口更可靠:# 替换原send_message为forward_messages await client.forward_messages(chat_id, message, from_peer=channel_name) - 确保媒体已下载:若必须重新发送媒体而非转发,需先完成媒体下载,避免空媒体对象:
if message.media and not message.sticker: # 强制下载媒体文件,确保内容可用 await message.download_media() await client.send_message(chat_id, message)
内容的提问来源于stack exchange,提问作者neelnix
相关产品推荐
相关产品推荐

