Перейти к содержимому

Тестер Discord Webhook: проверка URL и тестовое сообщение

Как протестировать Discord webhook: проверка URL через GET, тестовое сообщение через curl и онлайн-конструктор, коды ответов 400/404/429 и замена утёкшего URL.

7 мин чтения Доступно также на English
На этой странице

У вас есть URL вебхука и payload, который «должен работать». Прежде чем встраивать его в CI, скрипт мониторинга или бота, прогоните короткий цикл проверки: убедитесь, что URL живой, отправьте одно видимое сообщение и посмотрите точный код ответа и тело, которое вернул Discord. Эта статья — как раз такой цикл: сначала через curl (работает везде), потом через онлайн-конструктор, если не хочется открывать терминал. В конце — ошибки, с которыми вы реально столкнётесь, и что делать, если URL утёк.

Во всех примерах замените https://discord.com/api/webhooks/ID/TOKEN на свой URL. Если вебхука ещё нет — см. как получить URL вебхука Discord.

Шаг 1. Проверьте URL, ничего не отправляя

URL вебхука состоит из двух частей: числового id и token. Обычный GET-запрос по этому адресу просит Discord описать вебхук. Сообщение при этом не публикуется, поэтому это самая безопасная первая проверка:

curl -s https://discord.com/api/webhooks/ID/TOKEN

Если URL верный, придёт HTTP 200 и объект вебхука:

{
  "type": 1,
  "id": "1234567890123456789",
  "name": "Deploy Notifier",
  "avatar": null,
  "channel_id": "9876543210987654321",
  "guild_id": "1122334455667788990",
  "application_id": null,
  "token": "abc…"
}

Для тестирования важны три поля. name подтверждает, что вы взяли нужный вебхук. channel_id показывает, куда полетят сообщения, — если это не тот канал, остановитесь здесь. type: 1 означает входящий вебхук, то есть тот, который можно вызвать по URL.

Если URL неверный, обрезан или вебхук удалён, ответ будет 404 с JSON-телом:

{ "message": "Unknown Webhook", "code": 10015 }

Не хватает ли одного символа в токене или вебхук удалили целиком — лечится одинаково: перед любой другой отладкой заново скопируйте URL из «Настройки сервера → Интеграции → Вебхуки».

URL можно вставить и в адресную строку браузера: браузер отправит GET, и вы увидите тот же JSON без побочных эффектов. Только не вставляйте его никуда публично — в ответе есть токен, а сам URL и есть секрет.

Шаг 2. Отправьте тестовое сообщение через curl

Когда GET вернул 200, отправьте минимально возможное сообщение. Флаг -i заставит curl вывести строку статуса и заголовки вместе с телом:

curl -i -X POST https://discord.com/api/webhooks/ID/TOKEN \
  -H "Content-Type: application/json" \
  -d '{"content": "Тест вебхука, не обращайте внимания"}'

Успех — это 204 No Content с пустым телом. По умолчанию Discord не возвращает созданное сообщение: для smoke-теста этого достаточно, но бесполезно, если хочется посмотреть, что именно создалось. Добавьте ?wait=true, чтобы получить объект сообщения:

curl -s -X POST "https://discord.com/api/webhooks/ID/TOKEN?wait=true" \
  -H "Content-Type: application/json" \
  -d '{"content": "Тест вебхука с wait=true"}'

Теперь ответ — 200 с JSON, где есть id сообщения, channel_id, куда оно ушло, и итоговый content. Сохраните этот id: он нужен, чтобы потом отредактировать или удалить тестовое сообщение через PATCH или DELETE на /messages/{message_id} (см. редактирование и удаление сообщений вебхука).

В Windows запускайте те же команды в PowerShell как curl.exe (в Windows PowerShell 5.1 просто curl — алиас Invoke-WebRequest) или используйте нативный способ из статьи Discord webhook в PowerShell.

Скрипт-тестер на каждый день

Скрипт делает оба шага и печатает только нужное: код ответа, а при ошибке ещё и тело. Ему нужны curl и jq.

#!/usr/bin/env bash
# запуск: ./webhook-test.sh "https://discord.com/api/webhooks/ID/TOKEN"
set -u
URL="$1"

echo "== GET (сообщение не отправляется)"
code=$(curl -s -o /tmp/wh.json -w "%{http_code}" "$URL")
echo "статус: $code"
if [ "$code" != "200" ]; then cat /tmp/wh.json; echo; exit 1; fi
echo "name: $(jq -r .name /tmp/wh.json), channel_id: $(jq -r .channel_id /tmp/wh.json)"

