Discord.js v13 Purge命令报错DiscordAPIError: Unknown Message [10008]求助
Discord.js v13 Purge命令报DiscordAPIError: Unknown Message [10008] 问题修复
我按照reconlx的教程制作Discord.js v13版本的Purge批量删除消息命令,但反复遇到DiscordAPIError: Unknown Message [10008]错误。该命令仅能运行一次,无法按预期返回成功Embed消息,随后会导致所有命令崩溃,一段时间后恢复正常,循环往复。已确认Intents设置正确,但问题仍未解决。
原代码
const { MessageEmbed } = require("discord.js"); const ms = require("ms"); module.exports = { name: "purge", description: "Purges messages", userPermissions: ["MANAGE_MESSAGES"], options: [ { name: "amount", description: "Amount of messages to purge", type: "INTEGER", required: true, }, ], run: async (client, interaction) => { const amount = interaction.options.getInteger("amount"); const limitEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle("You may only purge 100 messages at a time!") .setFooter({ text: "Error: Limit Reached" }) if (amount > 100) return interaction.followUp({ embeds: [limitEmbed], }); const messages = await interaction.channel.messages.fetch({ limit: amount + 1, }); const filtered = messages.filter( (msg) => Date.now() - msg.createdTimestamp < ms("14 days") ); await interaction.channel.bulkDelete(filtered) const successEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle(`Successfully purged ${filtered.size - 1} messages!`) .setFooter({ text: "Action Successfully Performed" }) interaction.followUp({ embeds: [successEmbed], }); }, };
错误信息
DiscordAPIError: Unknown Message at RequestHandler.execute (C:\Users\admin\Desktop\Tonkotsu\node_modules\discord.js\src\rest\RequestHandler.js:350:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async RequestHandler.push (C:\Users\admin\Desktop\Tonkotsu\node_modules\discord.js\src\rest\RequestHandler.js:51:14) at async InteractionWebhook.send (C:\Users\admin\Desktop\Tonkotsu\node_modules\discord.js\src\structures\Webhook.js:196:15) { method: 'post', path: '/webhooks/950050048618688572/aW50ZXJhY3Rpb246OTk5MjYyNTIyMTc3NzQ5MDAzOmhGaUJVQkF6YjduVUlZNTJsT1MwV254T2FYdEJiaUNMWDdwUWloYzhyNnJudERLMHhxak96RTlkTmpDQW5sdEhONnhKSGkyZkdlQndmWGJQSFM0dk52bGduZ3hBTlE3S3g4R2JBRWFRdDNEbmtrb3Z6a0hpVk8yU2hIYllyemhm?wait=true', code: 10008, httpStatus: 404, requestData: { json: { content: undefined, tts: false, nonce: undefined, embeds: [ { title: 'Successfully purged 3 messages!', type: 'rich', description: null, url: null, timestamp: 0, color: 3092790, fields: [], thumbnail: null, image: null, author: null, footer: { text: 'Action Successfully Performed', icon_url: undefined } } ], components: undefined, username: undefined, avatar_url: undefined, allowed_mentions: undefined, flags: undefined, message_reference: undefined, attachments: undefined, sticker_ids: undefined }, files: [] } }
问题原因
错误核心是:执行bulkDelete(filtered)时,用户触发命令的那条交互消息被一并删除(因为代码中fetch了amount+1条消息,包含这条交互消息)。而interaction.followUp()必须依赖初始交互消息存在才能发送,消息被删除后就会触发Unknown Message错误。
修复方案
两种可行方案,任选其一即可:
方案一:先延迟响应,脱离对初始消息的依赖
在代码最开始添加延迟响应,后续通过延迟的响应发送结果,不受初始消息被删除的影响:
const { MessageEmbed } = require("discord.js"); const ms = require("ms"); module.exports = { name: "purge", description: "Purges messages", userPermissions: ["MANAGE_MESSAGES"], options: [ { name: "amount", description: "Amount of messages to purge", type: "INTEGER", required: true, }, ], run: async (client, interaction) => { // 延迟响应,后续操作基于此响应,不受初始消息影响 await interaction.deferReply({ ephemeral: true }); const amount = interaction.options.getInteger("amount"); const limitEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle("You may only purge 100 messages at a time!") .setFooter({ text: "Error: Limit Reached" }) if (amount > 100) return interaction.editReply({ embeds: [limitEmbed] }); const messages = await interaction.channel.messages.fetch({ limit: amount + 1, }); const filtered = messages.filter( (msg) => Date.now() - msg.createdTimestamp < ms("14 days") ); // 自动跳过无法删除的消息(超过14天的) await interaction.channel.bulkDelete(filtered, true); const successEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle(`Successfully purged ${filtered.size - 1} messages!`) .setFooter({ text: "Action Successfully Performed" }) // 编辑延迟响应发送结果 interaction.editReply({ embeds: [successEmbed] }); }, };
方案二:过滤掉交互消息本身,保留初始消息
在消息过滤逻辑中排除当前交互消息,确保初始消息不被删除,followUp即可正常运行:
const { MessageEmbed } = require("discord.js"); const ms = require("ms"); module.exports = { name: "purge", description: "Purges messages", userPermissions: ["MANAGE_MESSAGES"], options: [ { name: "amount", description: "Amount of messages to purge", type: "INTEGER", required: true, }, ], run: async (client, interaction) => { const amount = interaction.options.getInteger("amount"); const limitEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle("You may only purge 100 messages at a time!") .setFooter({ text: "Error: Limit Reached" }) if (amount > 100) return interaction.followUp({ embeds: [limitEmbed] }); const messages = await interaction.channel.messages.fetch({ limit: amount + 1, }); const filtered = messages.filter( (msg) => Date.now() - msg.createdTimestamp < ms("14 days") && msg.id !== interaction.id // 排除当前交互消息 ); await interaction.channel.bulkDelete(filtered, true); const successEmbed = new MessageEmbed() .setColor("#2F3136") .setTitle(`Successfully purged ${filtered.size} messages!`) .setFooter({ text: "Action Successfully Performed" }) interaction.followUp({ embeds: [successEmbed] }); }, };
额外提示
bulkDelete的第二个参数设为true,会自动跳过超过14天无法批量删除的消息,避免触发额外错误。- 方案一中的
ephemeral: true设置,可让机器人响应仅对命令执行者可见,避免清理频道后残留多余消息。
内容的提问来源于stack exchange,提问作者user18575297
相关产品推荐
相关产品推荐

