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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:32:14