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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:17