Discord 添加公会成员 401 错误尽管显然有效的访问令牌

Discord Add Guild Member 401 Error Despite Apparently Valid Access Token

我是 Discord API 的新手,我正在做一个需要能够以编程方式添加公会成员的项目。我已经了解了如何获取授权代码(具有标识和 guilds.join 范围)、将其兑换为访问令牌以及获取用户 ID。最后一步是使用访问代码和用户 ID 添加公会。此命令在此处有详细说明:

https://discordapp.com/developers/docs/resources/guild#add-guild-member

看来我需要向这个 URL:

发送 PUT 请求

https://discordapp.com/api/guilds/[GuildID]/members/[UserID]

但这会导致以下响应:

{"code": 0, "message": "401: Unauthorized"}

我已经尝试在授权中包含访问令牌 header:

Authorization: Bearer [Redacted]

我也试过在请求中添加 JSON body:

{"access_token":"[Redacted]"}

两者均无效。毫不奇怪,同时使用两者也没有用。

我想知道这是否是权限问题,但 Discord 确认我有 guilds.join 范围。这是我在交换访问令牌的授权码时收到的 JSON:

{"access_token": "[Redacted]", "token_type": "Bearer", "expires_in": 604800, "refresh_token": "[Redacted]", "scope": "identify guilds.join"}

识别范围有效,因为我能够检索用户及其 ID。但是guilds.join好像不行。

我在下面包含了一些测试代码。我标记了 "Option 1" 和 "Option 2" 行以表示我通常不会在同一个请求中同时执行这两种访问代码方法。但是正如我之前提到的,我确实尝试了两种方法,但仍然出现 401 错误。

using (WebClient client = new WebClient())
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
    client.Headers.Add(HttpRequestHeader.Authorization, "Bearer [Redacted]");//Option 1
    string output = client.UploadString
    (
        "https://discordapp.com/api/guilds/[GuildID]/members/[UserID]",
        WebRequestMethods.Http.Put,
        "{\"access_token\":\"[Redacted]\"}"//Option 2
    );
}

因为我想了解它的工作原理,所以我更愿意知道如何使用普通的 Web 请求(例如 HttpWebRequest 和 WebClient,而不是使用某些 OAuth 库)。

我正在回答我自己的问题,因为我可能已经弄明白了。它在我执行以下命令时起作用:

using (WebClient client = new WebClient())
{
    client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
    client.Headers.Add(HttpRequestHeader.Authorization, "Bot [Redacted]");
    string output = client.UploadString
    (
        "https://discordapp.com/api/guilds/[GuildID]/members/[UserID]",
        WebRequestMethods.Http.Put,
        "{\"access_token\":\"[Redacted]\"}"
    );
}

请注意,我从 "application/x-www-form-urlencoded" 的内容类型更改为 "application/json." 我从使用 "Bearer" 的授权 header 更改为 "Bot," 并且我我正在使用我的机器人的令牌。我使用与以前相同的访问令牌。如果没有更好的解决方案,我打算接受这个答案。