我是Discord API的新手,我正在一个项目,该项目需要能够以编程方式添加行会成员.我已经学习了如何获取授权码(具有identity和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”}
我尝试将访问令牌包括在Authorization标头中:
Authorization: Bearer [Redacted]
我也尝试过向请求添加JSON正文:
{“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似乎不起作用.
我在下面包含了一些测试代码.我已经标记了“选项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库)来做到这一点.
解决方法:
我正在回答自己的问题,因为我可能已经知道了.当我执行以下命令时,它将起作用:
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”的授权标头更改为“ Bot”,并且使用了我的机器人的令牌.我正在使用与以前相同的访问令牌.如果没有更好的解决方案,我计划接受这个答案.