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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:45:07