如何通过用户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
相关产品推荐
相关产品推荐

