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

discord.py中on_member_remove发送DM触发403 Forbidden错误求助

Discord机器人on_member_remove事件发送DM失败(403 Forbidden)解决方法

错误码50007表示机器人无法向目标用户发送私信,结合你斜杠命令能成功、仅部分用户可接收的情况,可从以下几个方向排查解决:

1. 用户隐私设置的场景差异

Discord对机器人主动发起的DM和用户触发交互后发起的DM(比如斜杠命令)有不同限制:

  • 斜杠命令属于用户主动触发的交互,即便用户开启了「服务器成员无法发私信」的设置,机器人仍能通过该交互上下文发送DM。
  • on_member_remove是机器人主动发起的DM,会被用户的隐私设置直接拦截。
    解决:
  • 告知目标用户调整隐私设置:进入「用户设置→隐私与安全→服务器隐私默认设置」,开启「允许服务器成员向我发送私信」;或者将机器人账号添加为好友。

2. 缺失Server Members Intent权限

on_member_remove事件需要开启Server Members Intent权限,否则机器人无法正确获取用户完整信息及DM发送权限:
解决:

  1. 登录Discord开发者平台,进入你的机器人页面,在「Bot」选项卡的「Privileged Gateway Intents」区域,开启「Server Members Intent」(建议同时开启「Presence Intent」)。
  2. 在代码中启用对应intents:
import discord
from discord.ext import commands
import asyncio

intents = discord.Intents.default()
intents.members = True  # 必须开启,否则无法触发on_member_remove及获取用户完整信息
intents.presences = True  # 可选,增强用户状态识别能力

bot = commands.Bot(command_prefix="!", intents=intents)

3. 用户离开时的状态异常处理

用户离开服务器时,可能存在账号离线、被限制,或者Discord API未同步状态的情况,导致机器人无法及时发送DM:
解决:在发送逻辑中添加延迟和异常捕获,避免崩溃并明确失败原因:

@bot.event
async def on_member_remove(member):
    try:
        await asyncio.sleep(1)  # 延迟1秒,等待API同步用户状态
        await member.send("感谢你在服务器的陪伴!")
    except discord.Forbidden:
        print(f"无法向用户 {member.name}({member.id}) 发送私信:用户屏蔽机器人或隐私设置限制")
    except Exception as e:
        print(f"发送私信失败:{str(e)}")

4. 共同服务器限制

如果用户离开的是机器人所在的最后一个共同服务器,Discord规则禁止机器人主动向这类用户发送DM(除非用户之前主动和机器人互动过),这种情况属于正常限制,只能通过异常捕获处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:52:36