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

discord.js:如何获取机器人在特定服务器中的语音状态

嘿,我来帮你搞定这个问题!你提到的Voice Statuses其实就是判断机器人语音状态的核心依据,下面我一步步教你怎么用它来检查机器人是否连接/断开特定服务器的任意语音频道:

检查机器人语音连接状态的实现方案

核心逻辑

本质上就是通过机器人的**语音状态对象(Voice State)**来判断:如果该对象关联了某个语音频道,就说明机器人已连接;反之则是断开状态。下面以Discord.js(最常用的Discord机器人开发库)为例,给你具体的实现步骤:

具体操作步骤

  • 第一步:获取目标服务器对象
    先通过服务器ID拿到对应的服务器实例,这样才能针对性检查:

    // 替换成你要检查的服务器ID
    const targetGuildId = "1234567890";
    const targetGuild = client.guilds.cache.get(targetGuildId);
    
  • 第二步:直接检查当前连接状态
    借助机器人在目标服务器内的成员对象,就能快速判断是否在语音频道中:

    // 判断机器人是否已连接该服务器的任意语音频道
    const isConnected = targetGuild.members.me.voice.channel !== null;
    
    if (isConnected) {
      console.log(`机器人当前在服务器${targetGuildId}的语音频道:${targetGuild.members.me.voice.channel.name}`);
    } else {
      console.log(`机器人未连接服务器${targetGuildId}的任何语音频道`);
    }
    

    这里的voice.channel就是Voice Statuses里的核心属性——如果它不为null,就代表机器人处于连接状态。

  • 第三步:实时监听连接/断开事件
    要是你需要实时捕捉机器人的语音状态变化,可以监听voiceStateUpdate事件:

    client.on('voiceStateUpdate', (oldState, newState) => {
      // 只关注机器人自身的状态变化
      if (newState.member.id !== client.user.id) return;
      
      // 只关注目标服务器的状态变化
      const targetGuildId = "1234567890";
      if (newState.guild.id !== targetGuildId) return;
    
      // 判断是连接还是断开
      if (newState.channel) {
        console.log(`✅ 机器人已连接到服务器${targetGuildId}的语音频道:${newState.channel.name}`);
      } else if (oldState.channel) {
        console.log(`❌ 机器人已断开服务器${targetGuildId}的语音频道:${oldState.channel.name}`);
      }
    });
    

关于Voice Statuses的补充说明

你查阅的Voice Statuses其实就是指上面代码里的oldState和newState这类VoiceState对象,它包含了用户(这里是机器人)的所有语音相关状态:

  • channel: 当前连接的语音频道(null则未连接)
  • streaming: 是否正在直播
  • deaf/selfDeaf: 是否被服务器静音/自我静音
  • mute/selfMute: 是否被服务器禁言/自我禁言

核心只要盯紧channel属性,就能轻松判断机器人的语音连接状态啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:43:45