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

使用DSharpPlus开发Discord超时命令遇403 Unauthorized错误求助

DSharpPlus机器人超时命令返回403 Unauthorized错误排查与解决

问题描述

使用DSharpPlus开发Discord机器人的超时命令时,触发Unauthorized 403错误。自身为服务器所有者且拥有管理员角色,机器人已配置管理员权限,Intents设置为DiscordIntents.All,代码如下:

public async Task TimeOut(CommandContext ctx, DiscordMember m)
{
    if (ctx.Member.Permissions.HasPermission(Permissions.Administrator))
    {
       await m.TimeoutAsync(DateTime.Now + TimeSpan.FromSeconds(60));
       await ctx.Channel.SendMessageAsync("User has been successfully timed out");
    }
}

排查与解决步骤

  • 检查机器人角色层级
    Discord权限系统中,机器人的角色必须位于目标用户的角色层级之上,否则即使拥有管理员权限也无法对该用户执行超时操作。进入服务器设置的「角色」页面,将机器人的角色拖动到目标用户所有角色的上方。

  • 验证机器人的ModerateMembers权限
    超时操作依赖Permissions.ModerateMembers权限(管理员权限包含该权限,但可能存在配置异常)。建议在代码中添加机器人权限检查:

    public async Task TimeOut(CommandContext ctx, DiscordMember m)
    {
        // 检查命令执行者权限
        if (!ctx.Member.Permissions.HasPermission(Permissions.Administrator))
        {
            await ctx.Channel.SendMessageAsync("你没有执行该命令的权限");
            return;
        }
        // 检查机器人自身权限
        var botPerms = ctx.Guild.CurrentMember.Permissions;
        if (!botPerms.HasPermission(Permissions.ModerateMembers))
        {
            await ctx.Channel.SendMessageAsync("机器人缺少超时用户所需的权限");
            return;
        }
        // 使用UTC时间避免时区问题
        await m.TimeoutAsync(DateTime.UtcNow + TimeSpan.FromSeconds(60));
        await ctx.Channel.SendMessageAsync("用户已成功被超时");
    }
    
  • 修正超时时间的时区问题
    原代码中使用DateTime.Now(本地时间),Discord API要求传入UTC时间,可能导致参数无效引发错误。替换为DateTime.UtcNow即可解决。

  • 确认目标用户身份
    机器人无法对服务器所有者执行超时操作,即使拥有管理员权限。如果目标用户是服务器所有者,该操作本身就会返回403错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:23:32