Telegram机器人如何删除用户在群内发送的消息?从API到Python完整实战

本文详细介绍Telegram Bot删除群组消息的完整方法,包括API调用、权限要求、Python实现示例及常见问题,帮助开发者快速掌握消息管理技巧。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在管理Telegram群组时,机器人经常需要删除用户发送的垃圾、违规或无关消息。Telegram Bot API提供了deleteMessage方法,但实际使用中有诸多权限限制和细节。本文将从API原理出发,结合Python代码实战,带你彻底掌握机器人删除群消息的正确姿势。

一、删除消息的前提条件

并非任何机器人都能随意删除群内消息。Telegram的安全模型规定:

  • 机器人自己的消息:任何时候都可以删除,无需管理员权限。
  • 其他用户的消息:机器人必须是群组管理员,且拥有can_delete_messages权限。

如果机器人不是管理员,调用deleteMessage会返回403错误。因此,第一步是确保机器人以管理员身份加入群组,并手动或通过代码赋予删除消息权限。

二、核心API:deleteMessage方法

Telegram Bot API的删除消息接口非常简单:

POST https://api.telegram.org/bot<token>/deleteMessage
Content-Type: application/json

{
  "chat_id": @群组ID或用户名,
  "message_id": 要删除的消息ID
}

参数说明:

  • chat_id:群组的唯一标识(整数ID或@用户名)。
  • message_id:目标消息在群内的唯一ID。

若删除成功,返回true;失败则抛出异常或返回错误描述。

三、Python实战:使用requests库直接调用

不依赖第三方Bot框架,用最简洁的requests实现删除功能是最直接的方式。下面是一个完整示例:

import requests

BOT_TOKEN = "YOUR_BOT_TOKEN"
CHAT_ID = "@your_group"

def delete_message(message_id):
    url = f"https://api.telegram.org/bot/deleteMessage"
    payload = {"chat_id": CHAT_ID, "message_id": message_id}
    resp = requests.post(url, json=payload)
    return resp.json()

# 调用示例:删除ID为12345的消息
result = delete_message(12345)
print(result)

这段代码可以直接运行,但实际开发中需要获取待删除的消息ID,通常通过监听消息获得。

四、进阶实战:基于python-telegram-bot库

当你构建复杂服务时,推荐使用官方维护的python-telegram-bot库。下面是v20+异步版本的典型写法:

from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes

BOT_TOKEN = "YOUR_BOT_TOKEN"

async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # 设定删除规则:消息包含“垃圾”两字则删除
    if "垃圾" in update.message.text:
        try:
            await update.message.delete()  # 删除普通消息
        except Exception as e:
            print(f"删除失败: ")

async def delete_any(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # 作为管理员,删除任意用户的消息
    message_id = update.message.message_id
    await context.bot.delete_message(chat_id=update.effective_chat.id, message_id=message_id)

def main():
    app = Application.builder().token(BOT_TOKEN).build()
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
    app.run_polling()

if __name__ == "__main__":
    main()

handle_message中,我们调用了update.message.delete()——这是库提供的便捷方法,等价于deleteMessage。若需要删除其他用户的消息,只需调用context.bot.delete_message,并确保机器人有管理员权限。

五、实战案例:自动删除群内链接

假设你希望机器人自动删除群内所有广告链接,可以这样扩展:

import re
from telegram import Update
from telegram.ext import Application, MessageHandler, filters, ContextTypes

url_pattern = r'(https?://|www\.)'

async def delete_urls(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.text and re.search(url_pattern, update.message.text):
        await update.message.delete()
        # 可选:发送警告
        await context.bot.send_message(
            chat_id=update.effective_chat.id,
            text="⚠️ 请勿发送链接!",
            reply_to_message_id=update.message.message_id
        )

def main():
    app = Application.builder().token(BOT_TOKEN).build()
    app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, delete_urls))
    app.run_polling()

这个案例展示了如何结合正则表达式和删除API,实现自动化群组管理。

六、常见问题与注意事项

  • 删除消息有延迟吗? 无延迟,但Telegram API有频率限制,每秒钟最多删除约1条消息,批量操作需合理限速。
  • 能否删除很久以前的消息? 可以,但仅限机器人有权限且消息仍存在。
  • 删除失败可能原因:权限不足、消息ID错误、机器人被移除或群组停用。
  • 如何批量删除? 可以循环调用deleteMessage,但注意速率限制,建议每次间隔50ms以上。
  • 机器人删除消息后,用户会被通知吗? 不会,删除是静默操作,无通知。

总结

掌握deleteMessage是开发群管理机器人的基础。关键在于理解权限模型:机器人必须为管理员且拥有can_delete_messages才能删除他人消息。本文提供了两种Python实现方案,你可以根据项目需求选择。我们建议在生产环境中使用python-telegram-bot库,因为它处理了线程、异常和更新队列,让代码更健壮。最后,务必注意API频率限制,避免触发封禁。

FAQ

下载与安装

常见问题

机器人不是管理员可以删除群内消息吗?

不可以。机器人只能删除自己发送的消息,若要删除其他用户的消息,必须将机器人设为群组管理员,并授予“删除消息”权限。

如何批量删除群内所有成员的消息?

需要通过遍历消息记录(需开启群组消息记录权限)或监听新消息,然后调用deleteMessage逐个删除。注意Telegram API有速率限制,建议每秒不超过1次,否则可能被限制。

删除消息API的返回结果是什么?

成功时返回JSON中的ok字段为true,result为true;失败时返回ok为false,并包含错误描述(如403权限不足)。

机器人删除消息后,用户会看到哪些变化?

对于所有成员,消息会消失并显示“消息已删除”占位符(在部分客户端中)。用户不会收到通知,但消息记录中的位置会被保留。