Discord.js开发:如何获取随机语音频道ID供聊天机器人加入
Discord机器人加入随机语音频道实现方案
核心逻辑不需要手动指定频道ID,先拉取当前服务器全量频道列表,筛选出符合条件的语音频道后随机抽取目标即可,兼容主流discord.js版本。
主流版本(discord.js v14)实现代码
使用前请确保机器人已开启GUILDS、GUILD_VOICE_STATES权限意图,且安装了@discordjs/voice语音依赖包:
const { GuildChannelType } = require('discord.js'); const { joinVoiceChannel } = require('@discordjs/voice'); // 筛选所有可用语音频道 const availableVoiceChannels = message.guild.channels.cache.filter(channel => { return ( // 判定为语音频道类型 channel.type === GuildChannelType.Voice // 机器人拥有该频道的接入权限 && channel.joinable // 频道人数未达上限 && !channel.full ); }); // 无可用频道时的兜底处理 if (availableVoiceChannels.size === 0) { return message.reply('当前服务器不存在可加入的语音频道'); } // 从可用列表随机抽取一个频道 const targetChannel = availableVoiceChannels.random(); // 执行加入频道操作 joinVoiceChannel({ channelId: targetChannel.id, guildId: message.guild.id, adapterCreator: message.guild.voiceAdapterCreator, }); message.reply(`已成功随机加入语音频道:${targetChannel.name}`);
旧版本(discord.js v12)适配代码
// 筛选可用语音频道 const availableVoiceChannels = message.guild.channels.cache.filter( channel => channel.type === 'voice' && channel.joinable && !channel.full ); if (!availableVoiceChannels.size) { return message.reply('当前服务器不存在可加入的语音频道'); } // 随机抽取频道并加入 const targetChannel = availableVoiceChannels.random(); targetChannel.join(); message.reply(`已成功随机加入语音频道:${targetChannel.name}`);
注意事项
- 若需要自定义筛选规则,直接在
filter回调中增加判断条件即可,比如排除指定分类下的频道、排除用户数为0的频道等 - 必须确保机器人拥有“连接”“说话”的语音频道权限,否则加入操作会抛出异常
- v14版本的语音功能独立在
@discordjs/voice包中,需要单独通过npm安装后才能调用
内容的提问来源于stack exchange,提问作者abcd efgh
相关产品推荐
相关产品推荐

