discord.py如何给持有某身份组的所有成员批量添加另一身份组
功能实现说明
该需求可以正常实现,你此前使用的代码不生效的核心原因为:role.members返回的是持有指定身份组的成员对象集合,而add_roles()是单个Member成员实例的专属方法,不能直接作用于集合对象。
前置要求
- 你需要先在Discord开发者平台的Bot管理页开启
Server Members Intent权限,同时在代码初始化Bot时开启对应意图,否则无法正常获取完整的服务器成员列表 - 你的Bot的身份组排序需要高于你要操作的两个身份组,同时Bot需要拥有
管理身份组的权限
实现代码示例
常规场景(成员数小于1000)
import discord from discord.ext import commands # 启用成员相关意图 intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix="!", intents=intents) @bot.command() async def batch_add_role(ctx, source_role_id: int, target_role_id: int): # 获取两个身份组的实例 source_role = ctx.guild.get_role(source_role_id) target_role = ctx.guild.get_role(target_role_id) if not source_role or not target_role: await ctx.send("传入的身份组ID不存在,请检查参数") return # 遍历持有源身份组的所有成员,逐个添加目标身份组 for member in source_role.members: try: await member.add_roles(target_role) except discord.Forbidden: await ctx.send(f"为成员 {member.name} 添加身份组失败,权限不足") await ctx.send("身份组批量添加操作执行完成") bot.run("替换为你的Bot Token")
大服务器场景(成员数大于等于1000)
如果服务器成员数量超过1000,role.members默认无法返回全量成员,需要使用拉取全量成员的方法筛选后操作:
async for member in ctx.guild.fetch_members(limit=None): if source_role in member.roles: try: await member.add_roles(target_role) except discord.Forbidden: pass
内容的提问来源于stack exchange,提问作者Pieninja
相关产品推荐
相关产品推荐

