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

如何用JAVA基于Discord-JDA实现机器人启动后自动加入各服务器指定语音频道

实现步骤

1. 引入必要依赖

项目需要先引入JDA框架和JSON解析工具,这里以Maven依赖为例,使用Jackson做JSON解析:

<!-- JDA核心依赖 -->
<dependency>
    <groupId>net.dv8tion</groupId>
    <artifactId>JDA</artifactId>
    <version>5.0.0-beta.24</version> <!-- 可替换为最新稳定版 -->
</dependency>
<!-- Jackson JSON解析依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

2. 解析JSON配置文件

你提供的配置以公会ID为键、对应语音频道ID为值,直接用Map结构解析即可:

// 配置映射实体类
public class GuildVoiceConfig {
    private String voice_channel_id;

    public String getVoiceChannelId() {
        return voice_channel_id;
    }

    public void setVoice_channel_id(String voice_channel_id) {
        this.voice_channel_id = voice_channel_id;
    }
}

// 读取配置文件的工具方法
public Map<String, GuildVoiceConfig> loadVoiceConfig() throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    // 把你的配置文件命名为voice-config.json放在resources根目录
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("voice-config.json");
    TypeReference<Map<String, GuildVoiceConfig>> typeRef = new TypeReference<Map<String, GuildVoiceConfig>>() {};
    return objectMapper.readValue(inputStream, typeRef);
}

3. 监听JDA就绪事件实现自动连接

JDA完全启动完成后会触发ReadyEvent,在该事件中遍历所有公会匹配配置,执行语音频道连接逻辑即可:

public class BotLauncher {
    public static void main(String[] args) throws Exception {
        // 加载语音配置
        Map<String, GuildVoiceConfig> voiceConfig = new BotLauncher().loadVoiceConfig();
        // 构建JDA实例,替换为你自己的机器人Token
        JDA jda = JDABuilder.createDefault("你的机器人TOKEN")
                .enableIntents(GatewayIntent.GUILD_VOICE_STATES) // 必须开启语音状态权限
                .addEventListeners(new AutoJoinVoiceListener(voiceConfig))
                .build();
        jda.awaitReady();
    }

    // 自动连接语音监听器
    public static class AutoJoinVoiceListener extends ListenerAdapter {
        private final Map<String, GuildVoiceConfig> voiceConfig;

        public AutoJoinVoiceListener(Map<String, GuildVoiceConfig> voiceConfig) {
            this.voiceConfig = voiceConfig;
        }

        @Override
        public void onReady(ReadyEvent event) {
            JDA jda = event.getJDA();
            // 遍历机器人加入的所有公会
            for (Guild guild : jda.getGuilds()) {
                String guildId = guild.getId();
                // 跳过没有配置语音频道的公会
                if (!voiceConfig.containsKey(guildId)) {
                    continue;
                }
                String targetChannelId = voiceConfig.get(guildId).getVoiceChannelId();
                VoiceChannel targetChannel = guild.getVoiceChannelById(targetChannelId);
                // 处理频道不存在的情况
                if (targetChannel == null) {
                    System.out.printf("公会%s配置的语音频道%s不存在,跳过连接%n", guildId, targetChannelId);
                    continue;
                }
                // 校验机器人连接权限
                if (!guild.getSelfMember().hasPermission(targetChannel, Permission.VOICE_CONNECT, Permission.VOICE_SPEAK)) {
                    System.out.printf("机器人没有公会%s语音频道%s的连接权限,跳过连接%n", guildId, targetChannelId);
                    continue;
                }
                // 执行连接
                guild.getAudioManager().openAudioConnection(targetChannel);
                System.out.printf("已成功连接公会%s的语音频道%s%n", guildId, targetChannelId);
            }
        }
    }
}

注意事项

  • 需要先在Discord开发者后台给机器人开启Voice State Intent权限,否则无法读取语音频道相关信息
  • 配置的语音频道ID必须真实存在,且机器人已经加入对应公会
  • 不需要主动调用shutdown()方法,机器人会保持后台运行状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:36:03