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

discord.py开发的Discord机器人Ban命令无法发送DM求助

Discord机器人Ban命令无法发送DM的问题解决

核心问题分析

你的代码里先执行了await member.ban(),再尝试发送DM。用户被封禁后会立即退出服务器,此时机器人默认没有权限给非服务器成员发送DM(除非该用户之前主动和机器人互动过),这就是小号收不到DM的主要原因。另外新注册小号的隐私设置可能默认限制了非好友/非服务器成员的DM,也会导致发送失败。

解决方案

1. 调整操作顺序:先发送DM再封禁

把发送DM的逻辑放在封禁之前,此时用户还在服务器内,机器人有权限发起DM:

@client.command()
async def ban(ctx, member: discord.Member, *, reason=None):
    dm_sent = False
    try:
        dm_message = f'You have been banned from {ctx.guild} for {reason}.'
        await member.send(dm_message)
        dm_sent = True
    except discord.Forbidden:
        await ctx.send(f"Couldn't DM {member.mention}.")
    # 无论DM是否成功,都执行封禁
    await member.ban(reason=reason)
    if dm_sent:
        await ctx.send(f'{member.mention} has been banned and informed via DMs.')
    else:
        await ctx.send(f'{member.mention} has been banned without a DM notification.')

2. 确认Intents配置生效

虽然代码里开启了相关Intents,需要在Discord开发者平台验证:

  • 进入你的机器人应用页面
  • 切换到「Privileged Gateway Intents」标签
  • 确保「Server Members Intent」和「Message Content Intent」已启用(这两个是ban命令和消息处理的必要权限)

3. 处理用户隐私设置限制

新注册小号默认可能关闭了「允许来自服务器成员的直接消息」,这种情况下即使调整顺序也无法发送DM。机器人层面无法强制绕过这个限制,只能在提示里告知管理员该情况。

额外修复:代码拼写错误

原代码里的Couldn'd是拼写错误,应改为Couldn't,避免提示消息出现语法问题。

内容的提问来源于stack exchange,提问作者Megapikachu 210

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:57:13