在管理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频率限制,避免触发封禁。