discord.js开发的机器人Ping响应功能不生效问题求助
问题排查及解决步骤
- 修正事件监听名称:discord.js v13及以上版本已废弃
message事件,替换为messageCreate事件,旧版事件不会被触发,是最常见的失效原因。 - 停止硬编码匹配用户名/标签格式:Discord 消息的原始
content字段中,提及机器人的内容为<@机器人ID>(无服务器昵称时)或<@!机器人ID>(有服务器昵称时),你肉眼看到的@用户名#标签是客户端渲染后的展示内容,和接口返回的实际字段值完全不一致,直接匹配必然无法命中。 - 使用内置方法判断提及:discord.js 封装了成熟的提及判断API,不需要自行解析字符串,调用
message.mentions.has(client.user)即可准确识别所有格式的机器人提及,不需要额外处理ID、昵称格式差异。 - 检查权限配置:登录Discord开发者平台,进入对应机器人应用的「Bot」设置页,开启Message Content Intent权限,v13及以上版本未开启该权限时无法正常读取消息内容,会导致判断逻辑失效。
可用参考代码
client.on('messageCreate', async (message) => { // 跳过机器人自身发送的消息,避免触发死循环 if (message.author.bot) return; // 判断消息是否艾特了当前机器人 if (message.mentions.has(client.user)) { console.log("Someone pinged the bot! :P") message.channel.send("why'd you ping me lol") } });
如果你只需要用户仅发送机器人提及、没有其他文字内容时才触发响应,可以把判断逻辑修改为:
client.on('messageCreate', async (message) => { if (message.author.bot) return; const plainMention = `<@${client.user.id}>`; const nickMention = `<@!${client.user.id}>`; const trimmedContent = message.content.trim(); if (trimmedContent === plainMention || trimmedContent === nickMention) { console.log("Someone pinged the bot! :P") message.channel.send("why'd you ping me lol") } });
内容的提问来源于stack exchange,提问作者Stylin
相关产品推荐
相关产品推荐

