Гид по технологиям

Как отправлять сообщения в Slack из bash-скрипта

6 min read Интеграции Slack Обновлено 22 Dec 2025
Отправка сообщений в Slack из bash
Отправка сообщений в Slack из bash

Коротко о смысле

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

How to Send a Message to Slack From a Bash Script

Быстрые ссылки

  • Использовать 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 для приёма вебхуков

  1. Зайдите в Slack API (https://api.slack.com/apps) и создайте новый приложение.
  2. Дайте имя приложению и выберите воркспейс, в котором оно будет использоваться.
  3. На странице приложения найдите раздел Incoming Webhooks и включите его.

Страница Slack App с настройками Incoming Webhooks

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

Кнопка добавления нового вебхука

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

Авторизация приложения и выбор канала

  1. Протестируйте с curl:
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' YOUR_WEBHOOK_URL

Если всё верно — сообщение появится в канале и вы получите уведомление.

Форматированные сообщения и вложения

Пример форматированного сообщения Slack

Сообщения 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: инцидент и откат

  1. При обнаружении ошибки скрипт отправляет экстренное сообщение в канал #incidents.
  2. Участники реагируют, назначается ответственный.
  3. Если требуется срочный откат — задокументировать шаги и уведомить через Slack.
  4. По завершении инцидента отправить итоговое сообщение в канал с пометкой “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.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Изоляция голоса на iPhone — инструкция
iPhone

Изоляция голоса на iPhone — инструкция

Как безопасно стереть данные перед утилизацией
Безопасность данных

Как безопасно стереть данные перед утилизацией

Как вернуть меню «Пуск» в Windows 8 и 8.1
Windows

Как вернуть меню «Пуск» в Windows 8 и 8.1

Клонировать и запустить Angular‑проект локально
Angular

Клонировать и запустить Angular‑проект локально

Рисование в Microsoft OneNote: Windows 10 и Mac
Руководство

Рисование в Microsoft OneNote: Windows 10 и Mac

Git и Open Source: как начать вносить вклад
Разработка

Git и Open Source: как начать вносить вклад