Как создать и использовать Discord Webhook
Discord Webhook — это специальный URL-адрес, позволяющий отправлять сообщения в текстовый канал сервера напрямую из внешних приложений, скриптов или сервисов без необходимости писать полноценного бота. Чтобы начать работу, создайте вебхук в настройках канала, скопируйте его URL и отправьте POST-запрос с JSON-данными на этот адрес.
Этот инструмент идеален для автоматических уведомлений: отчеты о сборке кода (CI/CD), алерты мониторинга, заявки с сайта или логи ошибок.
Оглавление
Что такое Webhook и зачем он нужен
Webhook (вебхук) действует как «односторонний мост» между вашим кодом и Discord. В отличие от бота, вебхук не может читать сообщения, реагировать на команды или находиться в голосовых каналах. Его единственная задача — публиковать контент.
Основные сценарии использования:
- DevOps: Уведомления об успешном или неудачном деплое из GitHub Actions/GitLab CI.
- Мониторинг: Мгновенные алерты в канал
#alerts, если сервер упал или нагрузка превысила норму. - Бизнес: Получение лидов с форм обратной связи сайта прямо в канал продаж.
- Игры: Интеграция статистики игровых серверов.
Пошаговое создание вебхука
Создание выполняется через интерфейс Discord (Desktop или Web-версия).
- Наведите курсор на нужный текстовый канал в списке слева.
- Нажмите на шестеренку «Настройки канала» (Edit Channel).
- В меню слева выберите раздел «Интеграции» (Integrations) → «Вебхуки» (Webhooks).
- Примечание: В старых версиях интерфейса пункт может называться просто «Webhooks».
- Нажмите кнопку «Создать вебхук» (New Webhook).
- Настройте внешний вид:
- Имя: От кого будет приходить сообщение (например,
Deploy Bot). - Аватар: Загрузите изображение (логотип проекта или иконку сервиса).
- Канал: Выберите, куда именно отправлять сообщения.
- Имя: От кого будет приходить сообщение (например,
- Нажмите «Копировать URL вебхука» (Copy Webhook URL).
- Нажмите «Сохранить изменения».
Безопасность прежде всего! URL вебхука содержит секретный токен. Любой, кто владеет этой ссылкой, может отправлять сообщения в ваш канал. Никогда не выкладывайте URL в публичные репозитории GitHub или открытые чаты.
Формат запроса и отправка сообщений
Для отправки сообщения необходимо выполнить HTTP-запрос методом POST на скопированный URL.
Требования к запросу:
- Header:
Content-Type: application/json - Body: JSON-объект с данными сообщения.
Минимальная структура JSON для простого текста:
{
"content": "Текст вашего сообщения"
}
Примеры кода: cURL, Python, JavaScript
1. Отправка через cURL (терминал)
Универсальный способ для быстрой проверки работоспособности.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"content": "✅ Тестовое сообщение успешно доставлено!"}' \
https://discord.com/api/webhooks/ВАШ_ID/ВАШ_ТОКЕН
2. Отправка через Python (библиотека requests)
Наиболее популярный вариант для бэкенда и скриптов автоматизации.
import requests
import json
webhook_url = "https://discord.com/api/webhooks/ВАШ_ID/ВАШ_ТОКЕН"
# Данные сообщения
data = {
"content": "🚀 Деплой завершен успешно!",
"username": "CI Bot" # Можно переопределить имя прямо в запросе
}
try:
response = requests.post(webhook_url, json=data)
if response.status_code == 204:
print("Сообщение отправлено.")
else:
print(f"Ошибка: {response.status_code}")
except Exception as e:
print(f"Не удалось отправить: {e}")
3. Отправка через Node.js (fetch)
Для современных JS-приложений.
const webhookUrl = "https://discord.com/api/webhooks/ВАШ_ID/ВАШ_ТОКЕН";
const message = {
content: "🔥 Новая заявка с сайта!",
embeds: [{
title: "Контактные данные",
description: "Пользователь оставил заявку на консультацию.",
color: 5814783
}]
};
fetch(webhookUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(message)
})
.then(res => console.log("Отправлено"))
.catch(err => console.error("Ошибка:", err));
Расширенные сообщения (Embeds)
Обычный текст (content) ограничен 2000 символами и выглядит просто. Для красивых уведомлений используйте Embeds (встраиваемые блоки). Они позволяют добавлять заголовки, цвета, поля и футеры.
Структура Embed
{
"content": "Внимание! Критическая ошибка.",
"embeds": [
{
"title": "Ошибка базы данных",
"description": "Не удалось подключиться к основному кластеру.",
"color": 15158332,
"fields": [
{
"name": "Сервер",
"value": "db-primary-01",
"inline": true
},
{
"name": "Код ошибки",
"value": "`CONN_REFUSED`",
"inline": true
}
],
"footer": {
"text": "Monitoring System v2.0"
},
"timestamp": "2026-04-26T10:00:00.000Z"
}
]
}
Ключевые параметры:
color: Число (десятичное представление HEX-цвета). Например,15158332— это красный#E74C3C.fields: Массив объектов с полямиnameиvalue. Параметрinline: trueвыстраивает поля в одну строку (до 3 штук).timestamp: Время в формате ISO 8601. Отображается в подвале карточки.
Вы можете отправлять до 10 embeds в одном сообщении, но обычно одного хорошо оформленного блока достаточно для читаемости.
Частые ошибки и безопасность
При интеграции вебхуков разработчики часто сталкиваются со следующими проблемами:
| Ошибка | Причина | Решение |
|---|---|---|
| 400 Bad Request | Неверный формат JSON или отсутствие заголовка Content-Type. | Проверьте синтаксис JSON и убедитесь, что заголовок передается. |
| 404 Not Found | Неверный URL вебхука или он был удален. | Пересоздайте вебхук и обновите URL в коде. |
| 429 Too Many Requests | Превышен лимит отправок (рейт-лимит). | Discord ограничивает частоту запросов (обычно 5 запросов в 2 секунды на один вебхук). Добавьте задержку в код. |
| Сообщение не приходит | Блокировка фаерволом или ошибкой в коде. | Проверьте логи приложения и попробуйте отправить запрос через Postman/cURL локально. |
Рекомендации по безопасности
- Храните URL в переменных окружения. Используйте
.envфайлы или секреты CI/CD (GitHub Secrets, GitLab Variables). - Регулярно ротируйте ключи. Если есть подозрение, что ссылка утекла, удалите старый вебхук и создайте новый. Старая ссылка перестанет работать мгновенно.
- Ограничьте права. Вебхук может только писать. Он не имеет доступа к истории сообщений или списку участников, что делает его безопаснее полноценного бота с точки зрения утечки данных.
FAQ
Можно ли изменить имя отправителя в коде?
Да, передав поле "username": "Новое Имя" в JSON-теле запроса. Однако, если в настройках вебхука задано имя, оно может перезаписываться или игнорироваться в зависимости от контекста. Лучше задавать имя один раз в настройках канала.
Есть ли лимит на длину сообщения?
Да, поле content ограничено 2000 символами. Поле description внутри embed — 4096 символами. Если текст длиннее, его нужно разбивать на несколько запросов.
Работают ли вебхуки в личных сообщениях (DM)? Нет. Вебхуки работают только на серверах (гильдиях) в текстовых каналах. Отправить сообщение пользователю в личку через вебхук невозможно.
Как удалить вебхук? Зайдите в настройки канала → Интеграции → Вебхуки, нажмите на значок корзины рядом с нужным вебхуком и подтвердите удаление.