echo "== POST тестового сообщения"
code=$(curl -s -o /tmp/wh.json -w "%{http_code}" \
  -H "Content-Type: application/json" \
  -d '{"content": "✅ тест вебхука", "allowed_mentions": {"parse": []}}' \
  "$URL?wait=true")
echo "статус: $code"
[ "$code" = "200" ] && echo "id сообщения: $(jq -r .id /tmp/wh.json)" || cat /tmp/wh.json

allowed_mentions: {"parse": []} стоит не случайно: даже если в тестовой строке окажется @everyone, никто не получит пинг.

Шаг 3. Проверка онлайн, без кода

Когда нужно проверить целый embed, загрузку файла или контейнер Components V2, curl становится утомительным. Визуальный конструктор на discord-webhook.com выполняет тот же цикл из браузера: вставляете URL, собираете сообщение с живым предпросмотром, нажимаете «Отправить» и смотрите в канал. Он же экспортирует payload в JSON или в код для discord.js / discord.py, так что в проект попадает ровно то сообщение, которое вы протестировали. Регистрация не нужна.

Читаем коды ответов

Всё, что Discord сообщает о запросе к вебхуку, — в коде статуса и JSON-теле. Запомните эти пять:

СтатусЧто значитЧто делать
204 No ContentСообщение отправлено (обычный POST)Ничего; проверьте канал
200 OKСообщение отправлено и возвращено (?wait=true) либо это объект вебхука (GET)Сохраните id сообщения, если он нужен
400 Bad RequestJSON невалиден или поле нарушает лимитПрочитайте errors в теле; исправьте названное поле
404, code 10015Unknown Webhook: неверный id/token или вебхук удалёнСкопируйте URL заново или пересоздайте вебхук
401, code 50027Invalid Webhook Token: id существует, но токен неверныйСкопируйте полный URL заново
429 Too Many RequestsПревышен лимит запросовПодождите retry_after секунд и повторите

Тело ответа 400 называет точный путь к проблемному полю. Описание embed длиннее 4096 символов даёт ошибку по пути embeds.0.description, username со словом «discord» отклоняется по пути username, а тело без content, embeds, файлов, опроса и компонентов возвращается как «Cannot send an empty message». Полный разбор — в статье ошибки Discord webhook.

Печатайте тело на каждый ответ не из 2xx. Удивительно большая часть «вебхук не работает» оказывается ошибкой 400, которую никто не прочитал.

Проверьте embed до отправки в прод

Обычный текст скрывает большинство проблем с лимитами. Тестируйте ту форму, которую реально будете отправлять. Этот embed задействует поля, в которых ошибаются чаще всего: цвет как десятичное число, timestamp в ISO 8601, inline-поля.

curl -s -w "\nHTTP %{http_code}\n" \
  -X POST "https://discord.com/api/webhooks/ID/TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "Deploy Bot",
    "embeds": [{
      "title": "Тестовый деплой",
      "description": "Сборка **#128** прошла",
      "color": 5793266,
      "fields": [
        {"name": "Окружение", "value": "staging", "inline": true},
        {"name": "Время", "value": "42 с", "inline": true}
      ],
      "timestamp": "2026-09-17T10:00:00.000Z"
    }]
  }'

Ожидайте пустое тело и HTTP 204. Если пришёл 400, тело, напечатанное над строкой статуса, укажет на поле. Лимиты, на которых чаще всего спотыкаются тесты: 256 символов на заголовок, 4096 на описание, 25 полей в embed, 6000 символов суммарно на все embed одного сообщения, 10 embed в сообщении. color — число вроде 5793266, а не строка "#5865F2". URL картинок и превью должны быть публичными https-ссылками.

Чтобы проверить загрузку файла, переключитесь на multipart:

curl -s -w "\nHTTP %{http_code}\n" \
  -F 'payload_json={"content": "Лог во вложении"}' \
  -F "files[0]=@./app.log" \
  https://discord.com/api/webhooks/ID/TOKEN

Частые ошибки

{"message": "Unknown Webhook", "code": 10015} — неверный id или token, либо вебхук удалён. Типичные причины: вместе с URL скопировался перевод строки или кавычка, URL от другого сервера, коллега пересоздал вебхук. Запустите GET-проверку; если она не проходит, пересоздайте вебхук.

400 с "Cannot send an empty message" — в теле нет content, embeds, файлов, опроса или компонентов. Часто JSON валиден, но поле названо не так ("text" вместо "content") или оболочка исказила кавычки в аргументе -d.

