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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:34:46