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," 并且我我正在使用我的机器人的令牌。我使用与以前相同的访问令牌。如果没有更好的解决方案,我打算接受这个答案。
我是 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," 并且我我正在使用我的机器人的令牌。我使用与以前相同的访问令牌。如果没有更好的解决方案,我打算接受这个答案。