求助:Discord.js机器人重启后筛选自身Webhook并发送消息失败
解决Discord.js机器人重启时仅向自身创建的Webhook发送消息的问题
看起来你已经找对了方向,但在Webhook归属判断和异步处理上有点小问题,我来帮你修正并给出完整的实现方案:
核心问题分析
你之前的代码有两个关键问题:
- 用
webhook.owner ==${bot.user.username}``来判断归属:用户名不是唯一标识,而且webhook.owner是一个User对象,直接和字符串比较肯定不匹配。正确的做法是比较用户ID,这是Discord中唯一且可靠的标识。 - 没有处理异步操作:
guild.fetchWebhooks()是异步方法,必须等待它返回结果后再进行筛选和发送操作,否则会拿不到有效的Webhook列表。
完整实现代码
在你的ready.js(或者监听ready事件的代码块)中,使用以下代码:
bot.on('ready', async () => { console.log(`✅ 已登录为 ${bot.user.tag}`); // 遍历机器人加入的所有服务器 for (const guild of bot.guilds.cache.values()) { try { // 获取当前服务器的所有Webhook(异步操作,必须用await) const webhooks = await guild.fetchWebhooks(); // 筛选出机器人自身拥有的Webhook const myWebhooks = webhooks.filter(webhook => { // 先判断owner是否存在,避免报错 return webhook.owner && webhook.owner.id === bot.user.id; }); // 给每个符合条件的Webhook发送重启通知 for (const webhook of myWebhooks.values()) { try { await webhook.send({ content: '我刚刚重启完成啦!😎', // 如果你不需要提及自己,可以加上下面这行禁止自动提及 // allowedMentions: { parse: [] } }); console.log(`📤 已向服务器「${guild.name}」的Webhook发送通知`); } catch (err) { console.error(`❌ 发送消息到Webhook失败(服务器:${guild.name}):`, err); } } } catch (err) { console.error(`❌ 获取服务器「${guild.name}」的Webhook失败:`, err); } } });
关键细节解释
Webhook归属判断:
webhook.owner返回的是创建该Webhook的User对象(机器人创建的话就是机器人自己的User实例),我们通过对比webhook.owner.id和bot.user.id来确保只处理机器人自己创建的Webhook,这是最准确的方式。异步操作处理:
所有涉及Discord API的操作(比如fetchWebhooks()、webhook.send())都是异步的,必须用await等待操作完成,否则代码会在API返回结果前继续执行,导致无法获取到Webhook数据。错误处理:
加入try/catch块可以避免单个服务器的Webhook操作失败导致整个循环终止,同时能输出具体的错误信息方便调试。
这样修改后,机器人重启时就会遍历所有服务器,找到自己创建的Webhook并发送消息,不会触发其他Webhook啦。
内容的提问来源于stack exchange,提问作者SomePerson
相关产品推荐
相关产品推荐

