You need to enable JavaScript to run this app. Java JDA开发Discord机器人执行$info命令缺少MESSAGE_EMBED_LINKS权限报错求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:24:05