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
相关产品推荐
相关产品推荐

