Python调用Telegram API自动转发含格式消息时无法转发图片问题
问题根因
你写的代码转不了图片消息,核心问题出在消息监听的过滤规则上:@bot.message_handler装饰器默认只接收纯文本(text)类型的消息,图片、视频、文件、多图相册这类非文本消息根本不会进入你写的handle_posts函数,自然触发不了转发。bot.forward_message本身是Telegram原生的转发接口,支持转发全类型消息,会完整保留原格式、附件、配文,不需要你单独写适配图片的转发逻辑,只要让处理函数能接收到非文本类消息就行。
修复步骤
- 修改
message_handler的参数,显式声明要监听所有媒体类型+文本类型的消息,覆盖单张图片、单条视频、文档、语音、贴纸等单条发送的内容 - 新增媒体组处理逻辑,适配用户一次发多张图/多个视频组成的相册场景——这类消息不会触发普通的
message_handler,需要单独的装饰器监听
修正后的可运行完整代码如下:
import telebot api_key = "你的机器人API密钥" bot = telebot.TeleBot(api_key) target_channel_id = "1234" # 目标频道ID authorized_user_ids = [123456, 654321] # 授权用户ID列表 # 处理所有单条类型消息:文本、单张图片、单视频、文件、语音、贴纸等 @bot.message_handler(func=lambda m: True, content_types=telebot.util.content_type_media + ['text']) def handle_posts(m: telebot.types.Message): if m.from_user.id in authorized_user_ids: print("已识别授权用户,开始转发消息") # forward_message原生支持所有单条消息类型转发,会保留原格式、原附件 bot.forward_message( chat_id=target_channel_id, from_chat_id=m.chat.id, message_id=m.message_id ) else: print("非授权用户,跳过转发") # 额外处理媒体组(一次发送多张图/多个视频的相册消息) @bot.media_group_handler(func=lambda m: True) def handle_media_group(m_list): # 媒体组返回同组内的所有消息对象,取第一条判断发送者权限即可 if m_list[0].from_user.id in authorized_user_ids: print("已识别授权用户,开始转发媒体组") # 逐个转发媒体组内的消息,频道端会自动还原成相册样式 for msg in m_list: bot.forward_message( chat_id=target_channel_id, from_chat_id=msg.chat.id, message_id=msg.message_id ) else: print("非授权用户,跳过媒体组转发") if __name__ == "__main__": # 开启长轮询,跳过启动前积压的过期消息 bot.infinity_polling(skip_pending=True)
补充说明
- 提前确认机器人已经被加入目标频道,且拥有频道的发信权限,否则转发会报403权限错误
- 公开频道的
chat_id可以直接填频道用户名(格式如@your_channel),私有频道必须填数字格式的ID - 用原生
forward_message转发比自己下载图片再调用send_photo重发更稳定,不会丢失图片配文的格式(粗体、斜体、超链接这些),也不会压缩画质 - 如果需要过滤特定类型的消息,只要调整
content_types的传参即可,比如只收文本和图片就传['text', 'photo']
内容的提问来源于stack exchange,提问作者user60707
相关产品推荐
相关产品推荐

