Discord Bot断开用户语音频道代码失效,请求排查故障
问题分析与解决方案
原代码的核心逻辑完全错误——你试图让机器人先连接到用户的语音频道再断开,这操作和断开用户本身没有任何关系,反而会因为无意义的连接动作触发报错(比如机器人已在其他语音频道、权限不足等)。要实现断开用户的语音连接,需要使用Discord API提供的移动用户至无频道的方法,而非操作机器人自身的语音状态。
关键修正点
- 权限要求:机器人必须在服务器中拥有「移动成员」权限,否则无法执行断开用户语音的操作。
- 正确的断开逻辑:无需让机器人连接语音频道,直接对用户的
Member对象调用move_to(None),即可将用户踢出当前语音频道。 - 严谨的状态检查:先判断用户是否处于语音频道,避免直接访问
ctx.author.voice.channel引发属性错误。 - 具体错误捕获:替换空
except为捕获具体异常,方便排查问题(如权限不足、用户已离开频道等)。
修改后的完整代码
import asyncio from discord.ext import commands @bot.command() async def disconnect(ctx, time: int): if time <= 0: await ctx.send("时间必须大于0") return await ctx.send(f"{ctx.author.mention}, 即将在 {time} 秒后断开你的语音连接") await asyncio.sleep(time) # 检查用户是否在语音频道 if not ctx.author.voice: await ctx.send(f"{ctx.author.mention}, 你当前不在任何语音频道里") return try: # 核心操作:将用户移动到None,即断开语音连接 await ctx.author.move_to(None) await ctx.send(f"{ctx.author.mention}, 已成功断开你的语音连接") except Exception as e: # 输出具体错误信息,便于排查 await ctx.send(f"{ctx.author.mention}, 无法断开你的语音连接:{str(e)}")
额外注意事项
- 确保你使用的Discord.py版本为v2.x(v1.x部分API已废弃)。
- 机器人的角色优先级需高于目标用户的角色,否则可能因权限限制无法执行移动操作。
内容的提问来源于stack exchange,提问作者nanine9
相关产品推荐
相关产品推荐

