使用DSharpPlus开发Discord超时命令遇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
相关产品推荐
相关产品推荐

