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

Discord机器人无法发送DM问题的代码修复与排查求助

Discord机器人DM无法送达问题修复与排查指南

排查方向

  • 用户端设置验证:即使用户开启了DM,需确认服务器隐私设置中「允许来自服务器成员的直接消息」是否启用;同时检查用户是否将机器人拉黑。
  • 机器人账号状态:确认机器人账号未被Discord限制发送消息(如触发反垃圾机制),可尝试用机器人给其他测试用户发DM验证。
  • 代码逻辑时机:检查发送DM的代码是否在用户被踢出/封禁之后执行——虽然Discord允许给已离开服务器的用户发DM,但需确保用户对象未失效。
  • 异常信息捕获:在发送DM的代码块中添加异常捕获,获取具体错误类型(如Forbidden、HTTPException),定位根本原因。

代码修复建议

针对发送DM的逻辑,添加异常处理并优化发送流程,示例如下(替换原发送DM的代码):

import discord

async def send_violation_notification(user, violation_count):
    # 构建通知内容
    if violation_count == 3:
        message = "你的账号已因第三次违规被封禁,请检查服务器规则。"
    else:
        message = f"你因触发违规角色被踢出服务器,这是第{violation_count}次违规,第三次将被封禁。"
    
    try:
        # 显式创建DM频道(避免隐式创建的潜在问题)
        dm_channel = await user.create_dm()
        await dm_channel.send(message)
        return True
    except discord.Forbidden:
        # 无权限发送DM,记录到staff频道
        staff_channel = bot.get_channel(config.STAFF_CHANNEL_ID)
        await staff_channel.send(f"⚠️ 无法向用户 {user.name} ({user.id}) 发送DM:用户已拉黑机器人或关闭服务器DM权限。")
    except discord.HTTPException as e:
        # 网络或API错误
        staff_channel = bot.get_channel(config.STAFF_CHANNEL_ID)
        await staff_channel.send(f"❌ 向用户 {user.name} ({user.id}) 发送DM时出错:{str(e)}")
    return False

在踢人/封禁逻辑中调用此函数,建议先发送DM再执行踢人/封禁操作,确保用户对象处于有效状态:

# 示例:角色添加触发处理
@bot.event
async def on_member_update(before, after):
    target_role = bot.get_role(config.TARGET_ROLE_ID)
    if target_role in after.roles and target_role not in before.roles:
        # 获取用户违规次数(需自行实现存储逻辑,如数据库/JSON文件)
        violation_count = get_violation_count(after.id)
        
        # 先发送通知
        await send_violation_notification(after, violation_count)
        
        # 执行踢人/封禁
        if violation_count >= 3:
            await after.ban(reason="第三次违规触发封禁")
        else:
            await after.kick(reason=f"第{violation_count}次违规触发踢出")
        
        # 记录到staff频道
        staff_channel = bot.get_channel(config.STAFF_CHANNEL_ID)
        action = "封禁" if violation_count >=3 else "踢出"
        await staff_channel.send(f"✅ 已{action}用户 {after.name} ({after.id}),第{violation_count}次违规。")

关键文件检查要点

main.py

  • 确认事件监听逻辑(如on_member_update/on_member_join)正确触发,未遗漏违规角色的检测。
  • 检查用户违规次数的存储逻辑(如数据库、本地文件)是否正确,确保计数准确。
  • 验证bot.get_user()或member对象是否有效,避免使用已失效的用户实例发送DM。

config.py

  • 确认STAFF_CHANNEL_ID、TARGET_ROLE_ID为整数类型(而非字符串),ID值与服务器实际频道/角色ID一致。

requirements.txt

  • 确保使用稳定版discord.py,推荐指定版本:
discord.py==2.3.2
python-dotenv==1.0.0  # 若使用环境变量存储配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:15:56