discord.py机器人无法给持有指定角色的多个用户发送私信问题求助
问题排查与修复方案
1. 启用成员网关意图(90%以上是该原因导致)
discord.py v2.0及以上版本默认不获取服务器完整成员列表,需要在两处开启成员权限:
- 进入Discord开发者后台的对应机器人设置页,找到「Privileged Gateway Intents」板块,打开
Server Members Intent开关 - 在代码初始化client的位置添加意图配置,示例:
intents = discord.Intents.default() intents.members = True # 开启成员获取权限 client = discord.Client(intents=intents) # 如果使用commands.Bot,写法为: # bot = commands.Bot(command_prefix='你的指令前缀', intents=intents)
2. 补充容错逻辑与异常捕获
原代码无错误处理逻辑,角色不存在、私信被拒等问题都不会输出报错,修改后的代码如下:
@client.command() async def eventsoon(ctx): # 先校验角色是否存在 role = discord.utils.get(ctx.guild.roles, name='Golden God') if not role: await ctx.send("未找到Golden God角色") return success_count = 0 fail_count = 0 # 直接遍历角色绑定的成员列表,不需要遍历全服成员再判断,效率更高 for member in role.members: try: await member.send("ur mom") success_count += 1 except discord.Forbidden: # 触发场景:用户拒收服务器私信、拉黑机器人、机器人无私信发送权限 fail_count += 1 except Exception as e: print(f"给成员{member.name}发信失败,错误信息:{e}") fail_count += 1 await ctx.send(f"私信发送完成:成功{success_count}人,失败{fail_count}人")
3. 其他排查点
- 确认输入的指令和设置的前缀匹配,比如前缀设置为
!时,需要输入!eventsoon才能触发指令 - 确认
Golden God角色名的大小写、空格和服务器内实际配置完全一致,discord角色名匹配为大小写敏感 - 确认目标用户没有关闭「允许来自服务器成员的私信」设置
内容的提问来源于stack exchange,提问作者kiddo42069
相关产品推荐
相关产品推荐

