You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过JDA在Discord中给用户发送私信(DM)?

如何用Discord机器人发送私信(Direct Message)

嘿,我来帮你搞定这个问题!你现在用的event.getChannel().sendMessage("Hello World").queue();是往当前公共文本频道发消息,要改成仅目标用户可见的私信,核心是拿到用户对应的「私信频道(PrivateChannel)」,下面给你两种实用的实现方式:

1. 给触发事件的用户发私信

如果是用户触发了某个事件(比如发消息、调用命令),你可以直接从事件对象里获取该用户,然后打开私信频道发送消息:

// 从事件中获取触发操作的用户,打开私信频道并发送消息
event.getAuthor().openPrivateChannel()
    .flatMap(privateChannel -> privateChannel.sendMessage("Hello! This is a private message just for you."))
    .queue(
        () -> System.out.println("DM发送成功!"),
        error -> System.err.println("发送DM失败:" + error.getMessage())
    );
  • openPrivateChannel():如果用户之前和机器人没发过私信,这个方法会自动创建一个私信频道;如果已经存在,直接返回已有频道。
  • flatMap():把「打开频道」的异步操作和「发送消息」的操作链式结合,避免嵌套回调。
  • 最后的queue()里加入了成功/失败的回调,方便排查问题(比如用户关闭了陌生人私信权限时,会触发失败回调)。

2. 给指定ID的用户发私信

如果你想给某个特定用户发私信(不管有没有触发事件),可以通过用户ID先获取User对象,再执行私信操作:

// 替换成目标用户的ID(注意是长整型Long)
long targetUserId = 123456789012345678L;
User targetUser = jda.getUserById(targetUserId);

if (targetUser != null) {
    targetUser.openPrivateChannel()
        .flatMap(channel -> channel.sendMessage("Hey! This is a DM from the bot."))
        .queue(
            success -> System.out.println("DM已发送给目标用户"),
            error -> System.err.println("发送失败:" + error.getMessage())
        );
} else {
    System.out.println("找不到该用户,请检查ID是否正确!");
}

注意:如果机器人所在服务器里没有这个用户,getUserById()可能返回null,所以一定要加非空判断。

关键提醒

  • 确保用户没有关闭「接受陌生人私信」的权限(Discord设置里的隐私选项),否则机器人无法发送私信,会触发错误回调。
  • 私信频道是机器人和用户一对一的专属频道,发送的消息只有双方可见,完全符合你的需求~

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

火山引擎 最新活动