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
相关产品推荐
相关产品推荐

