Discord.js v14:已知机器人消息ID,如何获取命令发送者的Member对象?
在Discord.js v14中通过机器人消息ID获取被@的命令发送者Member对象
实现步骤
第一步:获取目标消息对象
通过消息ID调用channel.messages.fetch()方法获取机器人发送的目标消息,该方法为异步操作,需用async/await处理。第二步:提取消息中的提及成员
消息对象的mentions.members属性会返回一个Collection集合,包含所有被@的成员的Member对象。由于场景中消息仅@了命令发送者,直接取集合第一个元素即可。
完整代码示例
async function getCommandSenderMember(messageId, targetChannel) { try { // 拉取机器人发送的目标消息 const botMessage = await targetChannel.messages.fetch(messageId); // 获取消息中所有被提及的成员集合 const mentionedMembers = botMessage.mentions.members; // 检查是否存在提及成员 if (mentionedMembers.size === 0) { console.log("该消息未提及任何成员"); return null; } // 返回第一个被提及的成员(对应命令发送者) return mentionedMembers.first(); } catch (err) { console.error("操作出错:", err); return null; } } // 使用示例(以Slash命令场景为例) // async function handleCommand(interaction) { // const messageId = "替换为机器人消息的实际ID"; // const senderMember = await getCommandSenderMember(messageId, interaction.channel); // if (senderMember) { // console.log(`获取到命令发送者:${senderMember.user.tag}`); // // 后续可基于senderMember执行其他操作 // } // }
注意事项
- 确保机器人拥有
ViewChannel和ReadMessageHistory权限,否则无法正常拉取消息 - 若目标消息不在当前交互频道,需先通过
guild.channels.fetch(channelId)获取对应频道对象 - 若消息中存在多个提及成员,需结合业务逻辑进一步筛选(比如匹配命令触发上下文)
内容的提问来源于stack exchange,提问作者Elijah Nelson
相关产品推荐
相关产品推荐

