Discord.py实现临时语音频道功能时出现AttributeError报错如何解决
错误原因
on_voice_state_update 事件会在成员语音状态发生任意变动时触发,除了加入、切换语音频道的场景外,也包含离开语音频道的场景。当成员离开语音频道时,after.channel 会返回空值 None,此时直接访问 .id 属性就会触发你遇到的 AttributeError 报错。
修复方案
首先在判断触发频道前新增非空校验,同时优化原代码中不必要的全服务器遍历逻辑,避免Bot加入多服务器时出现重复创建频道的问题,修复后的代码如下:
@Bot.event async def on_voice_state_update(member, before, after): # 排除成员离开语音频道的场景,避免after.channel为空 if not after.channel: return # 校验是否加入了指定的触发频道 if after.channel.id == 826351221145206855: # 直接取当前成员所属服务器,无需遍历所有Bot加入的服务器 guild = member.guild maincategory = discord.utils.get(guild.categories, id=816323445213626368) # 新增分类非空校验,避免分类ID配置错误导致后续报错 if not maincategory: return channel2 = await guild.create_voice_channel(name=f'HALL {member.display_name}', category=maincategory) await channel2.set_permissions(member, connect=True, mute_members=True, move_members=True, manage_channels=True) await member.move_to(channel2) def check(x, y, z): return len(channel2.members) == 0 await Bot.wait_for('voice_state_update', check=check) await channel2.delete()
内容的提问来源于stack exchange,提问作者Mars
相关产品推荐
相关产品推荐

