如何用Pyrogram删除Telegram会话中除置顶消息外的所有消息?
实现Telegram UserBot消息清理:保留置顶消息删除其余所有消息
我正在开发一款UserBot,需要实现消息清理功能:在群组中删除所有消息,但保留置顶消息。网上搜索后没找到解析消息并删除除置顶外所有消息的方法。
现有代码只能手动删除/clear命令消息及其前后50条消息:async def handleCommands(client: Client, message: Message): if message.chat.id == manage_channel_id and message.text == '/clear': for mesID in range(message.id - 50, message.id + 1): print(mesID) await client.delete_messages(manage_channel_id, mesID)请问如何修改以实现仅保留置顶消息、删除会话内其余所有消息?
要实现这个需求,核心是先获取置顶消息的ID,再批量筛选并删除所有非置顶消息。以下是修改后的代码:
基础版(处理100条以内消息)
async def handleCommands(client: Client, message: Message): if message.chat.id == manage_channel_id and message.text == '/clear': chat_id = message.chat.id # 获取当前群组的置顶消息ID chat_info = await client.get_chat(chat_id) pinned_msg_id = chat_info.pinned_message.id if chat_info.pinned_message else None # 批量获取群组内的消息(单次最多100条) messages = await client.get_messages(chat_id, limit=100) # 收集需要删除的消息ID:排除置顶消息和触发命令的消息 msg_ids_to_delete = [ msg.id for msg in messages if msg.id != pinned_msg_id and msg.id != message.id ] # 批量删除消息 if msg_ids_to_delete: await client.delete_messages(chat_id, msg_ids_to_delete) print(f"已删除 {len(msg_ids_to_delete)} 条非置顶消息")
进阶版(支持超过100条消息的分页处理)
如果群组消息数量超过100条,需要通过循环分页获取并删除:
async def handleCommands(client: Client, message: Message): if message.chat.id == manage_channel_id and message.text == '/clear': chat_id = message.chat.id # 获取置顶消息ID chat_info = await client.get_chat(chat_id) pinned_msg_id = chat_info.pinned_message.id if chat_info.pinned_message else None offset_id = 0 total_deleted = 0 while True: # 分页获取消息,每次取100条 messages = await client.get_messages(chat_id, limit=100, offset_id=offset_id) if not messages: break # 无更多消息时退出循环 # 筛选需要删除的消息ID msg_ids_to_delete = [ msg.id for msg in messages if msg.id != pinned_msg_id and msg.id != message.id ] if msg_ids_to_delete: await client.delete_messages(chat_id, msg_ids_to_delete) total_deleted += len(msg_ids_to_delete) print(f"本轮删除 {len(msg_ids_to_delete)} 条,累计删除 {total_deleted} 条") # 更新偏移量,下一轮获取更早的消息 offset_id = messages[-1].id print(f"清理完成,共删除 {total_deleted} 条非置顶消息")
关键逻辑说明
- 获取置顶消息:通过
get_chat()接口获取群组信息,从中提取置顶消息的ID;如果群组没有置顶消息,则删除所有非命令消息。 - 批量操作优化:Telegram API支持单次删除最多100条消息,批量删除比逐条删除效率更高,也能减少API调用次数。
- 跳过命令消息:默认保留触发清理的
/clear命令消息,若不需要保留,可去掉msg.id != message.id的判断条件。
内容的提问来源于stack exchange,提问作者Matvey Androsyuk
相关产品推荐
相关产品推荐

