Как проверить конечную точку discord с помощью php?
- Post author: admin
- Запись опубликована: 13 января, 2022
- Post category: Вопросы по программированию
#php #discord
Вопрос:
У меня возникли некоторые проблемы с созданием бота Discord. Я хочу, чтобы он мог реагировать на команды косой черты, но для этого мне нужно проверить конечную точку. Я использую PHP 7.4 и не могу использовать какие-либо внешние библиотеки (хостинг на сервере, который их не разрешает). Я нашел документы для PHP, но для их работы требуются библиотеки. Я попытался забрать документы у Узла.JS и «преобразование» их в PHP. Вот мой код:
$return_array = [ ‘type’ => 1, ]; echo json_encode($return_array); ?>
Когда я указываю адрес, на который загружается файл, и пытаюсь сохранить изменения, Discord говорит следующее:
Ошибки проверки: interactions_endpoint_url: Не удалось проверить указанный URL конечной точки взаимодействия.
Ответ №1:
Согласно документации Discord, конечная точка взаимодействия должна выполнять две вещи:
How to get a Webhook URL on Discord
- Ваша конечная точка должна быть готова к отправке сообщения PING
- Ваша конечная точка должна быть настроена для правильной обработки заголовков подписей-подробнее об этом в разделе Безопасность и авторизация
Первая часть очень проста:
Итак, чтобы правильно проверить полезную нагрузку, верните ответ 200 с полезной нагрузкой типа: 1:
Таким образом, вам нужно возвращать объект JSON, а не массив (возможно, это одна из проблем с вашим кодом).
Кроме того, конечная точка должна иметь возможность отвечать на недопустимые запросы следующим образом:
Мы также проведем автоматические, обычные проверки безопасности вашей конечной точки, включая целенаправленную отправку вам недействительных подписей. Если вы не пройдете проверку, мы удалим ваш URL-адрес для взаимодействия в будущем и предупредим вас по электронной почте и системному DM.
Одна вещь, которую я заметил, это то, что Discord отправляет свои заголовки в нижнем регистре! Другая проблема заключается в том, что вы используете:
$raw_body = file_get_contents(‘php://input’); это выглядит неправильно.
Источник: programbox.ru
Как проверить конечную точку раздора с помощью php?
У меня возникли проблемы с созданием бота Discord. Я хочу, чтобы он мог отвечать на команды косой черты, но для этого мне нужно проверить конечную точку. Я использую PHP 7.4 и не могу использовать внешние библиотеки (хостинг на сервере, который их не разрешает). Я нашел документы для PHP, но для их работы требуются библиотеки. Я попытался взять документы из Node.JS и «преобразовать» их в PHP. Вот мой код:
How to make OAuth2 for your discord bot (WORKING)
$return_array = [ ‘type’ => 1, ]; echo json_encode($return_array); ?>
Когда я ввожу адрес, на который загружен файл, и пытаюсь сохранить изменения, Discord говорит следующее:
Ошибки проверки: Interactions_endpoint_url: указанный URL-адрес конечной точки взаимодействия не может быть проверен.
Jonathan Tadeo Leiva 7 Авг 2021 в 15:22
Вы когда-нибудь решали это?
25 Фев 2022 в 02:04
Нет, к сожалению нет. Но, если честно, я уже отказался от этого. Я сосредоточился на другом проекте, который имел в виду
Jonathan Tadeo Leiva
26 Фев 2022 в 15:29
3 ответа
Лучший ответ
Этот метод работает для меня на PHP 8.1.
Передайте заголовки и необработанное тело JSON, и он вернет массив с кодом ответа и полезной нагрузкой для отправки обратно через все, что вы используете для обработки ответа. Обратите внимание, что ответ должен быть закодирован в формате JSON.
$discord_public — это открытый ключ из приложения Discord.
public function authorize(array $headers, string $body, string $discord_public): array < $res = [ ‘code’ =>200, ‘payload’ => [] ]; if (!isset($headers[‘x-signature-ed25519’]) || !isset($headers[‘x-signature-timestamp’])) < $res[‘code’] = 401; return $res; >$signature = $headers[‘x-signature-ed25519’]; $timestamp = $headers[‘x-signature-timestamp’]; if (!trim($signature, ‘0..9A..Fa..f’) == ») < $res[‘code’] = 401; return $res; >$message = $timestamp . $body; $binary_signature = sodium_hex2bin($signature); $binary_key = sodium_hex2bin($discord_public); if (!sodium_crypto_sign_verify_detached($binary_signature, $message, $binary_key)) < $res[‘code’] = 401; return $res; >$payload = json_decode($body, true); switch ($payload[‘type’]) < case 1: $res[‘payload’][‘type’] = 1; break; case 2: $res[‘payload’][‘type’] = 2; break; default: $res[‘code’] = 400; return $res; >return $res; >
Coder1 27 Фев 2022 в 07:57
Функция работает, но для ясности вам нужно использовать вывод следующим образом: $auth = authorize($_SERVER, file_get_contents(‘php://input’), ‘your app pub key’); http_response_code($auth[‘code’]); echo json_encode($auth[‘payload’]);
20 Мар 2022 в 09:16
20 Мар 2022 в 21:17
Согласно документации Discord, конечная точка взаимодействия должна сделать две вещи:
- Ваша конечная точка должна быть готова подтвердить сообщение PING.
- Ваша конечная точка должна быть настроена для правильной обработки заголовков подписи — подробнее об этом в разделе «Безопасность и авторизация».
Первая часть очень проста:
Итак, чтобы правильно подтвердить полезную нагрузку, верните ответ 200 с полезной нагрузкой типа: 1:
Таким образом, вам нужно вернуть объект JSON, а не массив (возможно, это одна из проблем вашего кода).
Кроме того, конечная точка должна иметь возможность отвечать на недействительные запросы как:
Мы также будем проводить автоматические регулярные проверки безопасности вашей конечной точки, включая преднамеренную отправку вам недействительных подписей. Если вы не пройдете проверку, мы удалим URL-адрес вашего взаимодействия в будущем и предупредим вас по электронной почте и через системный DM.
Одна вещь, которую я заметил, это то, что Discord отправляет свои заголовки в нижнем регистре! Другая проблема заключается в том, что вы используете:
$raw_body = file_get_contents(‘php://input’); выглядит неправильно.
Наконец, если вы знакомы с node.JS, взгляните на мой рабочий пример: https://github.com/ iaforek/discord-взаимодействия
iaforek 31 Дек 2021 в 15:39
401, ‘payload’ => null]; $signature = $headers[‘HTTP_X_SIGNATURE_ED25519’]; $timestamp = $headers[‘HTTP_X_SIGNATURE_TIMESTAMP’]; if (!trim($signature, ‘0..9A..Fa..f’) == ») return [‘code’ => 401, ‘payload’ => null]; $message = $timestamp . $payload; $binarySignature = sodium_hex2bin($signature); $binaryKey = sodium_hex2bin($publicKey); if (!sodium_crypto_sign_verify_detached($binarySignature, $message, $binaryKey)) return [‘code’ => 401, ‘payload’ => null]; $payload = json_decode($payload, true); switch ($payload[‘type’]) < case 1: return [‘code’ =>200, ‘payload’ => [‘type’ => 1]]; case 2: return [‘code’ => 200, ‘payload’ => [‘type’ => 2]]; default: return [‘code’ => 400, ‘payload’ => null]; > >
Источник: question-it.com
Как проверить конечную точку Discord с помощью php?
У меня возникли проблемы при создании бота Discord. Я хочу, чтобы он мог отвечать на команды с косой чертой, но для этого мне нужно проверить конечную точку. Я использую PHP 7.4 и не могу использовать какие-либо внешние библиотеки (хостинг на сервере, который их не позволяет). Я нашел документы для PHP, но для их работы требуются библиотеки. Я пробовал брать документы из Node.JS и «конвертировать» их в PHP. Вот мой код:
$return_array = [ ‘type’ => 1, ]; echo json_encode($return_array); ?>
Когда я указываю адрес, на который загружен файл, и пытаюсь сохранить изменения, Discord сообщает следующее:
Ошибки валидации: Interactions_endpoint_url: указанный URL-адрес конечной точки взаимодействий не может быть проверен.
user8396463 07 авг ’21 в 15:22 2021-08-07 15:22
2021-08-07 15:22
3 ответа
Этот метод работает для меня на PHP 8.1.
Передайте заголовки и необработанное тело JSON, и он вернет массив с кодом ответа и полезной нагрузкой для отправки обратно через все, что вы используете для обработки ответа. Обратите внимание, что ответ должен быть закодирован в формате JSON.
это открытый ключ из приложения Discord.
public function authorize(array $headers, string $body, string $discord_public): array < $res = [ ‘code’ =>200, ‘payload’ => [] ]; if (!isset($headers[‘x-signature-ed25519’]) || !isset($headers[‘x-signature-timestamp’])) < $res[‘code’] = 401; return $res; >$signature = $headers[‘x-signature-ed25519’]; $timestamp = $headers[‘x-signature-timestamp’]; if (!trim($signature, ‘0..9A..Fa..f’) == ») < $res[‘code’] = 401; return $res; >$message = $timestamp . $body; $binary_signature = sodium_hex2bin($signature); $binary_key = sodium_hex2bin($discord_public); if (!sodium_crypto_sign_verify_detached($binary_signature, $message, $binary_key)) < $res[‘code’] = 401; return $res; >$payload = json_decode($body, true); switch ($payload[‘type’]) < case 1: $res[‘payload’][‘type’] = 1; break; case 2: $res[‘payload’][‘type’] = 2; break; default: $res[‘code’] = 400; return $res; >return $res; >
user711852 27 фев ’22 в 04:57 2022-02-27 04:57
2022-02-27 04:57
401, ‘payload’ => null]; $signature = $headers[‘HTTP_X_SIGNATURE_ED25519’]; $timestamp = $headers[‘HTTP_X_SIGNATURE_TIMESTAMP’]; if (!trim($signature, ‘0..9A..Fa..f’) == ») return [‘code’ => 401, ‘payload’ => null]; $message = $timestamp . $payload; $binarySignature = sodium_hex2bin($signature); $binaryKey = sodium_hex2bin($publicKey); if (!sodium_crypto_sign_verify_detached($binarySignature, $message, $binaryKey)) return [‘code’ => 401, ‘payload’ => null]; $payload = json_decode($payload, true); switch ($payload[‘type’]) < case 1: return [‘code’ =>200, ‘payload’ => [‘type’ => 1]]; case 2: return [‘code’ => 200, ‘payload’ => [‘type’ => 2]]; default: return [‘code’ => 400, ‘payload’ => null]; > >
user2793555 20 мар ’22 в 06:41 2022-03-20 06:41
2022-03-20 06:41
Согласно документации Discord , конечная точка взаимодействия должна делать две вещи:
- Ваша конечная точка должна быть готова подтвердить сообщение PING.
- Ваша конечная точка должна быть настроена для правильной обработки заголовков подписи — подробнее об этом в разделе «Безопасность и авторизация».
Первая часть очень проста:
Итак, чтобы правильно подтвердить полезную нагрузку, верните ответ 200 с полезной нагрузкой типа: 1:
Таким образом, вам нужно вернуть объект JSON, а не массив (возможно, это одна из проблем вашего кода).
Кроме того, конечная точка должна иметь возможность отвечать на недопустимые запросы следующим образом:
Мы также будем проводить автоматические регулярные проверки безопасности вашей конечной точки, включая преднамеренную отправку вам недействительных подписей. Если вы не пройдете проверку, мы удалим URL-адрес вашего взаимодействия в будущем и предупредим вас по электронной почте и через системный DM.
Одна вещь, которую я заметил, это то, что Discord отправляет свои заголовки в нижнем регистре! Другая проблема заключается в том, что вы используете:
$raw_body = file_get_contents(‘php://input’); это не выглядит правильно.
Источник: stackru.com