Java JDA开发Discord机器人执行$info命令缺少MESSAGE_EMBED_LINKS权限报错求助
问题根因
从报错日志可以直接定位问题:机器人缺失MESSAGE_EMBED_LINKS(嵌入链接)权限,你代码中使用EmbedBuilder构造了嵌入卡片消息,Discord要求机器人必须持有该权限才能发送嵌入类内容,否则就会触发该权限不足异常。
解决步骤
- 第一步:重新生成机器人邀请链接
进入Discord开发者后台的对应机器人应用页,依次打开「OAuth2」→「URL Generator」,先勾选bot权限域,再在下方权限列表中勾选发送消息、读取消息/查看频道、嵌入链接三个基础权限,复制新生成的邀请链接,将机器人重新邀请进你的服务器,原有未携带权限的邀请链接不会自动更新权限。 - 第二步:检查频道独立权限
部分服务器会对单独频道设置权限覆盖,确认机器人所在的用户组,在指令触发的频道中已经开启「嵌入链接」权限,避免频道独立设置覆盖了全局角色权限。
可选代码优化(避免权限不足时程序崩溃)
可以在发送嵌入消息前增加权限校验逻辑,权限不足时返回纯文本提示:
package testbot1; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; public class commands extends ListenerAdapter { public void onGuildMessageReceived(GuildMessageReceivedEvent event) { // 先过滤机器人自己发的消息,避免循环触发 if(event.getAuthor().isBot()) return; String[] args = event.getMessage().getContentRaw().split("\\s+"); if (args[0].equalsIgnoreCase(Testbot1.prefix + "info")) { EmbedBuilder info = new EmbedBuilder(); info.setTitle("ElhadedyBot"); info.setDescription("Currently, this bot is for testing only"); info.setColor(0xf45642); info.setFooter("Created by Youssefeka116", event.getMember().getUser().getAvatarUrl()); // 新增权限校验 if(event.getGuild().getSelfMember().hasPermission(event.getGuildChannel(), Permission.MESSAGE_SEND, Permission.MESSAGE_EMBED_LINKS)) { event.getChannel().sendTyping().queue(); event.getChannel().sendMessage(info.build()).queue(); } else { // 权限不足时发送纯文本提示 event.getChannel().sendMessage("权限不足,请为机器人开启「发送消息」和「嵌入链接」权限").queue(); } info.clear(); } } }
另外你当前Testbot1类的静态jda变量未完成赋值,main方法内重新定义了局部变量jda,如果后续需要全局调用jda实例,可以把main方法内的JDA jda = JDABuilder.createDefault("The Token Here").build();修改为jda = JDABuilder.createDefault("The Token Here").build();即可。
内容的提问来源于stack exchange,提问作者user15070780
相关产品推荐
相关产品推荐

