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

Discord API Bot自动进出语音频道disconnect方法报错求助

报错核心原因
  • 你调用disconnect()的对象错了:VoiceChannel类本身没有disconnect()方法,这就是报错里AttributeError的直接来源。执行await channel.connect()时,方法会返回绑定当前频道连接的VoiceClient实例,断开连接的方法是这个实例的方法,不是频道对象的方法。
  • 你在异步协程里用了同步阻塞的time.sleep(3),会卡住整个Bot的事件循环,很容易导致语音连接状态异常,异步场景下的等待要使用asyncio.sleep()。
  • 你写的触发判断条件有逻辑漏洞:or的运算优先级低于and,会导致只要成员id匹配你列的几个值,不管是加入还是离开频道,都会触发Bot加入频道的逻辑,需要给id判断部分加括号明确优先级。
修正后的3秒自动断开测试代码
import discord
import asyncio # 替换同步time模块做异步等待,避免阻塞事件循环
from discord.ext import commands
from discord import FFmpegPCMAudio

TOKEN="<redacted>"
client=discord.Client()

@client.event
async def on_ready():
    print("Logged in as {0.user}".format(client))

@client.event
async def on_voice_state_update(member, before, after):
    # 修正条件判断优先级,只有指定成员从无频道状态加入语音频道时才触发
    target_ids = [450333776485285919, 232855365082021890, 282234566066962433, 256759154524291074]
    if not before.channel and after.channel and member.id in target_ids:
        channel = client.get_channel(988050675604803648) 
        # 接收connect返回的语音客户端实例
        voice_client = await channel.connect()
        # 异步等待不阻塞事件循环
        await asyncio.sleep(3)
        # 调用语音客户端的断开方法
        await voice_client.disconnect()
适配核心需求的逻辑调整提示

要实现「频道无剩余成员自动离开」的逻辑,不需要写死等待时间,在同一个on_voice_state_update事件里补充判断即可:

  • 每次触发语音状态更新时,先检查Bot当前是否已经连接到某个语音频道
  • 如果Bot在频道内,统计当前频道里除了Bot自身之外的正常成员数量
  • 当成员数量为0时,直接调用当前Bot绑定的VoiceClient实例的disconnect()方法即可
  • 注意加状态锁判断,避免重复调用连接/断开方法触发报错。

内容的提问来源于stack exchange,提问作者Bogan Tudose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:33:33