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

如何获取Telegram频道内机器人发送的消息ID并自动删除消息

问题原因

你当前代码报错的核心原因有4个:

  1. 你获取的msg_id是用户发送给机器人的原消息ID,不是机器人转发到目标频道后新生成的消息ID,两个ID属于不同聊天,自然找不到要删的消息
  2. sleep(60)写在了转发消息的逻辑之前,实际执行顺序是先等60秒再发消息,发完立刻执行删除,完全不符合「发完消息留存1分钟再删除」的需求
  3. 直接通过update.message['photo'] == []判断是否有图的写法有问题,纯文本消息用字典方式访问photo字段很容易触发KeyError
  4. 处理函数里直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:27:18