如何用Python实现Telegram Bot自动删除群组旧消息?
解决Telegram机器人自动删除旧消息的问题
核心思路是在机器人发送消息时直接保存返回的消息ID,而不是依赖getUpdates接口获取——因为getUpdates默认只会保留未处理的更新,机器人自身发送的消息若未触发其他操作,通常不会被记录。
具体实现步骤:
- 发送新消息前,尝试读取本地保存的旧消息ID,执行删除操作(如果ID存在)
- 发送新消息,提取返回的
message_id并持久化保存 - 处理异常场景(如旧消息已被删除、保存文件不存在等)
修改后的代码示例:
import telegram import os # 配置参数 API_KEY = 'MyKey' CHAT_ID = 'USERID' # 统一变量命名,原代码的user_id实际为群组/聊天的chat_id LAST_MSG_ID_FILE = '/var/tmp/telegram_last_msg_id.txt' # 选择Ubuntu系统下可读写的路径 def main(): bot = telegram.Bot(token=API_KEY) # 第一步:删除旧消息 if os.path.exists(LAST_MSG_ID_FILE): with open(LAST_MSG_ID_FILE, 'r') as f: old_msg_id = f.read().strip() if old_msg_id: try: bot.delete_message(chat_id=CHAT_ID, message_id=int(old_msg_id)) print(f"已删除旧消息ID: {old_msg_id}") except telegram.error.BadRequest as e: print(f"删除旧消息失败: {e}") # 兼容消息已被删除、权限不足等情况 # 第二步:发送新消息 record = "Test" new_msg = bot.send_message(chat_id=CHAT_ID, text=record) # 第三步:保存新消息ID到本地 with open(LAST_MSG_ID_FILE, 'w') as f: f.write(str(new_msg.message_id)) print(f"已发送新消息,ID: {new_msg.message_id}") if __name__ == '__main__': main()
关键说明:
bot.send_message()会返回Message对象,其中message_id字段就是当前发送消息的ID,直接提取即可,无需额外调用接口。- 用本地文件持久化消息ID是最简单的方案,若有数据库资源,也可将ID存储到数据库中。
- 确保运行脚本的用户对保存文件的路径有读写权限(Ubuntu下
/var/tmp/路径默认具备该权限)。 - 给机器人配置群组权限:需在Telegram群组中给机器人授予「删除消息」的权限,否则删除操作会失败。
内容的提问来源于stack exchange,提问作者Hans Germardies
相关产品推荐
相关产品推荐

