Перейти к содержимому
Все статьи
· Обновлено 17 июня 2026 г.

Отправка Discord Webhook из JavaScript и Node.js

Как отправлять сообщения в Discord через webhook на JavaScript: fetch API, Node.js, embed-сообщения, файлы и обработка ошибок с примерами кода.

javascriptnodejswebhookтуториалjavascript discord 2026fetch apidiscord бот javascript

🇬🇧 Доступно также на English

Отправка Discord Webhook из JavaScript и Node.js

Зачем использовать Discord Webhook в JavaScript?

Discord webhook позволяет отправлять сообщения в канал Discord из любого JavaScript-приложения — будь то фронтенд, Node.js сервер или serverless функция. Это идеальный способ для:

  • Уведомлений в реальном времени — алерты об ошибках, статусы деплоя
  • Интеграций — подключение внешних сервисов к Discord
  • Автоматизации — боты, мониторинг, логирование событий
  • Форм обратной связи — отправка данных из веб-форм в Discord

В отличие от полноценного бота, webhook не требует постоянного соединения или сложной авторизации — просто HTTP POST запрос.

Создание Webhook в Discord

  1. Откройте настройки канала Discord (шестерёнка рядом с названием)
  2. Перейдите в ИнтеграцииВебхуки
  3. Нажмите Новый вебхук
  4. Задайте имя и скопируйте 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