You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

实现Discord服务器全员私信命令遇403错误,求原因排查

解决Discord机器人批量发私信时的403 Forbidden错误

嘿,我之前也碰到过这个问题,来给你拆解下原因和解决办法:

首先你遇到的这个403 Forbidden错误,核心原因大多和用户隐私设置相关,当然还有几个其他可能的情况:

常见错误原因

  • 用户关闭了跨服务器私信权限:很多Discord用户会在隐私设置里勾选“不接受非好友的服务器成员私信”,甚至完全关闭私信功能。这种情况下,不管机器人权限多高,都没法给他们发消息。
  • 目标是其他机器人:服务器成员列表里可能包含其他机器人账号,机器人之间默认无法互相发送私信,尝试发送就会触发403错误。
  • 用户已退出服务器但缓存未更新:有时候用户已经离开服务器,但机器人的成员缓存还没刷新,这时给“不存在”的成员发消息也会报错。
  • Discord反垃圾机制限制:短时间内发送大量私信,Discord可能会临时限制机器人的发送权限,同样会返回403。

另外你的代码里还有几个小问题,虽然不是报错的直接原因,但会影响功能:

  • 参数语法错误:words*应该写成*words,这样才能正确接收多个命令参数。
  • 字符串拼接冗余:用" ".join(words)比循环拼接要简洁高效得多。
  • 版本兼容性问题:如果你的Discord.py是v1.0及以上版本,ctx.message.server已经改名为ctx.message.guildbot.send_message也被member.send()替代了,旧语法在新版本中会失效。

修改后的代码(带错误处理)

from discord import Forbidden  # 需要导入Forbidden异常类
import asyncio

@bot.command(pass_context=True)
async def massdm(ctx, *words):
    # 用join拼接命令参数,自动添加空格分隔
    output = " ".join(words)
    # 适配新版本的guild字段
    guild = ctx.message.guild
    
    for member in guild.members:
        # 跳过机器人账号,避免无效尝试
        if member.bot:
            continue
        try:
            # 新版本用member.send直接发送私信
            await member.send(output)
            print(f"✅ 成功发送消息给 {member.name}#{member.discriminator}")
            # 添加延迟避免触发反垃圾机制
            await asyncio.sleep(1)
        except Forbidden:
            print(f"❌ 无法发送消息给 {member.name}#{member.discriminator}:用户隐私设置限制")
        except Exception as e:
            print(f"⚠️ 发送消息给 {member.name}#{member.discriminator} 时出错:{str(e)}")

额外提醒

批量发私信很容易触发Discord的反垃圾检测,严重的话可能导致机器人账号被封禁,建议你:

  • 只在获得服务器成员明确同意的情况下使用这个功能
  • 保留代码里的延迟设置,避免短时间内发送大量消息

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

火山引擎 最新活动