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

使用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客户端无法正确获取媒体内容,可通过以下方式解决:

  1. 强化媒体有效性校验:发送前确保媒体对象存在且为有效类型,避免空媒体触发错误:
    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
    ):
        # 执行发送逻辑
    
  2. 改用转发接口替代直接发送:直接传递message对象时,Bot客户端可能无法复用USER客户端的媒体上下文,使用转发接口更可靠:
    # 替换原send_message为forward_messages
    await client.forward_messages(chat_id, message, from_peer=channel_name)
    
  3. 确保媒体已下载:若必须重新发送媒体而非转发,需先完成媒体下载,避免空媒体对象:
    if message.media and not message.sticker:
        # 强制下载媒体文件,确保内容可用
        await message.download_media()
    await client.send_message(chat_id, message)
    

内容的提问来源于stack exchange,提问作者neelnix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:17:54