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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:04:08