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

如何通过用户ID发送私信?JDA开发中无法通过ID查找用户的问题

解决JDA机器人无法通过用户ID查找用户的问题

你的代码中jda.getUserById(recipientUserId)返回null,核心原因是这个方法仅从本地缓存中查找用户——如果目标用户不在机器人的缓存范围内(比如和机器人不在同一服务器、缓存未加载完成),就会获取不到用户对象。以下是针对性的解决方案:

方案1:通过API主动获取用户(推荐)

使用retrieveUserById方法直接调用Discord API获取用户,不依赖本地缓存,只要用户ID正确且未屏蔽机器人,就能成功获取用户对象。修改sendPrivateMessage方法如下:

private void sendPrivateMessage() {
    String recipientUserId = "(censored)";
    String messageContent = "L";

    jda.retrieveUserById(recipientUserId)
        .queue(recipient -> {
            recipient.openPrivateChannel().queue(privateChannel -> {
                privateChannel.sendMessage(messageContent).queue();
                System.out.println("Message has been sent to " + recipient.getAsTag() + " successfully");
            });
        }, error -> {
            System.out.println("Can't find the user or failed to retrieve: " + error.getMessage());
        });
}

方案2:从服务器成员列表中获取(适用于同服务器用户)

如果目标用户和机器人在同一服务器,可直接从服务器的成员缓存中获取——GuildReadyEvent触发时,该服务器的成员缓存已加载完成,可靠性更高:

@Override
public void onGuildReady(GuildReadyEvent event) {
    System.out.println("All members in the guild " + event.getGuild().getName() + " have been downloaded.");

    sendPrivateMessage(event.getGuild());
}

private void sendPrivateMessage(Guild guild) {
    String recipientUserId = "(censored)";
    String messageContent = "L";

    Member recipient = guild.getMemberById(recipientUserId);
    if (recipient != null) {
        User user = recipient.getUser();
        user.openPrivateChannel().queue(privateChannel -> {
            privateChannel.sendMessage(messageContent).queue();
            System.out.println("Message has been sent to " + user.getAsTag() + " successfully");
        });
    } else {
        System.out.println("Can't find the user in this guild. Please check the ID or ensure the user is in the server.");
    }
}

额外注意事项

  • 确认机器人Token有效,且用户未屏蔽机器人(否则无法发送私信)
  • 使用retrieveUserById时要处理API请求失败的情况,比如无效ID、网络异常
  • GuildReadyEvent是每个服务器加载完成时触发一次,若机器人在多服务器,需等待所有服务器缓存加载完成后再执行全局操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:57:04