Discord机器人:新加入机器人权限清除事件失效及报错求助
解决新机器人加入时清除权限的问题
你的代码核心错误
你用member.edit(permissions=...)的写法完全错误——discord.py的Member.edit()方法根本没有permissions参数。成员的权限是由其拥有的角色、频道权限覆盖共同决定的,不能直接编辑成员对象的权限属性。
事件正常运行的前提条件
- 你的机器人必须拥有管理角色和管理服务器权限,才能修改其他成员的角色与权限
- 在Discord开发者后台的「Privileged Gateway Intents」中开启Server Members Intent,否则
on_member_join事件不会触发 - 你的机器人角色位置必须高于所有新加入机器人的角色,否则无法修改它们的角色/权限
正确实现代码
最简洁高效的方式是创建一个无任何权限的角色,将新加入的机器人添加到该角色,并移除它可能自动获得的其他角色:
@client.event async def on_member_join(member): if member.bot: # 获取或创建名为"Restricted Bot"的无权限角色 restricted_role = discord.utils.get(member.guild.roles, name="Restricted Bot") if not restricted_role: # 创建角色时设置所有权限为禁用 restricted_role = await member.guild.create_role( name="Restricted Bot", permissions=discord.Permissions.none(), reason="用于限制新加入机器人的权限" ) # 将该角色移到机器人自身角色的上方,确保权限生效 await restricted_role.edit(position=member.guild.me.top_role.position - 1) # 移除机器人的所有其他角色,仅保留受限角色 await member.edit(roles=[restricted_role], reason="新机器人加入,限制其权限")
如果不想创建角色,也可以直接针对服务器默认权限和所有频道设置权限覆盖(这种方式更繁琐):
@client.event async def on_member_join(member): if member.bot: # 修改服务器默认角色权限,禁用所有权限 await member.guild.default_role.edit( permissions=discord.Permissions.none(), reason="限制新机器人默认权限" ) # 遍历所有频道,设置该机器人的权限覆盖为全禁用 for channel in member.guild.channels: overwrite = discord.PermissionOverwrite() overwrite.update(**dict.fromkeys(discord.Permissions.VALID_FLAGS, False)) await channel.set_permissions(member, overwrite=overwrite, reason="限制新机器人频道权限")
额外注意事项
- 优先使用第一种角色方案,后续调整权限更方便
- 测试时可邀请测试机器人验证权限是否被正确限制
- 确保机器人角色位置足够高,否则无法修改其他机器人的角色
内容的提问来源于stack exchange,提问作者Kot
相关产品推荐
相关产品推荐

