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

如何创建Discord.js命令实现指定用户私信发送特定消息?

解决Discord机器人!dm命令的问题

嘿,我来帮你搞定这个私信命令的问题!你的代码里有几个关键逻辑错误,咱们一步步把它改对:

首先给你修正后的完整代码,再逐个拆解问题的解决思路:

const Discord = require('discord.js');

module.exports.run = async (client, message, args) => {
    // 1. 获取目标用户:支持@提及或用户ID两种方式
    const targetUser = message.mentions.members.first() || message.guild?.members.cache.get(args[0]);
    
    // 检查是否找到有效用户
    if (!targetUser) {
        return message.reply('请正确提及用户,或者提供目标用户的ID哦!');
    }
    
    // 2. 分离私信内容:去掉第一个参数(用户部分),剩下的合并成完整消息
    const dmContent = args.slice(1).join(' ');
    
    // 检查是否输入了私信内容
    if (!dmContent) {
        return message.reply('你还没输入要发送的私信内容呢!');
    }
    
    try {
        // 3. 发送私信并反馈结果
        await targetUser.send(dmContent);
        message.reply(`搞定啦!已经给 ${targetUser.user.tag} 发送了私信~`);
    } catch (error) {
        console.error('发送私信出错:', error);
        message.reply('哎呀,没法给这个用户发私信,可能是对方屏蔽了机器人,或者机器人没有权限哦!');
    }
};

接下来咱们逐个解决你遇到的三个问题:

1. 正确分离两个参数

你之前用args.join(' ')把所有参数合并成了一串,自然没法区分用户和消息内容。现在我们用args.slice(1).join(' '):

  • args.slice(1)会去掉数组的第一个元素(也就是用户的提及/ID)
  • 剩下的元素用join(' ')合并成完整的私信内容,完美实现参数分离。

2. 正确指定发送目标用户

你之前错误地给message.author赋值——message.author是发送命令的用户,不是你要私信的目标!现在我们用两种方式精准获取目标用户:

  • message.mentions.members.first():直接获取你@提及的第一个用户
  • message.guild?.members.cache.get(args[0]):如果用户输入的是用户ID,就从服务器成员缓存里查找对应的用户(?.是可选链操作符,避免在DM里使用命令时出错)

3. 从参数中获取用户ID

上面的代码已经原生支持通过ID查找用户:当你输入!dm 1234567890 "你的消息"时,args[0]就是用户ID,message.guild.members.cache.get(args[0])会帮你匹配到对应的用户对象。

额外小提示

  • 如果用户在DM里使用这个命令,message.guild会是undefined,代码里的?.已经避免了报错,你也可以额外加个判断,提示用户只能在服务器里使用这个命令。
  • 确保机器人有发送私信的权限,同时目标用户没有屏蔽机器人,否则会进入catch块给出友好的错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:27:31