我是Discord API的新手,我正在开发一个项目,需要能够以编程方式添加一个公会成员。我已经学会了如何获取授权代码(带有identify和guilds.join范围),将其兑换为访问令牌,并获取用户的ID。最后一步是使用访问代码和用户ID来添加公会。此命令详述如下:
https://discordapp.com/developers/docs/resources/guild#add-guild-member
我似乎需要向此网址发送PUT请求:
https://discordapp.com/api/guilds/[GuildID]/members/[UserID]
但这导致了这种反应:
{"代码":0,"消息":" 401:未经授权"}
我已尝试在授权标头中包含访问令牌:
授权:持票人[编辑]
我还尝试在请求中添加JSON正文:
{"&的access_token#34;:" [删除]"}
两者都没有奏效。不出所料,同时使用两者都没有效果。
我想知道这是否是权限问题,但Discord确认我有guilds.join范围。这是我在交换访问令牌的授权码时收到的JSON:
{" access_token":" [已编辑]"," token_type":" Bearer"," expires_in&#34 ;:604800," refresh_token":" [已编辑]","范围":"识别guilds.join"}
识别范围有效,因为我能够检索用户及其ID。但是guilds.join似乎没有用。
我在下面提供了一些测试代码。我已经标记了"选项1"和"选项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库)
答案 0 :(得分:4)
我正在回答我自己的问题,因为我可能已经想到这一点。它在我执行以下内容时起作用:
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" to" application / json。"我改变了使用" Bearer"的授权标题。到了#B; Bot,"我正在使用机器人的代币。我使用与以前相同的访问令牌。如果没有更好的解决方案,我打算接受这个答案。