You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动