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

Discord批量私信机器人触发403 Forbidden错误排查求助

排查Discord批量私信机器人403 Forbidden错误

核心可能原因及解决方案

1. 用户隐私设置限制

这是触发403最常见的原因:Discord用户可在隐私设置中关闭「允许来自服务器成员的私信」,或仅允许好友/管理员发送私信。即便机器人在同一服务器,向这类用户发私信也会被Discord直接拒绝,返回403错误。

排查方法:找一个明确开启了服务器成员私信权限的用户,单独测试机器人发私信功能。如果能成功发送,说明问题出在目标用户的隐私设置上,而非机器人或API限制。

2. 机器人未通过Discord验证

如果你的机器人所在服务器成员数超过100,且未在Discord开发者平台完成机器人验证,Discord会对其API操作施加严格限制,包括批量私信功能。这种情况下,即使降低请求频率也会触发403。

解决方法:前往Discord开发者中心,提交机器人验证申请,通过后即可解除这类限制。

3. 代码实现存在漏洞

  • 未过滤机器人用户:向其他机器人发送私信会直接触发错误,若未捕获异常,可能导致后续请求被Discord标记为异常流量。
  • 异常处理缺失:单条私信失败后未处理错误,会导致批量任务中断,甚至被Discord判定为恶意操作。
  • 延迟策略不足:1秒的延迟可能仍低于Discord的隐性反垃圾阈值,尤其是针对大量用户的批量操作。

代码优化示例:

import asyncio
from discord import Forbidden

@bot.command()
async def massdm(ctx, *, message):
    # 先过滤掉所有机器人用户
    target_members = [member for member in ctx.guild.members if not member.bot]
    
    for idx, member in enumerate(target_members):
        try:
            await member.send(message)
            print(f"已发送消息给 {member.name}")
        except Forbidden:
            print(f"无法发送给 {member.name} - 用户隐私设置限制或已屏蔽私信")
        except Exception as err:
            print(f"发送给 {member.name} 时出现未知错误: {str(err)}")
        
        # 优化延迟策略:每发送5条暂停5秒,单条间隔2秒
        if (idx + 1) % 5 == 0:
            await asyncio.sleep(5)
        else:
            await asyncio.sleep(2)

4. Discord反垃圾机制触发

即使降低频率,短时间内发送大量私信仍可能被Discord判定为垃圾信息。除了调整延迟,还可以分批次发送,比如每次发送20条后暂停30秒,避免被标记为恶意流量。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:42:18