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

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

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

javascriptnodejswebhookтуториалjavascript discord 2026fetch apidiscord бот javascript
Отправка 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
  • Максимальный размер файла: 25 МБ (или 500 МБ с Nitro)

При превышении лимитов Discord вернёт 429 Too Many Requests с полем retry_after.

Что дальше

Теперь вы можете интегрировать Discord webhook в любое JavaScript-приложение — от простых уведомлений до сложных систем мониторинга и логирования. Также рассмотрите возможности отложенных сообщений для планирования отправки и опросов для сбора обратной связи.

Попробуйте визуально в нашем бесплатном конструкторе Discord Webhook — создавайте embed-сообщения с предпросмотром, а затем экспортируйте JSON для использования в вашем коде.

Помимо кода, discord-webhook.com предлагает визуальный конструктор с такими функциями как отложенные сообщения, поддержка тредов и форумов, опросы и интерактивные кнопки с действиями — всё без написания кода.

Похожие статьи

Попробуйте в нашем инструменте

Открыть конструктор Discord Webhook