JDA Discord Bot遇ErrorResponseException 10008:未知消息问题求助
解决JDA中编辑消息时的ErrorResponseException 10008: Unknown Message问题
你的问题根源在于异步操作的时序问题,以及错误地使用getLatestMessageId()来获取刚发送的消息ID,具体分析和解决方案如下:
问题分析
JDA的sendMessage().queue()是异步执行的——调用这个方法后,代码会立刻继续往下走,而消息实际上还在发送到Discord服务器的过程中。这时候你立刻调用getLatestMessageId(),会出现两个致命问题:
- 刚发送的消息还没被Discord服务器确认,频道的最新消息ID还没更新;
- 如果在这极短的时间内有其他用户发送了消息,你拿到的会是别人的消息ID。
这两种情况都会导致后续调用editMessageById()时,传入的ID是无效或错误的,从而抛出Unknown Message错误。
解决方案
正确的做法是在sendMessage()的回调函数中获取消息ID,因为回调会在消息成功发送到Discord并返回后执行,这时拿到的ID才是绝对可靠的。
修改你的AutoController中的run方法代码:
@Override public void run(){ try { while (true) { sleep((long) timer); TextChannel channel = event.getGuild().getTextChannelById(channelId); if (channel == null) { // 先判断频道是否存在,避免空指针 System.err.println("指定的频道不存在!"); continue; } if(messageId == null){ // 使用回调获取正确的消息ID channel.sendMessage("A").queue(message -> { this.messageId = message.getId(); System.out.println("成功发送消息,ID:" + messageId); }, error -> { // 处理发送失败的情况 System.err.println("发送消息失败:" + error.getMessage()); }); }else{ channel.editMessageById(messageId,"B").queue(editedMessage -> { System.out.println("消息编辑成功"); }, error -> { System.err.println("编辑消息失败:" + error.getMessage()); }); } } } catch (InterruptedException e) { throw new RuntimeException(e); } }
额外注意事项
- 尽量避免使用
getLatestMessageId()来获取Bot自己发送的消息ID,这个方法仅适用于获取频道当前最新消息,完全无法保证是你刚发送的那条; - 每次操作频道前,最好先判断频道是否存在(
channel != null),避免空指针异常; - 给
queue()添加失败回调,能帮你更方便地排查发送/编辑过程中的错误。
内容的提问来源于stack exchange,提问作者Slavko
相关产品推荐
相关产品推荐

