如何通过discord.py给Discord特定角色的成员发送私信?代码执行无报错但私信未送达的问题求助
解决Discord.py批量私信未发送的问题
看起来你的代码语法上没毛病,机器人能返回“Done!”但没实际发私信,大概率是踩了Discord API或者权限的坑,我帮你逐一排查:
1. 用户隐私设置拦截了DM
很多Discord用户会关掉**“允许来自服务器成员的直接消息”**这个选项(在服务器的隐私设置里),这种情况下机器人根本发不出私信。但你代码里的except:太宽泛,没捕获具体错误,所以看不到失败原因。
修复方法:
把通用的except:换成捕获具体异常,这样能明确知道失败原因:
except discord.Forbidden: await ctx.send(f":x: 没法给{m}发私信,大概率是用户关了服务器DM权限,或者把机器人拉黑了") except Exception as e: await ctx.send(f":x: 给{m}发消息时出了点错: {str(e)}")
2. 机器人无法获取离线成员
默认情况下,Discord.py的ctx.guild.members只返回在线成员,如果目标角色里大部分是离线用户,你的代码根本不会遍历到他们。
修复方法:
需要开启成员意图(Member Intents):
- 先去Discord开发者后台(你的机器人应用页面),找到“Privileged Gateway Intents”,把
Server Members Intent开关打开 - 然后修改客户端初始化代码:
intents = discord.Intents.default() intents.members = True # 如果用的是commands.Bot bot = commands.Bot(command_prefix='你的命令前缀', intents=intents) # 如果是discord.Client client = discord.Client(intents=intents)
3. 先确认是否匹配到目标成员
有时候可能你传入的角色参数不对,或者根本没有成员拥有该角色,可以在代码里加一行确认:
members = [m for m in ctx.guild.members if role in m.roles] await ctx.send(f"找到{len(members)}个带指定角色的成员") # 新增这行用于验证
如果输出是0,那就是角色没找对,或者目标角色下没有成员。
4. 机器人权限不足
确保机器人在服务器里拥有**“查看服务器成员”**的权限,不然它连成员列表都获取不到,更别说发私信了。去服务器的角色设置里给机器人开启这个权限。
把这些调整完,应该就能正常发送私信了,而且能看到具体的失败原因,方便你排查剩余问题。
内容的提问来源于stack exchange,提问作者Raghuvanshi
相关产品推荐
相关产品推荐

