Отправка Discord Webhook из JavaScript и Node.js
Как отправлять сообщения в Discord через webhook на JavaScript: fetch API, Node.js, embed-сообщения, файлы и обработка ошибок с примерами кода.
Зачем использовать Discord Webhook в JavaScript?
Discord webhook позволяет отправлять сообщения в канал Discord из любого JavaScript-приложения — будь то фронтенд, Node.js сервер или serverless функция. Это идеальный способ для:
- Уведомлений в реальном времени — алерты об ошибках, статусы деплоя
- Интеграций — подключение внешних сервисов к Discord
- Автоматизации — боты, мониторинг, логирование событий
- Форм обратной связи — отправка данных из веб-форм в Discord
В отличие от полноценного бота, webhook не требует постоянного соединения или сложной авторизации — просто HTTP POST запрос.
Создание Webhook в Discord
- Откройте настройки канала Discord (шестерёнка рядом с названием)
- Перейдите в Интеграции → Вебхуки
- Нажмите Новый вебхук
- Задайте имя и скопируйте URL
URL будет выглядеть так:
https://discord.com/api/webhooks/1234567890/abcdefghijklmnop
Важно: Не публикуйте URL вебхука в открытом коде. Используйте переменные окружения.
Отправка простого сообщения (Browser/Node.js)
Самый простой способ отправить сообщение — использовать fetch:
const webhookUrl = "https://discord.com/api/webhooks/YOUR_WEBHOOK_URL";
const sendMessage = async (content) => {
const response = await fetch(webhookUrl, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ content })
});
if (response.ok) {
console.log("Сообщение отправлено!");
} else {
console.error("Ошибка:", response.status, await response.text());
}
};
sendMessage("Привет из JavaScript!");
Этот код работает как в браузере, так и в Node.js 18+ (где fetch встроен).
Отправка Embed-сообщения
Embed позволяют создавать красиво оформленные сообщения:
const sendEmbed = async () => {
const embed = {
title: "Уведомление о деплое",
description: "Приложение успешно задеплоено в production",
color: 5763719, // Зелёный
fields: [
{
name: "Версия",
value: "v2.1.0",
inline: true
},
{
name: "Окружение",
value: "Production",
inline: true
},
{
name: "Время деплоя",
value: "2 минуты 34 секунды",
inline: false
}
],
footer: {
text: "Deploy Bot"
},
timestamp: new Date().toISOString()
};
const response = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ embeds: [embed] })
});
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
};
sendEmbed();
Кастомное имя и аватар
Переопределите имя и аватар webhook для каждого сообщения:
const sendCustomMessage = async () => {
const payload = {
content: "Деплой завершён успешно!",
username: "Deploy Bot",
avatar_url: "https://example.com/deploy-bot-avatar.png"
};
await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
};
Это полезно, когда один webhook используется для разных типов уведомлений.
Отправка файлов
Для отправки файлов используйте FormData:
const sendFile = async (filePath) => {
const fs = require("fs");
const FormData = require("form-data"); // npm install form-data
const form = new FormData();
// Добавляем текст сообщения
form.append("payload_json", JSON.stringify({
content: "Вот лог-файл с ошибками:"
}));
// Добавляем файл
form.append("file", fs.createReadStream(filePath));
const response = await fetch(webhookUrl, {
method: "POST",
body: form
});
if (response.ok) {
console.log("Файл отправлен!");
}
};
sendFile("./error.log");
В браузере можно отправить файл из <input type="file">:
const sendFileFromInput = async (fileInput) => {
const formData = new FormData();
formData.append("payload_json", JSON.stringify({
content: "Файл загружен пользователем"
}));
formData.append("file", fileInput.files[0]);
await fetch(webhookUrl, {
method: "POST",
body: formData
});
};
// Использование
const input = document.querySelector("#file-input");
input.addEventListener("change", () => sendFileFromInput(input));
Обработка ошибок и rate limits
Discord ограничивает количество запросов к webhook. При превышении лимита вы получите статус 429:
const sendWithRetry = async (payload, maxRetries = 3) => {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
if (response.ok) {
return true;
}
if (response.status === 429) {
const data = await response.json();
const retryAfter = data.retry_after || 1;
console.log(`Rate limit. Повтор через ${retryAfter}с...`);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
console.error(`Ошибка ${response.status}:`, await response.text());
return false;
}
console.error("Превышено количество попыток");
return false;
};
// Использование
sendWithRetry({
content: "Сообщение с автоматическим повтором при rate limit"
});
Класс-обёртка для Webhook
Для удобства можно создать класс:
class DiscordWebhook {
constructor(url) {
this.url = url;
}
async send(content, options = {}) {
const payload = {
content,
username: options.username,
avatar_url: options.avatarUrl,
embeds: options.embeds
};
const response = await fetch(this.url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
if (!response.ok) {
throw new Error(`Webhook error: ${response.status}`);
}
return response;
}
async sendEmbed(embed) {
return this.send(null, { embeds: [embed] });
}
async sendError(error) {
const embed = {
title: "Ошибка в приложении",
description: error.message,
color: 15548997, // Красный
fields: [
{
name: "Stack trace",
value: `\`\`\`${error.stack?.slice(0, 1000) || "N/A"}\`\`\``,
inline: false
}
],
timestamp: new Date().toISOString()
};
return this.sendEmbed(embed);
}
}
// Использование
const webhook = new DiscordWebhook("https://discord.com/api/webhooks/YOUR_WEBHOOK_URL");
webhook.send("Простое сообщение");
webhook.sendEmbed({
title: "Статус сервера",
description: "Всё работает",
color: 5763719
});
// Отправка ошибки
try {
throw new Error("Что-то пошло не так");
} catch (error) {
webhook.sendError(error);
}
Интеграция с Express.js
Пример отправки уведомлений из Express-приложения:
const express = require("express");
const app = express();
app.use(express.json());
const webhookUrl = process.env.DISCORD_WEBHOOK_URL;
app.post("/api/contact", async (req, res) => {
const { name, email, message } = req.body;
// Отправляем данные формы в Discord
const embed = {
title: "Новое сообщение с сайта",
color: 5793266,
fields: [
{ name: "Имя", value: name, inline: true },
{ name: "Email", value: email, inline: true },
{ name: "Сообщение", value: message, inline: false }
],
timestamp: new Date().toISOString()
};
try {
await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ embeds: [embed] })
});
res.json({ success: true });
} catch (error) {
console.error("Ошибка отправки webhook:", error);
res.status(500).json({ error: "Не удалось отправить сообщение" });
}
});
app.listen(3000, () => {
console.log("Сервер запущен на порту 3000");
});
Логирование ошибок в Discord
Автоматическая отправка ошибок в Discord:
const logErrorToDiscord = async (error, context = {}) => {
const embed = {
title: "Критическая ошибка",
description: error.message,
color: 15548997,
fields: [
{
name: "Тип ошибки",
value: error.name,
inline: true
},
{
name: "Окружение",
value: process.env.NODE_ENV || "development",
inline: true
},
{
name: "Stack trace",
value: `\`\`\`${error.stack?.slice(0, 1000)}\`\`\``,
inline: false
}
],
timestamp: new Date().toISOString()
};
// Добавляем контекст
if (Object.keys(context).length > 0) {
embed.fields.push({
name: "Контекст",
value: `\`\`\`json\n${JSON.stringify(context, null, 2).slice(0, 1000)}\n\`\`\``,
inline: false
});
}
await fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ embeds: [embed] })
});
};
// Глобальный обработчик ошибок
process.on("uncaughtException", (error) => {
logErrorToDiscord(error, { type: "uncaughtException" });
});
process.on("unhandledRejection", (reason, promise) => {
logErrorToDiscord(new Error(String(reason)), {
type: "unhandledRejection",
promise: String(promise)
});
});
Использование переменных окружения
Никогда не храните URL вебхука в коде. Используйте .env:
# .env
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/1234567890/abcdefghijklmnop
// Node.js с dotenv
require("dotenv").config();
const webhookUrl = process.env.DISCORD_WEBHOOK_URL;
if (!webhookUrl) {
throw new Error("DISCORD_WEBHOOK_URL не задан в .env");
}
Для фронтенда используйте серверный endpoint, чтобы не раскрывать URL клиенту.
Лимиты Discord API
- 5 запросов за 2 секунды на один webhook
- 30 запросов за 60 секунд на один канал
- Максимальный размер сообщения: 2000 символов
- Максимальный размер embed: 6000 символов (все поля вместе)
- Максимум embeds в сообщении: 10
- Максимальный размер файла: 25 МБ (или 500 МБ с Nitro)
При превышении лимитов Discord вернёт 429 Too Many Requests с полем retry_after.
Что дальше
Теперь вы можете интегрировать Discord webhook в любое JavaScript-приложение — от простых уведомлений до сложных систем мониторинга и логирования. Также рассмотрите возможности отложенных сообщений для планирования отправки и опросов для сбора обратной связи.
Попробуйте визуально в нашем бесплатном конструкторе Discord Webhook — создавайте embed-сообщения с предпросмотром, а затем экспортируйте JSON для использования в вашем коде.
Помимо кода, discord-webhook.com предлагает визуальный конструктор с такими функциями как отложенные сообщения, поддержка тредов и форумов, опросы и интерактивные кнопки с действиями — всё без написания кода.
Похожие статьи
- Как отправить Discord Webhook с помощью Python — Практическое руководство по отправке webhook на Python с библиотекой requests
- Полное руководство по Discord Embed: поля, цвета, изображения, лимиты — Структура embed-сообщений и форматирование контента
- Отправка уведомлений в Discord из GitHub Actions — Интеграция webhook с CI/CD пайплайнами
- Конструктор опросов Discord Webhook — Создание опросов через webhook на JavaScript и визуально
- Отложенные сообщения Discord Webhook — Планирование отправки сообщений по расписанию
- Треды и форумы Discord Webhook — Отправка webhook-сообщений в треды и форумы
Попробуйте в нашем инструменте
Открыть конструктор Discord Webhook