使用discordpy开发Discord机器人时用户DM私信无法送达如何解决
问题核心原因
你遇到的是Discord平台的原生规则限制,没有任何代码层面的绕过方案:
只要用户被服务器封禁,就会自动和该服务器内的所有机器人解除「共同服务器」关联。Discord默认禁止无共同服务器的用户向机器人发送私信,你看到的用户侧报错就是这个规则触发的结果,机器人端不会收到任何请求所以日志无报错。
可行解决方案
两种可行方向,更推荐第二种调整流程的方案:
- 保留封禁逻辑的临时方案
你可以在执行封禁操作前,先主动向用户发送好友申请,用户通过好友后即可不受共同服务器限制正常回复私信,验证通过后你可以自动解除和用户的好友关系。但该方案缺陷非常明显:一是普通用户很少会同意陌生机器人的好友申请,验证通过率会极低;二是Discord对机器人主动批量加好友的行为有严格风控,短时间操作过多会直接导致机器人账号被限制或封禁,仅适合极小体量的测试场景使用,不建议上线运营。 - 调整为权限限制的标准验证流程(行业通用方案)
就是你提到的仅开放验证频道的方案,是目前所有公开Discord验证机器人的通用逻辑,完全规避私信限制问题:- 先调整服务器角色权限:给默认的
@everyone角色设置所有频道的「查看频道」权限为拒绝,仅单独给#验证频道开放「查看频道」权限,同时可以根据需求关闭#验证频道的「发送消息」权限,仅允许机器人发消息 - 新用户入群后不再执行封禁操作,默认继承
@everyone的权限,仅能看到#验证频道,机器人可以在频道内@新用户,或者主动给新用户发私信引导提供学校邮箱,此时双方仍属于共同服务器,用户可以正常回复私信 - 用户完成邮箱验证码验证后,自动给用户分配正式成员角色,该角色提前配置好所有普通频道的访问权限,用户即可正常使用全服务器功能
- 先调整服务器角色权限:给默认的
补充优化提示
你可以用discordpy的组件功能在#验证频道发送带「开始验证」按钮的公告,用户点击按钮后才触发私信流程,不需要机器人主动给所有入群用户发私信,可以大幅降低机器人账号被判定为发广告的风险。
内容的提问来源于stack exchange,提问作者Day Trip
相关产品推荐
相关产品推荐

