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

Discord.js V14 Bot无法检测用户是否在语音频道问题求助

问题排查与修复方案

核心问题:缺少语音状态意图

你当前启用的intents中没有GuildVoiceStates,这是Discord.js获取用户语音频道信息的必需权限。没有这个意图,interaction.member.voice.channel会始终返回undefined,导致误判你不在语音频道。

修复步骤:

  1. 在代码中添加意图:
    在客户端初始化时,把GatewayIntentBits.GuildVoiceStates加入intents数组:
    const { Client, GatewayIntentBits } = require('discord.js');
    const client = new Client({
      intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.DirectMessages,
        GatewayIntentBits.GuildVoiceStates // 新增此意图
      ]
    });
    
  2. 在Discord开发者门户开启权限:
    登录Discord开发者平台,进入你的应用→Bot→Privileged Gateway Intents,确保Guild Voice States开关已打开。

代码中的其他潜在问题

除了意图问题,你的代码还有几个需要优化的点:

  • 无队列管理:每次调用/play都会创建新的AudioPlayer,重复调用会导致多轨同时播放,需要实现队列系统来管理待播放歌曲。
  • 无错误处理:ytdl.getInfo、ytdl调用没有捕获异常,遇到无效链接或网络问题时会直接崩溃,需要用try/catch包裹核心逻辑。
  • 不支持关键词搜索:当前只接受YouTube URL,用户输入关键词时会报错,需要结合ytsr等包实现搜索功能。
  • 未处理播放器/连接错误:没有监听播放器的error事件,播放失败时无法给用户反馈。

带错误处理的优化示例

async execute(interaction) {
  const song = interaction.options.getString('song');

  if (!interaction.member.voice.channel) {
    return interaction.reply({ content: '你不在语音频道里!', ephemeral: true });
  }

  try {
    const connection = joinVoiceChannel({
      channelId: interaction.member.voice.channel.id,
      guildId: interaction.guildId,
      adapterCreator: interaction.guild.voiceAdapterCreator
    });

    // 验证URL,若不是链接则提示(如需搜索可在此处添加逻辑)
    let videoUrl = song;
    if (!ytdl.validateURL(song)) {
      return interaction.reply({ content: '请输入有效的YouTube链接!如需关键词搜索,请先实现搜索功能。', ephemeral: true });
    }

    const videoInfo = await ytdl.getInfo(videoUrl);
    const stream = ytdl(videoUrl, { filter: 'audioonly', highWaterMark: 1 << 25 });
    const resource = createAudioResource(stream);

    const player = createAudioPlayer();
    player.play(resource);
    connection.subscribe(player);

    const embed = new EmbedBuilder()
      .setColor("Green")
      .setTitle('正在播放')
      .setDescription(`[${videoInfo.videoDetails.title}](${videoUrl})`)
      .setThumbnail(videoInfo.videoDetails.thumbnails[0].url);
    await interaction.reply({ embeds: [embed] });

    // 监听播放器错误
    player.on('error', (error) => {
      console.error('播放错误:', error);
      interaction.followUp({ content: '播放时出现错误,请稍后重试。', ephemeral: true });
    });

  } catch (error) {
    console.error('命令执行错误:', error);
    await interaction.reply({ content: '处理请求时出错,请检查链接是否有效。', ephemeral: true });
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:22:11