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
我给你拆解下这段代码的逻辑:
- 开头先过滤非目标用户的操作,这样机器人不会被其他用户的语音状态变化干扰
- 当用户从“不在任何频道”切换到“进入某个频道”时,先确认机器人没在这个频道里,再执行连接操作
- 当用户从“在某个频道”切换到“不在任何频道”时,找到机器人在该频道的连接,然后断开
另外还有几个小提醒:
- 一定要把代码里的
TARGET_USER_ID替换成你实际要跟踪的用户ID - 确保你的Discord.py版本是2.0+,这段代码是兼容最新版本的
- 机器人需要有目标语音频道的“连接”权限,不然可能会连接失败
这样调整后,机器人就会精准跟着目标用户进VC,用户离开时也会自动退出,不会再出现一进就退的问题啦。
备注:内容来源于stack exchange,提问作者RS F
相关产品推荐
相关产品推荐

