Как отправлять сообщения в Slack из bash-скрипта
Коротко о смысле
Интеграция через вебхуки превращает Slack в центр уведомлений для командной строки. Это удобно для оповещений о событиях (сборках, деплоях, ошибках), кратких сводок и простых двунаправленных интеграций, где сообщения отправляет бот.

Быстрые ссылки
- Использовать Slack-бот через вебхуки
- Настроить Slack App для приёма вебхуков
- Форматированные сообщения и вложения (Attachments)
Зачем использовать вебхуки
Webhook — это просто HTTPS-адрес, на который можно отправлять POST-запросы с телом в формате JSON. По сравнению с полным OAuth-потоком и chat.postMessage, входящие вебхуки:
- проще в настройке;
- не требуют токена для пользователя;
- подходят для уведомлений и автоматических сообщений от бота.
Важно: сообщения от вебхука приходят от бота (не от вашей учётной записи), поэтому вы и другие пользователи будете получать нормальные push-уведомления.
Использовать Slack-бота через вебхуки
Slack предоставляет HTTP API, доступное через POST и GET. На Unix-системах для отправки HTTP-запросов удобно использовать curl.
Простой JSON для сообщения выглядит так:
{"text":"Hello, World!"}Пример однострочного curl-запроса (скопируйте и замените YOUR_WEBHOOK_URL):
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URLЭтот запрос отправит сообщение “Hello, World!” в канал, указанный при создании вебхука.
Настройка Slack App для приёма вебхуков
- Зайдите в Slack API (https://api.slack.com/apps) и создайте новый приложение.
- Дайте имя приложению и выберите воркспейс, в котором оно будет использоваться.
- На странице приложения найдите раздел Incoming Webhooks и включите его.

- Нажмите “Add New Webhook to Workspace” и выберите канал для сообщений.

- Разрешите приложению доступ к выбранному каналу и скопируйте URL вебхука.

- Протестируйте с curl:
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URLЕсли всё верно — сообщение появится в канале и вы получите уведомление.
Форматированные сообщения и вложения

Сообщения Slack поддерживают базовое форматирование (жирный, курсив, списки), а для сложного оформления используются Blocks (Block Kit) и старые Attachments. Примечания:
- Для упоминаний пользователей и каналов нужно использовать ID (например, <@U12345>) — простые имена не сработают.
- Для интерактивных элементов (кнопки, меню) используйте Block Kit и указывайте URL-обработчики для действий.
- Block Kit Builder помогает визуально собрать JSON и сразу скопировать его.
Пример блока с простым текстом (часть JSON):
{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"*Сборка завершена* — всё прошло успешно"}}]}Примеры готовых bash-утилит и шаблонов
Ниже несколько проверенных шаблонов, которые можно вставить в свои скрипты.
Функция отправки простого текста (используйте export SLACK_WEBHOOK_URL заранее):
send_slack_text() {
local text="$1"
if [ -z "$SLACK_WEBHOOK_URL" ]; then
echo "SLACK_WEBHOOK_URL не задан" >&2
return 1
fi
curl -s -X POST -H 'Content-type: application/json' --data "{\"text\": \"${text}\"}" "$SLACK_WEBHOOK_URL"
}Функция с поддержкой блока Block Kit (передавайте уже готовый JSON-блок в переменной):
send_slack_block() {
local json_block="$1"
if [ -z "$SLACK_WEBHOOK_URL" ]; then
echo "SLACK_WEBHOOK_URL не задан" >&2
return 1
fi
curl -s -X POST -H 'Content-type: application/json' --data "$json_block" "$SLACK_WEBHOOK_URL"
}Пример использования с jq для безопасного конструирования JSON (рекомендуется при подстановке переменных):
payload=$(jq -n --arg txt "$(printf "%s" "Сборка завершена: $BUILD_ID")" '{text:$txt}')
curl -s -X POST -H 'Content-type: application/json' --data "$payload" "$SLACK_WEBHOOK_URL"Совет по безопасности: не храните SLACK_WEBHOOK_URL в публичных репозиториях. Используйте переменные окружения CI-платформы или секретный стор.
Образцы сценариев: уведомление после деплоя
Пример простого сценария в CI, который уведомляет о результате деплоя:
if deploy_success; then
send_slack_text "Deploy в production завершён: $CI_COMMIT_SHORT_SHA — ✅"
else
send_slack_text "Deploy в production не удался: $CI_COMMIT_SHORT_SHA — ❌"
fiКогда такой подход не подходит (контрпример)
- Нужна глубокая интеграция с пользовательскими сессиями и правами — используйте chat.postMessage с OAuth и scopes.
- Требуется высокая частота сообщений (миллисекундные события) — лучше агрегировать и батчить сообщения, чтобы не создавать шум.
- Нужны транзакционные сообщения, которые должны быть видимы только одному пользователю и от его имени — используйте API с авторизацией от имени пользователя.
Альтернативные подходы
- chat.postMessage + OAuth 2.0 (более гибко, но сложнее в настройке).
- Slack SDK (Python/Node/Go) для удобной работы и повторной логики.
- Сервисы-автоматизации (Zapier, Make) для интеграций без кода.
Отладка и типичные ошибки
Important: не публикуйте URL вебхука. Он даёт возможность отправлять сообщения в ваш канал.
Проблемы и решения:
- Пустой ответ или 4xx: проверьте корректность URL и права приложения.
- Неправильный JSON: curl возвращает ошибку — валидируйте JSON с jq или jsonlint.
- Упоминания не работают: используйте ID пользователя/канала, а не имена.
- Сообщения не отображаются: проверьте, не удалён ли бот из канала.
Критерии приёмки
- Сообщение появляется в целевом канале в течение 10 секунд после вызова curl.
- Сообщение содержит корректную информацию (шаблон и переменные).
- Webhook-URL не хранится в открытом коде репозитория.
Роль-ориентированные чеклисты
Для разработчика:
- Создать Slack App и включить Incoming Webhooks.
- Тестировать отправку локально через curl.
- Использовать jq для составления JSON.
Для SRE/DevOps:
- Настроить переменные окружения в CI (секреты).
- Добавить логирование ответов Slack API и коды ошибок.
- Батчить уведомления при высоком объёме событий.
Для менеджера продукта:
- Определить шаблоны уведомлений и получателей.
- Проверить, что уведомления не создают лишнего шума.
Playbook: инцидент и откат
- При обнаружении ошибки скрипт отправляет экстренное сообщение в канал #incidents.
- Участники реагируют, назначается ответственный.
- Если требуется срочный откат — задокументировать шаги и уведомить через Slack.
- По завершении инцидента отправить итоговое сообщение в канал с пометкой “resolved”.
Критерии успешного оповещения: сообщение отправлено, назначен ответственный, шаги исправления зафиксированы.
Тестовые случаи и приёмка
- Отправить простое сообщение → должно прийти в канал.
- Отправить форматированный блок → блок отображается корректно.
- Указать некорректный URL → получить ответ 404/403 и лог ошибки.
Шаблоны и чек-листы (копировать в проекты)
Шаблон сообщения о билде:
{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"*Build*: $BUILD_ID\n*Status*: $STATUS\n*Branch*: $BRANCH"}}]}Шаблон уведомления об ошибке:
{"text":"Ошибка: $ERROR_MSG\nФайл: $FILE\nВремя: $TIMESTAMP"}Безопасность и конфиденциальность
- Не храните webhook URL в публичных репозиториях.
- Ограничьте доступ к Channels, куда может постить бот.
- Для чувствительных сообщений рассмотрите шифрование содержимого или передачу уведомления с минимальным набором данных.
Модель принятия решений (Mermaid)
graph TD
A[Нужно уведомление?] -->|Да| B{Требуется интерактивность}
B -->|Нет| C[Incoming Webhook]
B -->|Да| D[chat.postMessage / SDK]
A -->|Нет| E[Не отправлять]Советы по масштабированию
- Группируйте похожие уведомления (батчи) и отправляйте агрегированные отчёты.
- Добавьте дедупликацию (чтобы не спамить одинаковыми сообщениями при повторных ошибках).
- Логируйте ответы Slack API и отслеживайте ошибки 429/5xx для введения ретраев.
Часто задаваемые вопросы
Как упомянуть пользователя через вебхук?
Используйте формат <@USERID>, где USERID — это ID пользователя в Slack. Имена в виде @ivan работать не будут.
Можно ли использовать один вебхук для нескольких каналов?
Нет: каждый вебхук привязан к конкретному каналу. Для разных каналов регистрируйте отдельные вебхуки.
Что лучше — Incoming Webhooks или chat.postMessage?
Incoming Webhooks проще и быстрее настраивать для уведомлений. chat.postMessage даёт больше гибкости (действия от имени пользователей, более тонкие права), но требует OAuth и scopes.
Итог
Использование входящих вебхуков — это простой и надёжный способ отправлять уведомления из bash-скриптов и автоматизации. Он подходит для большинства задач оповещений, требует минимум настроек и легко интегрируется в CI/CD и локальные утилиты.
Summary:
- Создайте Slack App и включите Incoming Webhooks.
- Скопируйте URL вебхука и храните его как секрет в CI.
- Используйте curl/jq или готовые функции для отправки текстов и блоков.
- Тестируйте, логируйте ответы и не публикуйте URL в открытом доступе.
Дополнительные ресурсы
- Block Kit Builder — визуальный редактор сообщений в Slack.
- Официальная документация Slack API — раздел Incoming Webhooks и Block Kit.
Похожие материалы
Изоляция голоса на iPhone — инструкция
Как безопасно стереть данные перед утилизацией
Как вернуть меню «Пуск» в Windows 8 и 8.1
Клонировать и запустить Angular‑проект локально
Рисование в Microsoft OneNote: Windows 10 и Mac