如何用Discord.NET(C#)实现Discord超时命令?HTTP请求遇未授权错误
Discord.NET调用Timeout功能遇未授权错误(HTTP PATCH实现)
我尝试用Discord.NET开发调用Discord新Timeout功能的C#命令,但没找到对应函数,于是改用HTTP PATCH请求实现,结果返回未授权错误。相关代码如下:
public static async Task PatchData(string url, string data, string token) { // Create a new HttpClient instance using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Authorization",token); httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); var content = new StringContent(data, Encoding.UTF8, "application/json"); var response = await httpClient.PatchAsync(url, content); if (response.IsSuccessStatusCode) { Console.WriteLine("Data patched successfully!"); } else { Console.WriteLine(response.StatusCode); } }
执行代码:
await Patch.PatchData($"https://discord.com/api/v9/guilds/{Context.Guild.Id}/members/{user.Id}", "{\"communication_disabled_until\": " + current_time + time_in_minutes + "}",botToken);
问题排查与解决方案
检查Bot权限
Discord的Timeout功能要求机器人必须拥有MODERATE_MEMBERS权限,先确认机器人在目标服务器中已被授予该权限,邀请机器人时的链接也要包含这个权限(权限码对应268435456)。修正Token授权格式
机器人Token的Authorization头必须带Bot前缀,你的代码直接传入token导致格式错误。修改授权头代码:httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bot", token);修复请求体JSON格式
communication_disabled_until需要ISO 8601格式的字符串,且必须用引号包裹。你直接拼接数字会导致JSON无效,Discord API可能返回未授权(实际是请求格式错误)。修正请求体拼接逻辑:var timeoutUntil = DateTime.UtcNow.AddMinutes(time_in_minutes).ToString("o"); var data = $"{{\"communication_disabled_until\": \"{timeoutUntil}\"}}";优化HttpClient复用
每次创建新HttpClient会导致连接泄漏,建议复用静态HttpClient实例:private static readonly HttpClient _httpClient = new HttpClient(); static YourClassName() { _httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); }
修正后的完整代码示例
private static readonly HttpClient _httpClient = new HttpClient(); static Patch() { _httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); } public static async Task PatchData(string url, string data, string token) { _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bot", token); var content = new StringContent(data, Encoding.UTF8, "application/json"); var response = await _httpClient.PatchAsync(url, content); if (response.IsSuccessStatusCode) { Console.WriteLine("Data patched successfully!"); } else { // 建议获取错误详情排查 var errorMsg = await response.Content.ReadAsStringAsync(); Console.WriteLine($"错误状态码:{response.StatusCode},详情:{errorMsg}"); } } // 调用示例 var timeoutUntil = DateTime.UtcNow.AddMinutes(time_in_minutes).ToString("o"); var requestData = $"{{\"communication_disabled_until\": \"{timeoutUntil}\"}}"; await Patch.PatchData($"https://discord.com/api/v9/guilds/{Context.Guild.Id}/members/{user.Id}", requestData, botToken);
内容的提问来源于stack exchange,提问作者https
相关产品推荐
相关产品推荐

