如何在discord.js v13中让机器人就绪时自动加入指定语音频道?
适配discord.js v13:让机器人就绪时加入指定语音频道
我帮你搞定这个问题!你代码里的核心问题是没有正确获取到语音频道对象,导致adapterCreator参数无效——你直接用字符串channelId去访问guild属性,这显然行不通。下面是适配discord.js v13的完整解决方案:
修正后的完整代码
// 建议把模块引入放在文件顶部,不要在ready事件内重复引入 const { joinVoiceChannel } = require('@discordjs/voice'); client.on("ready", async () => { try { // 通过频道ID异步获取语音频道对象 const targetVoiceChannel = await client.channels.fetch("863783336860975114"); // 先校验目标频道是否为语音/舞台频道,避免后续报错 if (!targetVoiceChannel.isVoiceBased()) { console.error("你指定的ID对应的频道不是语音/舞台频道!"); return; } // 调用joinVoiceChannel加入频道 joinVoiceChannel({ channelId: targetVoiceChannel.id, guildId: targetVoiceChannel.guild.id, adapterCreator: targetVoiceChannel.guild.voiceAdapterCreator, }); console.log("✅ 机器人已成功加入指定语音频道!"); } catch (error) { // 捕获并打印可能的错误(比如频道不存在、权限不足等) console.error("❌ 加入语音频道失败:", error); } });
关键修正点说明
- 获取有效频道对象:必须通过
client.channels.fetch()拿到频道实例,才能访问到它所属的服务器(guild)以及voiceAdapterCreator属性,直接用字符串ID做不到这一点。 - 增加类型校验:
isVoiceBased()会检查频道是否为语音或舞台频道,避免传入错误类型的频道ID导致崩溃。 - 错误捕获:用
try/catch包裹异步操作,能帮你快速定位问题(比如机器人没有加入目标服务器、没有连接语音频道的权限等)。 - 优化模块引入:把
require('@discordjs/voice')移到文件顶部,避免每次ready事件触发都重复加载模块,提升性能。
内容的提问来源于stack exchange,提问作者Pooyan




