Тестер Discord Webhook: проверка URL и тестовое сообщение
Как протестировать Discord webhook: проверка URL через GET, тестовое сообщение через curl и онлайн-конструктор, коды ответов 400/404/429 и замена утёкшего URL.
На этой странице
- Шаг 1. Проверьте URL, ничего не отправляя
- Шаг 2. Отправьте тестовое сообщение через curl
- Скрипт-тестер на каждый день
- Шаг 3. Проверка онлайн, без кода
- Читаем коды ответов
- Проверьте embed до отправки в прод
- Частые ошибки
- Сначала тестируйте в приватном канале
- Замените утёкший URL
- FAQ
- GET-запрос к URL вебхука отправляет сообщение?
- Как протестировать Discord webhook онлайн без curl?
- Почему приходит 204, а сообщения не видно?
- Как быстрее всего понять, что URL вебхука ещё действует?
- Что дальше
У вас есть 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 Request | JSON невалиден или поле нарушает лимит | Прочитайте errors в теле; исправьте названное поле |
404, code 10015 | Unknown Webhook: неверный id/token или вебхук удалён | Скопируйте URL заново или пересоздайте вебхук |
401, code 50027 | Invalid 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. Кнопкам, которые что-то делают, нужно приложение — см. интерактивные кнопки с действиями.
Сначала тестируйте в приватном канале
Вебхук пишет ровно в один канал, и все, кто видит этот канал, видят ваши тесты. Поэтому:
- Создайте приватный текстовый канал (
#webhook-tests), который читаете только вы и те, кто отлаживает вместе с вами. - Создайте вебхук в нём и прогоните весь цикл выше: GET, текст, embed, файл.
- Когда payload готов, либо создайте второй вебхук в боевом канале и замените URL в конфиге, либо переключите существующий вебхук на боевой канал в его настройках.
Тестовый канал не удаляйте: это самое дешёвое место, где потом можно воспроизвести падающий payload. И всегда отправляйте тесты с "allowed_mentions": {"parse": []}, чтобы случайный @everyone из скопированного шаблона никогда не пингнул весь сервер.
Замените утёкший URL
Токен — единственное, что отделяет интернет от вашего канала. Если URL попал в публичный чат, в репозиторий или в клиентский бандл, считайте его скомпрометированным:
- «Настройки сервера → Интеграции → Вебхуки» → откройте вебхук → Удалить. Старый URL сразу начинает возвращать
Unknown Webhook. - Создайте новый вебхук в том же канале и скопируйте новый URL.
- Обновите все места, где использовался старый: переменные окружения, секреты CI,
.env-файлы, платформы автоматизации. - Повторите 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.