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

Discord.py突破批量删消息100条限制时遇HTTP 400错误求助

解决Discord.py自定义Purge命令触发400 Bad Request错误的问题

我帮你分析下问题出在哪,以及怎么解决这个报错:

错误根源

你的消息分组逻辑存在严重问题:在async for x in self.bot.logs_from(...)的每一次迭代中,你执行了多个while循环,这会导致同一条消息被反复添加到同一个列表,直到列表满100条才会转向下一个列表。比如第一条消息进入循环后,会被连续添加100次到mgs1,整个列表里全是重复的消息ID。而Discord的删除消息API不允许提交重复的消息ID,这直接触发了400 Bad Request错误。

修复方案

正确的做法是先收集所有需要删除的消息到一个大列表,再将其拆分为每100条一组的子列表,最后逐个调用删除接口。同时还要注意排除触发命令的那条消息,避免误删。

修改后的完整代码如下:

import asyncio
import discord
from discord.ext import commands

@commands.command(pass_context=True, no_pm=True)
async def purge(self, ctx, amount: int = None, channel: discord.Channel = None):
    # 处理默认频道
    if channel is None:
        channel = ctx.message.channel
    
    # 验证输入数量
    if amount is None or amount < 1:
        await ctx.send("请输入有效的删除数量(至少1条)", delete_after=3)
        return
    
    # 收集所有目标消息(包含触发命令的消息,后续会移除)
    all_messages = []
    async for msg in self.bot.logs_from(channel, limit=amount + 1):
        all_messages.append(msg)
    
    # 移除触发命令的消息(logs_from返回的消息是从新到旧排序,第一条就是命令消息)
    if all_messages and all_messages[0] == ctx.message:
        all_messages.pop(0)
    
    # 将消息列表拆分为每100条一组
    message_groups = [all_messages[i:i+100] for i in range(0, len(all_messages), 100)]
    
    # 逐个删除每组消息
    for group in message_groups:
        if group:  # 跳过空分组,避免API报错
            await self.bot.delete_messages(group)
            # 可选:添加小延迟,防止触发API限流
            await asyncio.sleep(1)
    
    # 反馈删除结果
    await ctx.send(f"已成功删除{len(all_messages)}条消息", delete_after=3)

关键修改点说明

  • 正确的分组逻辑:使用列表推导式拆分消息组,确保每条消息只被添加一次
  • 排除命令消息:移除触发purge命令的消息,避免误删或统计数量错误
  • 空组处理:跳过空分组,防止调用delete_messages时传入空列表触发额外错误
  • 限流保护:添加asyncio.sleep(1)的可选延迟,降低触发Discord API限流的风险

额外注意事项

  • Discord API限制:delete_messages只能删除14天以内的消息,超过14天的消息需要逐条调用await msg.delete()删除
  • 权限验证:确保机器人拥有「管理消息」的服务器权限,否则会触发权限不足的错误

内容的提问来源于stack exchange,提问作者Jacques Amsel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:28:53