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

Discord.py使用on_voice_state_update实现特定用户进出语音频道时机器人同步进出的问题

Discord.py使用on_voice_state_update实现特定用户进出语音频道时机器人同步进出的问题

嘿,我完全懂你现在的困扰——机器人能跟着目标用户进VC,但要么没法自动离开,要么一进去就秒退,确实挺闹心的。我来帮你把这个问题捋顺解决掉。

首先得搞明白on_voice_state_update这个事件的触发逻辑:只要有用户的语音状态发生变化(不管是进/退频道、静音/取消静音,甚至切换频道),这个事件都会被触发。你之前的代码只处理了用户加入频道的情况,现在咱们要补上用户离开频道的判断,同时还要加一些校验避免机器人误操作。

咱们核心要做这几个关键判断:

  • 先确认状态变化的是咱们的目标用户,别管其他用户的操作
  • 用户加入频道时,先检查机器人是不是已经在这个频道里了,避免重复连接
  • 用户离开频道时,检查机器人当前是不是在用户刚才待的频道里,要是在就断开连接

你之前遇到机器人一进就退的问题,大概率是没区分“用户加入”和“用户离开”这两种状态,或者没判断机器人当前的连接状态导致的。

给你调整后的完整代码,直接用就行:

@bot.event
async def on_voice_state_update(member, before, after):
    # 把这里替换成你的目标用户ID
    TARGET_USER_ID = 123456789012345678
    # 先过滤掉非目标用户的状态变化,不处理其他用户
    if member.id != TARGET_USER_ID:
        return
    
    # 场景1:用户从无频道状态加入了某个语音频道
    if after.channel is not None and before.channel is None:
        # 检查机器人是否已经在这个频道,避免重复连接
        bot_in_channel = any(vc.channel == after.channel for vc in bot.voice_clients)
        if not bot_in_channel:
            await after.channel.connect()
            print(f"已跟随目标用户进入频道: {after.channel.name}")
    
    # 场景2:用户从某个语音频道退出到无频道状态
    elif before.channel is not None and after.channel is None:
        # 遍历机器人的所有语音连接,找到用户刚才待的频道
        for vc in bot.voice_clients:
            if vc.channel == before.channel:
                await vc.disconnect()
                print(f"已跟随目标用户离开频道: {before.channel.name}")
                break

我给你拆解下这段代码的逻辑:

  1. 开头先过滤非目标用户的操作,这样机器人不会被其他用户的语音状态变化干扰
  2. 当用户从“不在任何频道”切换到“进入某个频道”时,先确认机器人没在这个频道里,再执行连接操作
  3. 当用户从“在某个频道”切换到“不在任何频道”时,找到机器人在该频道的连接,然后断开

另外还有几个小提醒:

  • 一定要把代码里的TARGET_USER_ID替换成你实际要跟踪的用户ID
  • 确保你的Discord.py版本是2.0+,这段代码是兼容最新版本的
  • 机器人需要有目标语音频道的“连接”权限,不然可能会连接失败

这样调整后,机器人就会精准跟着目标用户进VC,用户离开时也会自动退出,不会再出现一进就退的问题啦。

备注:内容来源于stack exchange,提问作者RS F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:03:00