如何获取Telegram频道内机器人发送的消息ID并自动删除消息
问题原因
你当前代码报错的核心原因有4个:
- 你获取的
msg_id是用户发送给机器人的原消息ID,不是机器人转发到目标频道后新生成的消息ID,两个ID属于不同聊天,自然找不到要删的消息 sleep(60)写在了转发消息的逻辑之前,实际执行顺序是先等60秒再发消息,发完立刻执行删除,完全不符合「发完消息留存1分钟再删除」的需求- 直接通过
update.message['photo'] == []判断是否有图的写法有问题,纯文本消息用字典方式访问photo字段很容易触发KeyError - 处理函数里直接用sleep会阻塞整个机器人的事件循环,导致这60秒内机器人无法响应其他用户的消息
修复后可直接运行的代码
from telegram import Update, ChatAction from telegram.ext import Updater, CallbackContext, MessageHandler, Filters import json api_key = "替换为你的机器人API Key" target_channel_id = "替换为你的目标频道ID" updater = Updater(api_key, use_context=True) job_queue = updater.job_queue def delete_channel_msg(context: CallbackContext): """定时执行的频道消息删除任务""" job_params = context.job.context context.bot.delete_message( chat_id=job_params['chat_id'], message_id=job_params['msg_id'] ) def echo(update: Update, context: CallbackContext): context.bot.send_chat_action(chat_id=update.effective_chat.id, action=ChatAction.TYPING) sent_message = None # 处理带图片的消息 if update.message.photo: file_id = update.message.photo[-1].file_id sent_message = context.bot.send_photo( chat_id=target_channel_id, caption=update.message.caption, photo=file_id ) # 处理带文档的消息 elif update.message.document: sent_message = context.bot.send_document( chat_id=target_channel_id, caption=update.message.caption, document=update.message.document.file_id ) # 处理纯文本消息 elif update.message.text: sent_message = context.bot.send_message( chat_id=target_channel_id, text=update.message.text ) if sent_message: # 拿到频道内新发送消息的真实ID,加入1分钟后执行的删除队列 job_params = { "chat_id": target_channel_id, "msg_id": sent_message.message_id } job_queue.run_once(delete_channel_msg, when=60, context=job_params) print(json.dumps(update.to_dict(), indent=2, ensure_ascii=False)) dispatcher = updater.dispatcher # 合并所有需要处理的消息类型,仅注册一个处理器 dispatcher.add_handler(MessageHandler(Filters.document | Filters.photo | Filters.text, echo)) updater.start_polling() updater.idle()
关键修改说明
- 所有发送类方法(
send_message/send_photo/send_document)调用后会返回对应已发送消息的Message对象,直接读取该对象的message_id属性,就是目标频道内对应消息的真实ID,这才是删除接口需要传入的正确ID - 移除了阻塞式的
sleep调用,改用框架自带的job_queue实现定时任务,1分钟等待期间机器人可以正常处理其他消息,不会卡住 - 修正了消息类型判断逻辑,优先判断消息是否存在对应类型属性,避免触发KeyError
- 调整了执行顺序:先转发消息到频道,再启动1分钟倒计时,倒计时结束自动删除对应消息
- 补充了文档类型消息的转发支持,和你原本注册的过滤器规则匹配
- 运行前请确认:机器人必须被设置为目标频道的管理员,且勾选「删除消息」权限,否则删除操作会被Telegram接口拒绝
内容的提问来源于stack exchange,提问作者Saeid Karimi
相关产品推荐
相关产品推荐

