Discord API Bot无法稳定加入语音频道 is_connected函数使用异常
Discord机器人语音自动加入功能故障排查
你的is_connected函数从装饰器使用、逻辑判断到上层触发条件都存在错误,具体问题如下:
- 错误给自定义业务函数添加
@client.event装饰器。该装饰器仅用于注册discord.py框架预定义的事件回调,自定义函数加这个装饰器会被框架识别为无效事件处理器,多次触发后会出现调用逻辑紊乱,最终导致功能彻底失效且无报错。 - 语音连接状态判断逻辑存在缺陷。你调用
discord.utils.get(client.voice_clients)时未传入任何筛选参数,只要机器人在任意服务器存在语音连接记录(包括网络波动断开后残留的僵尸连接实例),就会判定为已连接,不会校验连接是否真实有效、是否处于目标频道,直接导致一半场景下不会执行加入操作。 - 上层触发条件存在运算符优先级bug。Python中
and优先级高于or,你写的判断条件实际等价于「(用户刚进入语音频道且是第一个指定成员)或(是其余三个指定成员,无论进出频道、甚至离线)」,会触发大量无效的连接检查,进一步加剧连接状态错乱的概率。
修正后代码
# 把固定配置抽成常量,后续修改更方便 TARGET_USER_IDS = {450333776485285919, 232855365082021890, 282234566066962433, 256759154524291074} TARGET_VOICE_CHANNEL_ID = 988050675604803648 @client.event async def on_ready(): print("Logged in as {0.user}".format(client)) # 自定义函数去掉@client.event装饰器,函数名调整为更贴合业务语义的命名 async def join_target_channel(): channel = client.get_channel(TARGET_VOICE_CHANNEL_ID) # 按所属服务器筛选有效语音连接,排除其他服务器的连接干扰 voice_client = discord.utils.get(client.voice_clients, guild=channel.guild) if not voice_client: # 无有效连接时直接加入目标频道 await channel.connect() elif voice_client.channel.id != TARGET_VOICE_CHANNEL_ID: # 有连接但不在目标频道时,直接移动到目标频道,避免重复连接报错 await voice_client.move_to(channel) @client.event async def on_voice_state_update(member, before, after): # 给成员ID判断整体加括号,修正运算符优先级问题,仅当指定成员刚加入任意语音频道时触发 if (not before.channel and after.channel) and (member.id in TARGET_USER_IDS): await join_target_channel()
内容的提问来源于stack exchange,提问作者Bogan Tudose
相关产品推荐
相关产品推荐

