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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:09:22