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

Discord.js实现幽灵账号效果:Webhook发消息后删除的代码故障排查

解决Discord.js中创建临时Webhook发送消息后自动删除的问题

我看到你这段实现“幽灵账号”功能的代码有几个关键问题,导致它无法正常运行,下面我帮你逐一修正并解释清楚核心逻辑:

原代码的问题点

  1. 语法错误:webhook.send ${msg}`` 是无效的JS语法,调用方法必须使用括号包裹参数,正确写法是 webhook.send(msg)。
  2. 异步时序错误:webhook.delete() 没有放在异步回调里——createWebhook 是异步Promise操作,直接在后面调用删除的话,webhook 变量还未被赋值,Webhook甚至还没创建完成就会执行删除操作,完全起不到作用。
  3. 用户名获取不准确:message.member.username 应该换成 message.author.username,member 是用户在服务器的成员对象,而用户名属于用户本身(author),虽然多数时候两者一致,但用author更准确。
  4. 缺少错误处理:没有捕获创建Webhook或发送消息时的异常(比如机器人权限不足),会导致代码崩溃且无提示。
  5. 变量未声明:msg 没有用const/let声明,会造成全局变量污染。

修正后的代码(两种写法)

写法1:Promise链式调用

const Discord = require('discord.js');
module.exports = {
  name: 'say',
  cooldown: 5,
  description: 'says anything including nitro emotes',
  execute(message, args) {
    const msg = args.join(" ");
    // 检查用户是否输入了内容
    if (!msg) return message.reply('你需要输入要发送的内容哦!');

    // 创建Webhook -> 发送消息 -> 删除Webhook 链式执行
    message.channel.createWebhook(message.author.username, {
      avatar: message.author.avatarURL({ format: 'png', size: 1024 })
    })
    .then(webhook => {
      // 发送消息后返回Promise,继续链式操作
      return webhook.send(msg);
    })
    .then(sentMessage => {
      // 消息发送完成后删除Webhook
      sentMessage.webhook.delete();
    })
    .catch(error => {
      // 捕获权限不足等异常
      console.error('Webhook操作出错:', error);
      message.reply('无法创建Webhook,请检查我是否有「管理Webhook」的权限!');
    });
  },
};

写法2:Async/Await(更易读)

const Discord = require('discord.js');
module.exports = {
  name: 'say',
  cooldown: 5,
  description: 'says anything including nitro emotes',
  async execute(message, args) {
    const msg = args.join(" ");
    if (!msg) return message.reply('你需要输入要发送的内容哦!');

    try {
      // 等待Webhook创建完成
      const webhook = await message.channel.createWebhook(message.author.username, {
        avatar: message.author.avatarURL({ format: 'png', size: 1024 })
      });
      // 等待消息发送完成
      await webhook.send(msg);
      // 最后删除Webhook
      await webhook.delete();
    } catch (error) {
      console.error('Webhook操作出错:', error);
      message.reply('无法创建Webhook,请检查我是否有「管理Webhook」的权限!');
    }
  },
};

核心逻辑说明

要实现“创建Webhook发送消息后自行删除”,关键是保证异步操作的顺序:

  1. 必须等待createWebhook完成,拿到有效的Webhook对象;
  2. 等待消息发送成功后,再执行webhook.delete();
  3. 用Promise链式调用或Async/Await都能严格保证这个执行顺序,避免异步操作“插队”导致的错误。

另外,创建Webhook时建议指定头像的格式和尺寸,避免某些情况下头像URL为空的问题;同时添加错误处理,让代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:37:43