通过 POST 请求向 Discord 频道发送消息会导致代码 401

Posted

技术标签:

【中文标题】通过 POST 请求向 Discord 频道发送消息会导致代码 401【英文标题】:Sending a message to Discord channel via POST request results in code 401 【发布时间】:2021-06-04 15:10:52 【问题描述】:

我正在寻找从 Chrome 扩展程序向 Discord 频道发送消息的最简单方法。 我在 Discord Developer Portal 上注册了一个 Discord 应用程序和相应的机器人。我在那里有机器人令牌。 找到this SO question。尝试了 Tobyhn 建议的代码,结果如下:

var token = "my bot token here";
var channel_id = "my channel id here";
var channel_url = `https://discord.com/api/v8/channels/$channel_id/messages`

request = new XMLHttpRequest();
request.withCredentials = true;
request.open("POST", channel_url);
request.setRequestHeader("authorization", token);
request.setRequestHeader("accept", "/");
request.setRequestHeader("authority", "discord.com");
request.setRequestHeader("content-type", "application/json");

request.send(JSON.stringify( content: message ));

代码只是放置在后台脚本中。 Chrome 使用标志 --disable-web-security --disable-gpu --user-data-dir=~\chromeTemp" 运行以避免 CORS 检查。 此外,我绝对确定 bot 在该频道所在的 Discord 服务器上被授予管理员权限,因此必须可以编写消息。 但是,在执行时服务器响应代码 401:

code: 0 
message: "401: Unauthorized" 

我也尝试从 Yet Another Rest Client 发送相同的请求,结果相同。

如何更改请求才能成功授权并发送消息?

提供额外的上下文:当我在 discord.js 库的帮助下使用同一个机器人时,它成功地将消息发送到同一台服务器上的各个通道。 我也阅读了this 线程,但似乎没有找到解决方案,并且没有任何内容似乎适用于我的情况。

非常感谢!

【问题讨论】:

【参考方案1】:

您需要指定令牌类型

示例机器人令牌授权标头 Authorization: Bot MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs

不记名令牌授权标头示例 Authorization: Bearer CZhtkLDpNYXgPH9Ml6shqh2OwykChw

所以换request.setRequestHeader("authorization", token); request.setRequestHeader("authorization", Bot $token); 如果您使用的是机器人令牌

https://discord.com/developers/docs/reference

不,它们不是真正的令牌,我从他们的文档中得到它们。

【讨论】:

以上是关于通过 POST 请求向 Discord 频道发送消息会导致代码 401的主要内容,如果未能解决你的问题,请参考以下文章

Python:通过 cog 和后台任务向 Discord 中的特定频道发送消息

Indy Post 到 discord webhook 给出了错误的请求 400

尝试向多个 Discord 频道发送消息

使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误

Discord py 向频道发送消息

Discord.js 机器人无法向特定频道发送消息