Slack уже захопив весь чат-простір вашої команди - хай тоді ще й скорочує посилання. Застосунок Elido для Slack робить дві речі: дає кожному учаснику slash-команду /shorten і направляє алерти про події зі посиланнями до обраних вами каналів. Встановлення займає близько 90 секунд. Жодного коду обробників webhook, жодного Bolt SDK, жодного ngrok-тунелю.
У цій статті розглянемо три складові: шлях slash-команди, матрицю маршрутизації алертів і механізм підпису HMAC, який не дає випадковим POST-запитам видавати себе за Slack. Якщо вас цікавить ширша webhook-поверхня, що живить ці алерти, у статті вебхуки для подій зі посиланнями задокументовано кожен payload, який надсилає Elido. Slack-застосунок є однією з готових інтеграцій, що обробляє ці події за вас.
Slash-команда /shorten
Користувач вводить це в будь-якому каналі:
/shorten https://blog.elido.app/post/launch-2026?utm_source=announce
Slack надсилає підписаний POST на https://api.elido.app/integrations/slack/commands. Тіло запиту має формат application/x-www-form-urlencoded (Slack досі використовує form-encoding для slash-команд, а не JSON - це дивує всіх уперше). Відповідні поля:
team_id=T01ABCD2EF
channel_id=C01234ABCDE
user_id=U01HJKLMNOP
command=/shorten
text=https://blog.elido.app/post/launch-2026?utm_source=announce
response_url=https://hooks.slack.com/commands/T01ABCD2EF/...
Elido шукає OAuth-запис за team_id, знаходить ID воркспейсу, для якого було виконано підключення, створює shortlink у домені за замовчуванням воркспейсу та повертає ефемерне повідомлення менш ніж за 200 мс при p95. Відповідь ефемерна за замовчуванням, щоб канал не засмічувався щоразу, коли хтось скорочує URL під час зустрічі.
Якщо той, хто викликав команду, хоче публічного повідомлення, він передає --public останнім токеном:
/shorten --public https://launch.elido.app
При встановленні потрібні три OAuth-дозволи: commands (щоб slash-команду можна було викликати), chat:write (щоб Elido міг публікувати додаткові повідомлення з кнопками копіювання) і incoming-webhook (щоб алерти потрапляли до каналу, обраного встановлювачем). У довіднику Slack зі Slash Commands перелічено повний набір, але цих трьох достатньо для всього, що робить Elido. Кастомні домени підтримуються: якщо у вашому воркспейсі налаштовано домен go.acme.com через кастомні домени, /shorten створюватиме shortlink'и на цьому хості.
Кілька слів про бюджети затримки. Slack дає slash-командам 3000 мс реального часу на відповідь. Elido відповідає за 180-220 мс p95 через edge-POP'и в ЄС та США, оскільки обробник slash-команди використовує той самий hot-path кеш, що й edge-редирект. Якщо ваша команда знаходиться в регіоні APAC і ви бачите значення понад 350 мс, перевірте регіональну маршрутизацію POP у /docs/guides/observability.
Канальні алерти на основі тригерів подій
Друга половина Slack-застосунку - маршрутизація алертів. Ви обираєте тип події, обираєте канал і отримуєте сповіщення. Чотири типи подій, доступні сьогодні:
- broken-link: при останньому обході сканера посилань ціль повернула 4xx або 5xx
- click-threshold: кліки перевищили збережений поріг (за замовчуванням: 100 у ковзному 5-хвилинному вікні)
- scan-failure: URL-сканер позначив ціль як фішинг, шкідливе ПЗ або як таку, що є у публічному блок-листі
- new-conversion: спрацювало відстежуване конверсійне подія (потребує відстеження конверсій)
Payload алерту, який Elido пересилає до Slack, використовує Block Kit, бо простий текст в активному каналі ігнорується. Ось як виглядає алерт click-threshold у транспорті, коли Elido робить POST на URL incoming-webhook Slack:
{
"text": "click-threshold crossed on go.acme.com/launch",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": ":chart_with_upwards_trend: Click threshold crossed"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Link:*\n<https://go.acme.com/launch|go.acme.com/launch>"
},
{ "type": "mrkdwn", "text": "*Window:*\n5m" },
{ "type": "mrkdwn", "text": "*Clicks:*\n412" },
{ "type": "mrkdwn", "text": "*Threshold:*\n100" }
]
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": { "type": "plain_text", "text": "Open dashboard" },
"url": "https://app.elido.app/links/abc123"
}
]
}
]
}
Алерт scan-failure виглядає аналогічно, але використовує :rotating_light: і містить категорію загрози від сканера: phishing, malware, spam або blocklist. Алерт broken-link включає HTTP-статус і мітку часу останнього успішного стану - саме про це черговий питає першим.
Маршрутизація налаштовується на рівні воркспейсу та окремої події. Типова конфігурація для команди зростання з 30 осіб:
| Подія | Канал | Емодзі | Пінги |
|---|---|---|---|
| broken-link | #ops-alerts | :rotating_light: | @oncall |
| click-threshold | #growth | :chart_with_upwards_trend: | (немає) |
| scan-failure | #security | :rotating_light: | @sec-oncall |
| new-conversion | #wins | :tada: | (немає) |
Все це налаштовується в панелі параметрів інтеграції Slack. Кожне правило - один рядок у Postgres. Без YAML, без JSON-конфігів, без повторного деплою. Той самий рушій маршрутизації працює в інтеграціях Linear і Pipedrive, тому ментальна модель переноситься, якщо ви використовуєте обидва інструменти.
Якщо алерти потрібно доставляти в кілька місць, продублюйте ту саму подію в універсальну підписку на webhook і направте JSON туди, де він потрібен. Цей патерн задокументовано у статті автоматизація скорочення URL через Zapier для no-code аудиторії.
Перевірка HMAC і пастка переустановки
Slack підписує кожен вхідний запит до вашого endpoint'у slash-команди. Підпис - це HMAC SHA256 по рядку, який Slack складає з версії, мітки часу та сирого тіла запиту. Алгоритм описано в посібнику Slack з перевірки запитів. Верифікатор Elido на Go виглядає приблизно так:
func verifySlackSignature(secret, ts, body, sig string) error {
// Reject anything older than 5 minutes to block replays.
age := time.Since(parseTs(ts))
if age > 5*time.Minute || age < -1*time.Minute {
return errReplay
}
base := fmt.Sprintf("v0:%s:%s", ts, body)
mac := hmac.New(sha256.New, []byte(secret))
mac.Write([]byte(base))
expected := "v0=" + hex.EncodeToString(mac.Sum(nil))
if !hmac.Equal([]byte(expected), []byte(sig)) {
return errBadSig
}
return nil
}
Тут три речі йдуть не так - у порядку спадання частоти:
1. Тіло парситься до підписання. Якщо ваш HTTP-фреймворк викликає r.ParseForm() до того, як ви прочитаєте сире тіло, тіло зникає і підпис ніколи не збігатиметься. Спочатку читайте r.Body, потім парсіть. Обробник slash-команди Elido зчитує тіло в буфер і перепарсує - це коштує одного виділення пам'яті і заощаджує тиждень відлагодження.
2. Розходження годинника мітки часу. Рекомендоване Slack вікно захисту від replay-атак становить 5 хвилин. Якщо годинник вашого сервера відстає або поспішає більш ніж на це значення (типово для bare-metal без chrony), кожен підписаний запит виглядатиме як replay. Запустіть chronyc tracking на сервері та переконайтеся в Leap status: Normal.
3. Переустановка з ротованим signing secret. Саме це прокидає вас посеред ночі. Якщо ви ротуєте signing secret у панелі Slack (Basic Information > Signing Secret > Regenerate), всі наявні OAuth-встановлення у всіх воркспейсах негайно починають провалювати перевірку підпису. Адміністратор воркспейсу мусить переустановити застосунок, щоб отримати новий handshake. Тихої ротації немає - Slack не поширює новий секрет на наявні встановлення.
Радіус ураження залежить від моделі дистрибуції. Якщо ваш Slack-застосунок обслуговує один воркспейс (внутрішній застосунок компанії), ротація - це переустановка за 90 секунд одним адміністратором. Якщо застосунок знаходиться в публічному каталозі Slack і встановлений у 4000 воркспейсах, ви щойно зламали їх усі. Обирайте вікна ротації відповідно та оголошуйте про них у changelog щонайменше за 48 годин.
Суміжний сценарій відмови: встановлення того самого Slack-застосунку в іншому воркспейсі за тієї самої браузерної сесії. Якщо cookie не очищені, Slack іноді повертає токен, прив'язаний до неправильної команди. Вихід - приватне вікно або ?ignore_session=1 в URL встановлення. Флоу встановлення Elido за адресою /dashboard/integrations/slack вже передає цей прапор - ми обпеклися на цьому в ранній Беті.
Коли Slack-бот - не найкращий вибір
Slack чудово підходить для алертів за участі людини. Це не те місце для високочастотних програмних подій. Якщо ви генеруєте більше ~20 подій на хвилину, Slack обмежує incoming-webhook endpoint приблизно до 1 повідомлення на секунду на канал, і ви втрачатимете алерти. Направляйте такі події до метрики Datadog або до звичайного webhook-консьюмера, а до Slack надсилайте лише зведення про перевищення порогу.
Другий випадок, коли Slack не підходить: аудиторські сліди для відповідності вимогам. Повідомлення Slack змінювані (їх можна редагувати та видаляти), а політика зберігання керується на рівні воркспейсу. Якщо аудитор вимагає незмінного журналу того, хто яке посилання і коли скоротив, передавайте події slash-команди до сховища даних через експорт ClickHouse і використовуйте Slack лише як шар сповіщень.
Для команд зростання, що маршрутизують алерти про кліки в кампаніях, Slack-бот покриває 95% того, про що питають у /solutions/marketers. Для платформних команд, що працюють з нашим API + SDK, це один із кількох виходів для fan-out.
Тарифи та обмеження
Інтеграція зі Slack доступна на будь-якому тарифі, включаючи безкоштовний. Плати за повідомлення немає - обмеження поширюється на самі shortlink'и та кліки, що можна перевірити на сторінці тарифів. У кожному воркспейсі можна налаштувати до 32 правил маршрутизації (комбінації тип події x канал) - більше, ніж будь-яка команда, з якою я спілкувався, реально використовувала.
Self-hosted встановлення Elido теж працюють. Ви вказуєте request URL Slack-застосунку на свій домен, встановлюєте signing secret в оточенні api-core - і все інше ідентичне. Документація по self-host описує змінні оточення; посібник з моніторингу - імена метрик, щоб ви могли будувати графіки затримки slash-команд і успішності доставки алертів у Grafana або Datadog.
Наступні кроки
Якщо ви вже користуєтеся Elido, відкрийте /dashboard/integrations/slack, натисніть «Підключити», оберіть канал за замовчуванням для кожного типу події - і до роботи. Встановлення справді займає 90 секунд. Якщо ви оцінюєте продукт, у каталозі інтеграцій перелічені всі конектори та тарифи, на яких вони доступні, а порівняння з Bitly показує, як можливості Slack співвідносяться з можливостями конкурентів (спойлер: у Bitly немає slash-команди).
Якщо ви створюєте власного бота - скопіюйте патерн HMAC вище та дотримуйтеся обмеження 3000 мс. UX slash-команд Slack невблаганний до повільних ботів, а швидкий відгук - половина причини, чому люди їх взагалі встановлюють.
Поширені запитання
Як встановити Slack-бот Elido для скорочення URL?
Відкрийте /dashboard/integrations/slack в Elido та натисніть «Підключити». Вас перенаправлять на OAuth-екран Slack - оберіть воркспейс, схваліть дозволи (commands, chat:write, incoming-webhook) і приблизно за 90 секунд повернетеся до Elido. Встановлення записує рядок токена з ключем team_id, тому кожен воркспейс отримує власні облікові дані.
Чи працює /shorten у приватних каналах і DM?
Так. Slash-команди виконуються в каналі, де користувач їх вводить, включно з приватними каналами та DM, оскільки Slack передає channel_id у підписаному payload'і. Elido відповідає ефемерним повідомленням, видимим лише тому, хто викликав команду, тому канал не засмічується при разових скороченнях.
Як підписуються payload'и алертів Slack?
Вихідні алерти з Elido до Slack використовують URL incoming-webhook Slack, який сам по собі є bearer-подібним секретом, прив'язаним до одного каналу. Вхідні slash-команди зі Slack до Elido перевіряються за допомогою HMAC SHA256 по сирому тілу запиту та заголовку X-Slack-Request-Timestamp згідно зі схемою signing-secret Slack.
Що відбувається зі Slack-ботом при переустановці OAuth-застосунку?
Переустановка генерує новий bot-токен і робить старий недійсним. Signing secret ротується лише за його регенерації в панелі застосунку Slack - у цьому разі кожен воркспейс, що використовує ваш дистрибутив, має переустановити застосунок. Плануйте ротації у вікна низького трафіку та заздалегідь оголошуйте про них у #ops.
Які типи алертів можна направляти до каналів Slack?
Сьогодні доступні чотири типи подій: broken-link (на цільовій сторінці shortlink виявлено 4xx або 5xx), click-threshold (збережений поріг перевищено у 5-хвилинному вікні), scan-failure (URL-сканер позначив ціль як фішинг або шкідливе ПЗ) і new-conversion (спрацювало відстежуване конверсійне подія). Кожен алерт може направлятися до окремого каналу.
Спробуйте Elido
Вставте URL - отримайте коротке посилання
Без реєстрації. Посилання живе 30 днів. Зареєструйтесь, щоб зберегти назавжди.
Безкоштовно, без реєстрації · 2 на день