Discord.py:如何让机器人在语音频道独处时自动断开?是否有对应触发事件?
实现Discord.py机器人语音频道独处自动断开&用户离开事件说明
嘿,我来帮你搞定这个需求!首先直接回答你的第二个问题:确实存在每次用户离开语音频道时触发的事件,就是Discord.py里的on_voice_state_update事件——只要用户的语音状态发生变化(包括离开频道、加入频道、静音/取消静音等),这个事件都会被触发,我们正好可以用它来实现“独处自动断开”的逻辑。
1. 核心事件:on_voice_state_update
这个事件接收三个参数:
member:状态发生变化的用户对象before:用户状态变化前的语音状态(包含之前所在的频道等信息)after:用户状态变化后的语音状态(包含之后所在的频道等信息)
我们可以通过判断before.channel不为空、after.channel为空,来精准捕捉“用户离开某语音频道”的行为。
2. 实现独处自动断开的完整代码示例
下面是一个可直接复用的代码片段,包含了完整的逻辑:
import discord from discord.ext import commands # 必须开启对应的Intents,否则监听不到语音状态变化 intents = discord.Intents.default() intents.voice_states = True # 监听语音状态变化的关键权限 intents.members = True # 获取频道成员列表需要这个权限(部分Discord.py版本可能要求) bot = commands.Bot(command_prefix="!", intents=intents) @bot.event async def on_voice_state_update(member, before, after): # 只处理"用户离开语音频道"的情况 if before.channel is not None and after.channel is None: # 检查机器人是否在用户离开的这个频道里 vc_client = before.channel.guild.voice_client if vc_client is not None and vc_client.channel == before.channel: # 统计频道内的人类成员(排除其他机器人) human_members = [m for m in vc_client.channel.members if not m.bot] # 如果频道里已经没有人类用户了,自动断开 if len(human_members) == 0: await vc_client.disconnect() print(f"已自动断开语音频道「{vc_client.channel.name}」——频道内无其他人类用户") @bot.event async def on_ready(): print(f"机器人已登录:{bot.user.name}(ID:{bot.user.id})") print("------------------------") # 替换成你的机器人Token bot.run("YOUR_BOT_TOKEN_HERE")
3. 关键注意事项
- Intents权限配置:一定要在代码里开启
voice_states和members权限,同时还要去Discord开发者后台的机器人页面,开启对应的Privileged Gateway Intents,否则机器人会监听不到语音状态变化,也无法获取完整的成员列表。 - 成员统计逻辑:代码里过滤了机器人成员,如果你需要的是“只要频道里只剩当前机器人(不管有没有其他机器人)”,可以把统计逻辑改成
len(vc_client.channel.members) == 1(因为机器人自己算一个成员)。 - 额外场景处理:如果需要处理“机器人刚加入频道就没人”的情况,可以在机器人加入频道的逻辑里加一个定时检查,或者在
on_voice_state_update里同时监听机器人自己的状态变化。
内容的提问来源于stack exchange,提问作者Lysander12 PT
相关产品推荐
相关产品推荐