400 с путём embeds.0.… — превышен лимит или неверный тип. Смотрите на число и путь к полю и чините именно это поле. Лимиты перечислены выше и в статье лимиты embed.

400 по полю username — переопределённое имя не может содержать «clyde» или «discord» (без учёта регистра) и ограничено 80 символами.

429 Too Many Requests — в теле есть retry_after в секундах. Подождите столько и повторите. Тестовые циклы, которые шлют сообщения в тесном for, ловят это быстро. Discord не публикует одного официального числа для лимитов вебхуков — перед настройкой retry-политики загляните в лимиты запросов вебхуков.

JSON без заголовка — без Content-Type: application/json curl помечает тело как application/x-www-form-urlencoded, Discord не разбирает его как JSON и отвечает 400. Всегда ставьте заголовок.

204, а в канале пусто — вы смотрите не в тот канал. channel_id из ответа на GET — источник истины. Если вы передали ?thread_id=…, сообщение ушло в этот тред.

Интерактивные компоненты игнорируются или отклоняются — обычный вебхук может отправлять только неинтерактивные компоненты (кнопки-ссылки, разметку Components V2) и только с ?with_components=true. Кнопкам, которые что-то делают, нужно приложение — см. интерактивные кнопки с действиями.

Сначала тестируйте в приватном канале

Вебхук пишет ровно в один канал, и все, кто видит этот канал, видят ваши тесты. Поэтому:

  1. Создайте приватный текстовый канал (#webhook-tests), который читаете только вы и те, кто отлаживает вместе с вами.
  2. Создайте вебхук в нём и прогоните весь цикл выше: GET, текст, embed, файл.
  3. Когда payload готов, либо создайте второй вебхук в боевом канале и замените URL в конфиге, либо переключите существующий вебхук на боевой канал в его настройках.

Тестовый канал не удаляйте: это самое дешёвое место, где потом можно воспроизвести падающий payload. И всегда отправляйте тесты с "allowed_mentions": {"parse": []}, чтобы случайный @everyone из скопированного шаблона никогда не пингнул весь сервер.

Замените утёкший URL

Токен — единственное, что отделяет интернет от вашего канала. Если URL попал в публичный чат, в репозиторий или в клиентский бандл, считайте его скомпрометированным:

  1. «Настройки сервера → Интеграции → Вебхуки» → откройте вебхук → Удалить. Старый URL сразу начинает возвращать Unknown Webhook.
  2. Создайте новый вебхук в том же канале и скопируйте новый URL.
  3. Обновите все места, где использовался старый: переменные окружения, секреты CI, .env-файлы, платформы автоматизации.
  4. Повторите GET-проверку с новым URL, затем одно тестовое сообщение.

Убедитесь, что ротация сработала и с другой стороны: GET по старому URL обязан вернуть 404. Полный чек-лист (хранение секретов, сканирование репозиториев, ограничение зоны поражения) — в статье безопасность Discord webhook.

FAQ

GET-запрос к URL вебхука отправляет сообщение?

Нет. GET возвращает объект вебхука (name, channel_id, guild_id, token) и ничего не публикует. Вебхук выполняет только POST.

Как протестировать Discord webhook онлайн без curl?

Откройте URL вебхука в браузере, чтобы проверить его (это GET), а тестовое сообщение соберите и отправьте из онлайн-конструктора из шага 3 — с живым предпросмотром, без регистрации и без кода.

Почему приходит 204, а сообщения не видно?

204 означает, что Discord принял сообщение. Оно ушло в канал из channel_id в ответе на GET или в тред, который вы передали через ?thread_id. Проверьте этот канал и настройку канала у вебхука.

Как быстрее всего понять, что URL вебхука ещё действует?

Отправьте GET-запрос. 200 с JSON-объектом вебхука — работает; 404 с "code": 10015 — URL неверный или вебхук удалён.

Что дальше

Цикл проверки короткий: GET для валидации, один POST для подтверждения, чтение статуса и тела на всё, что не 2xx. Делайте это в приватном канале и меняйте URL сразу, как только он утёк. Если не хочется работать в терминале, конструктор Discord Webhook выполняет тот же цикл с живым предпросмотром и экспортирует проверенный payload в JSON или код.

Смотрите также: ошибки Discord webhook, как получить URL вебхука Discord, безопасность Discord webhook.

Теги: тестер discord webhookпроверить discord webhookтестовое сообщение webhookcurlотладкаошибки webhookdiscord webhookвебхук discord

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

Все статьи

Соберите это в визуальном редакторе

Embed, Components V2, кнопки и опросы с живым предпросмотром Discord. Бесплатно, без регистрации.