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

Discord Bot断开用户语音频道代码失效,请求排查故障

问题分析与解决方案

原代码的核心逻辑完全错误——你试图让机器人先连接到用户的语音频道再断开,这操作和断开用户本身没有任何关系,反而会因为无意义的连接动作触发报错(比如机器人已在其他语音频道、权限不足等)。要实现断开用户的语音连接,需要使用Discord API提供的移动用户至无频道的方法,而非操作机器人自身的语音状态。

关键修正点

  1. 权限要求:机器人必须在服务器中拥有「移动成员」权限,否则无法执行断开用户语音的操作。
  2. 正确的断开逻辑:无需让机器人连接语音频道,直接对用户的Member对象调用move_to(None),即可将用户踢出当前语音频道。
  3. 严谨的状态检查:先判断用户是否处于语音频道,避免直接访问ctx.author.voice.channel引发属性错误。
  4. 具体错误捕获:替换空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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 12:52:40