首页 文章

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

提问于
浏览
3

我是Discord API的新手,我正在开发一个项目,需要能够以编程方式添加一个公会成员 . 我已经学会了如何获取授权代码(带有identify和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标头中包含访问令牌:

授权:持票人[编辑]

我还尝试在请求中添加JSON主体:

{“access_token”:“[已编辑]”}

两者都没有奏效 . 不出所料,同时使用两者都没有用 .

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

{“access_token”:“[Redacted]”,“token_type”:“Bearer”,“expires_in”:604800,“refresh_token”:“[Redacted]”,“scope”:“识别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库) .

1 回答

  • 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”的内容类型更改为“application / json” . 我从使用“Bearer”的Authorization Headers 更改为“Bot”,我使用的是bot的令牌 . 我使用与以前相同的访问令牌 . 如果没有更好的解决方案,我打算接受这个答案 .

相关问题