Отправка Discord Webhook из JavaScript и Node.js
Как отправлять сообщения в Discord через webhook на JavaScript: fetch API, Node.js, embed-сообщения, файлы и обработка ошибок с примерами кода.
🇬🇧 Доступно также на English
Зачем использовать 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
- Максимальный размер файла: 10 МБ (или 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