【问题标题】:Discord API error #40001 UnauthorizedDiscord API 错误 #40001 未经授权
【发布时间】:2018-06-14 05:34:47
【问题描述】:

我通过 OAuth2 URL (https://discordapp.com/api/oauth2/authorize?client_id=398437519408103444&permissions=59392&scope=bot) 验证我的机器人

我想向我的 discord 服务器上的频道发送消息

代码:

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://discordapp.com/api/channels/'.$channel_id.'/messages');
curl_setopt($curl, CURLOPT_HTTPHEADER, [
    // 'Content-Type: application/json',
    'Authorization: Bot '.$this->token
]);
curl_setopt($curl, CURLOPT_POST, true);

curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode([
    'content' => 'test'
]));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($curl);
curl_close ($curl);
var_dump(json_decode($server_output, true));

但反应是:

array(2) {
  ["code"]=>
  int(40001)
  ["message"]=>
  string(12) "Unauthorized"
}

API 链接:https://discordapp.com/developers/docs/resources/channel#create-message

【问题讨论】:

标签: php discord php-curl


【解决方案1】:

原来你只需要使用身份验证令牌连接到网关一次,它应该允许从那时起通过 api 发送消息。从那时起,我使用链接中的 html 文件一次性完成此操作。

https://github.com/restcord/restcord/blob/master/extra/gateway.html

将我引向此的原始 github 问题在这里 https://github.com/restcord/restcord/issues/68

【讨论】:

    【解决方案2】:

    根据我从文档中可以看出的; Discord 希望机器人登录到 Discord 服务器并首先显示它的存在。只有这样,Discord 才会允许 Bot 使用其 API 将消息发送到同一服务器。

    文档不是很清楚——在我看来,机器人通常无法登录到服务器。这是因为机器人没有电子邮件地址。它只被赋予了一个特殊的令牌。

    我猜 Discord 提供的内置库之一应该能够做到这一点。无论我发现什么,你的机器人都需要先找到它必须连接到的 Websocket 网关。

    此 API 调用有效,它确实为您提供了网关端点 https://discord.com/api/v6/gateway

    但我不擅长 websocket 连接(wss:// 协议),所以我跳过了这一步,而且我很不耐烦。

    幸运的是,我找到了解决问题的方法。那是从这里下载名为“LiveBot”的基于 Electron 的 Windows 可执行文件:https://github.com/SebOuellette/LiveBot

    警告:这是一个非常大的 ZIP 文件,因为基于 Electron 的可执行文件通常是。只需在 Windows 机器上启动 LiveBot;并在那里提供您的 Bot 令牌。

    这将使 Bot 在您的服务器上表现得像普通用户一样。一旦 Discord 知道您的 Bot 能够连接到它所连接的服务器;然后在那之后它将允许发送消息。

    我的经验表明,如果您的 Bot至少一次无法连接到您的服务器,您将始终收到 40001 错误代码。就像你描述的那样。

    这不是一种程序化方法,但它对我有用。由于只需要一个连接,这就是我所做的一切。之后,我能够使用 REST API 使用普通的旧 Curl 发送直接消息;而不是 Discord 库之一。

    希望这对你也有用。

    【讨论】:

      【解决方案3】:

      POST/channels/{channel.id}/messages

      在使用此端点之前,您必须至少连接并识别一次网关。

      将消息发布到公会文本或 DM 频道。如果在公会频道上操作,此端点需要当前用户具有“SEND_MESSAGES”权限。

      您的机器人在该频道中是否拥有“SEND_MESSAGES”权限?

      不是吗?进入频道设置并授予权限。

      您的机器人是否至少与网关连接并识别了一个?

      不是吗?好吧,您可能应该这样做,最好使用已经为它制作的library

      如果尽管尝试了上述解决方案,此问题仍然存在,则可能是您的 POST 请求格式不正确。

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 2017-09-27
        • 2021-10-01
        • 2017-10-17
        • 2018-12-29
        • 2019-05-06
        • 2016-02-09
        • 2019-06-28
        • 2017-11-28
        相关资源
        最近更新 更多