7 хв читанняІнтеграції

Алерти Discord для скорочувача URL: налаштування Telegram, payload-структури, типові пастки

Надсилайте сповіщення про битті посилання, перевищення порогу кліків і помилки сканування у Discord-вебхуки або Telegram-бот. Налаштування, структура payload, поширені проблеми.

Marius Voß
DevRel · edge infra
Discord embed та іконка Telegram-бота поруч із символом битого посилання, що ілюструє алерти скорочувача URL у Discord

Якщо коротке посилання починає віддавати 404 о третій ночі, ви хочете отримати алерт там, де вже чергує ваш on-call. Для більшості інженерних команд це Discord; для ops- і growth-команд у Європі - нерідко Telegram. Elido надає Beta-інтеграції для обох. У цій статті розберемо, що і куди вставляти, який JSON приходить на іншому кінці та три сценарії збоїв, які застають команди зненацька в перший тиждень.

Два факти одразу. Перший: обидва конектори працюють виключно через вставку токена. Ви генеруєте webhook URL або токен бота у UI провайдера, вводите його в Elido - і інтеграція активна. Ми нічого не налаштовуємо автоматично на стороні Discord або Telegram: їхні API цього не підтримують. Другий: кожен алерт генерується тим самим event bus, що обслуговує функцію webhooks, тому контракти payload стабільні й задокументовані.

Чому ці два - Beta, а не Live

Каталог інтеграцій Elido присвоює статус Live тоді, коли одним кліком ми можемо виконати три дії: зареєструвати ресурс провайдера, призначити потрібні scope-и і видалити все при відключенні. Notion, Linear і Pipedrive відповідають цьому критерію, бо надають OAuth і API для управління ресурсами.

Discord-вебхуки і Telegram-боти - ні. Webhooks API Discord потребує користувача-бота з дозволом Manage Webhooks у конкретному каналі; керованого нами flow згоди просто не існує. Telegram ще складніший: BotFather - це чат-інтерфейс без машинозчитуваного видавання токенів. Тому ми просимо вас витратити 90 секунд на налаштування у провайдера, а все решта беремо на себе. Токен зберігається в нашому сховищі з конвертним шифруванням і ніколи не залишає webhook-диспетчер api-core.

Значок Beta означає: «працює, payload-и стабільні, але UX підключення/відключення потребує одного додаткового кроку». Якщо вам потрібен авто-провіжн вже сьогодні, Slack має статус Live і працює на тому ж pipeline трансформерів.

Покрокове налаштування: починаємо з Discord

У Discord відкрийте потрібний канал, натисніть на іконку шестерні та виберіть Інтеграції -> Вебхуки -> Новий вебхук. Дайте йому ім'я на кшталт elido-alerts, за потреби завантажте аватар Elido з /blog/covers і скопіюйте URL вебхука. Він виглядає так:

https://discord.com/api/webhooks/123456789012345678/AbCdEf-tokenstring

Цей URL - секрет. Будь-хто, хто його отримає, зможе постити у ваш канал. Поводьтеся з ним як із паролем.

В Elido перейдіть до Налаштувань робочого простору -> Інтеграції -> Discord. Вставте URL, виберіть типи подій у мультиселекті (broken_link, click_threshold, scan_failure, redirect_chain_change, qr_scan_anomaly) і збережіть. Форма спочатку надсилає синтетичну тестову подію; якщо Discord поверне щось відмінне від 204, збереження не відбудеться і ви побачите помилку прямо у формі.

Telegram налаштовується у два кроки. Відкрийте чат із BotFather, виконайте /newbot, придумайте ім'я і скопіюйте токен. Він має вигляд 7891234567:AAH-tokenstring. Потім додайте бота до чату, куди хочете отримувати алерти (особистий чат, група або канал), і надішліть будь-яке повідомлення. В Elido вставте токен, натисніть «Знайти чати», виберіть потрібний зі списку видимих боту чатів і збережіть.

Крок «Знайти чати» виконує одноразовий виклик getUpdates Telegram для переліку chat ID, які вже бачив ваш бот. Якщо список порожній - бот доданий, але ще не отримав жодного повідомлення. Надішліть йому будь-яке повідомлення і спробуйте знову.

Реальна структура payload

Саме тут більшість туторіалів «алерти в чат» стають розпливчастими. Ось що насправді приходить.

JSON embed-а Discord і HTML-тіло sendMessage Telegram для однієї і тієї ж події битого посилання, показані поруч

Для Discord ми надсилаємо один embed на подію, а не застарілий рядок content. Трансформер у services/api-core/internal/webhooks/delivery/transformers.go формує таку структуру:

{
  "username": "Elido",
  "embeds": [
    {
      "title": "Broken link detected",
      "description": "https://elido.me/launch -> 404 Not Found",
      "color": 15548997,
      "timestamp": "2026-06-04T09:14:22.000Z",
      "fields": [
        { "name": "Slug", "value": "launch", "inline": true },
        { "name": "Workspace", "value": "acme-prod", "inline": true },
        { "name": "Status", "value": "404", "inline": true },
        { "name": "First seen", "value": "2026-06-04 09:13:11 UTC" },
        { "name": "Last 5 redirects", "value": "blocked since 09:13:11" }
      ],
      "footer": { "text": "Elido alerts - broken_link" },
      "url": "https://elido.app/links/launch"
    }
  ]
}

Ціле число color - це десяткове значення hex-коду. Ми використовуємо чотири рівні важливості: info 3447003 (синій), success 2280516 (зелений), warn 15844367 (бурштиновий), error 15548997 (червоний). Детальніше про цей маппінг - трохи нижче.

Telegram працює інакше. Ми використовуємо parse_mode: "HTML", бо Markdown V2 вимагає екранувати десятки символів і швидко стає нечитабельним. Виклик sendMessage виглядає так:

{
  "chat_id": -1001234567890,
  "parse_mode": "HTML",
  "disable_web_page_preview": true,
  "text": "<b>Broken link detected</b>\n<code>elido.me/launch</code> -> 404\n\nSlug: <code>launch</code>\nWorkspace: <code>acme-prod</code>\nFirst seen: 2026-06-04 09:13:11 UTC\n\n<a href=\"https://elido.app/links/launch\">Open in Elido</a>"
}

Ми встановлюємо disable_web_page_preview у true, щоб чат не роздувався, коли URL алерту розгортав би превью. Превью посилань у черговому треді лише заважають.

Обидва транспорти повторюють спроби з однаковим backoff-ом: 1с, 5с, 30с, 5хв, 30хв. Після п'яти невдач інтеграція автоматично призупиняється і надсилається електронний лист. Кожна спроба логується у ClickHouse і доступна через посібник з observability.

Маппінг рівня важливості на колір

Діаграма маппінгу важливості на колір: info синій, success зелений, warn бурштиновий, error червоний із прикладами відповідних подій

Колір - єдиний сигнал, який користувачі Discord бачать з першого погляду. Ми обрали чотири рівні важливості і суворо дотримуємося їх в усіх інтеграціях з підтримкою кольору:

  • info (#3B82F6, синій) - нове посилання створено через API, перше сканування призначення, опублікована bio-сторінка. Не потребує дій, лише інформація.
  • success (#22C55E, зелений) - link checker відновлено, сертифікат оновлено для кастомного домену, досягнуто порогу конверсії.
  • warn (#F59E0B, бурштиновий) - швидкість кліків у 3 рази вища за 7-денне базове значення, ланцюжок редиректів виріс із 2 до 4 хопів, швидкість QR-сканувань впала на 80%. Варто подивитися.
  • error (#EF4444, червоний) - broken_link, scan_failure (Google Safe Browsing позначив ваш цільовий URL), TLS кастомного домену закінчився, webhook-диспетчер здався після 5 спроб.

Telegram не рендерить кольори, тому на початку кожного повідомлення ми додаємо емодзі, що відповідає рівню: синій ромб, зелена галочка, жовте попередження, червоний хрест. Та сама семантика, інший транспорт. Щоб відфільтрувати Telegram-алерти у клієнті лише до червоних подій, шукайте хрест у тексті повідомлення.

Типові сценарії збоїв (і як їх розпізнати)

У продакшені виникають три проблеми. Їх легко усунути, якщо знати, що шукати.

Rate limit Discord на активному вебхуку. Discord обмежує кожен webhook URL до 50 запитів на секунду і приблизно 30/хв у стійкому режимі. Підключіть вебхук до кожного click_threshold вірусної кампанії - і ви його досягнете. Симптоми: алерти приходять пачками із затримкою 30-60 секунд, відповіді 429 у лозі інтеграції. Рішення: увімкніть throttle per-event (за замовчуванням вимкнено), щоб події, що виникли протягом 10-секундного вікна, об'єднувалися в один embed.

Режим конфіденційності Telegram-бота. Режим конфіденційності увімкнено за замовчуванням для нових ботів і впливає лише на те, які повідомлення бот може читати у групах. Вихідні виклики sendMessage він не зачіпає. Справжній підводний камінь: коли ви додаєте бота до групи, Telegram вимагає, щоб бот отримав хоча б одне повідомлення, перш ніж getUpdates повернути цей chat_id. Якщо «Знайти чати» повертає порожній список - відправте боту будь-яке повідомлення і спробуйте знову. Для каналів (не груп) додайте бота як адміністратора з правом публікації - попереднє повідомлення не потрібне.

Ротація токена. Обидва транспорти зберігають секрет у зашифрованому вигляді через шар конвертного шифрування з ADR-0036. Відкритий текст ніколи не потрапляє до Postgres або логів. Коли токен витікає (скріншот у Slack, запис в audit log Discord, якого там не повинно бути), ротація - це два кліки: відкликання у провайдера, вставка нового значення в Elido. Рядок інтеграції, фільтри подій і історія ClickHouse залишаються незмінними, бо прив'язані до UUID інтеграції, а не до секрету.

Коли обирати що

Якщо ваша команда живе в Discord - використовуйте Discord. Формат embed багатший, inline-поля відображаються передбачувано на десктопі і мобайлі, а кольорове позначення важливості дістається безкоштовно.

Якщо ваша команда в Telegram (характерно для європейських ops-команд, команд розробників у Східній Європі та продуктів, пов'язаних із крипто) - використовуйте Telegram. API getUpdates і sendMessage гранично простий, а HTML-режим закриває 95% потреб форматування.

Якщо потрібно обидва - використовуйте обидва. Кожна інтеграція - окремий рядок із власним фільтром подій, тому ви можете направляти події error-важливості до Discord, а попередження - до Telegram-групи «фонового шуму». Деякі наші клієнти роблять саме так.

Для всього, що за межами чату - оновлення CRM, маркетингова автоматизація, BI-пайплайни - правильними інструментами є Zapier і API вебхуків. Чат - для людей, що реагують на події. Вебхуки - для систем, що реагують на події.

Для чого не варто їх використовувати

Не використовуйте Discord або Telegram як єдиний монітор link-rot. Чат є ефемерним. Якщо алерт промайнув під час насиченого запуску - ви його не знайдете. Використовуйте чат як високосигнальний шар поверх нормального observability-стека: link checker Elido для синтетичних перевірок, Datadog або Sentry для трейсів, і чат - для подій, які людина справді має побачити.

Не включайте персональні дані у payload алертів. Стандартний payload містить slug посилання та ID робочого простору - ніколи IP кліку або ідентифікатор відвідувача. Якщо ви додаєте кастомні метадані через API і вони містять особисті дані, вони потраплять до історії чату Discord або Telegram. Жоден із цих провайдерів не входить до списку DPA більшості компаній. Обмежуйтеся операційними даними.

Що у планах

Автоматичний провіжн для Discord можливий, якщо ми перейдемо на модель Discord-бота замість споживача вебхука. Прототип готовий. Ключ у тому, щоб дати користувачам можливість надати боту Elido доступ до каналу через OAuth-подібний consent flow, після чого ми створимо вебхук на стороні сервера. У плані наступного кварталу цього немає, але це перевело б Discord у Live.

Для Telegram чистого шляху немає. BotFather - інтерфейс лише для людей, тому повний автоматичний провіжн неможливий. Оновлення планів доступні у changelog.

Потрібна чат-платформа, яку ми ще не підтримуємо (Mattermost? Microsoft Teams через Power Automate?), напишіть команді на /about. Тарифи та ліміти місць - на сторінці цін; Discord і Telegram доступні з плану Pro і вище.

Поширені запитання

Як надсилати алерти про короткі посилання Elido до каналу Discord?

Створіть Discord-вебхук у налаштуваннях каналу, скопіюйте URL і вставте його у форму інтеграції Elido за адресою /integrations. Виберіть потрібні типи подій (broken-link, click-threshold, scan-failure) і збережіть. Перший алерт надійде протягом хвилини у вигляді кольорового embed зі slug-ом посилання, payload події та прямим посиланням на дашборд Elido.

Чому Discord і Telegram мають статус Beta, якщо більшість інших інтеграцій Elido позначені як Live?

Жоден із цих провайдерів не надає API, що дозволяло б нам автоматично реєструвати вебхук або бот від вашого імені. Ви один раз вставляєте токен або URL, ми зберігаємо його в зашифрованому вигляді - і на цьому налаштування закінчується. Live-інтеграції, як-от Notion чи Linear, дозволяють нам викликати API провайдера для створення і видалення ресурсів. Discord і Telegram поки що цього не підтримують, тому ми тримаємо їх у Beta до того часу, поки UX не зрівняється.

Який rate limit у Discord для webhook-алертів?

Discord дозволяє 50 запитів на секунду на кожен webhook URL, плюс окремий глобальний ліміт на токен бота. Elido об'єднує події, що надходять швидко одна за одною, в один embed, якщо за 10 секунд їх більше 5. Якщо ліміт перевищено, Discord повертає 429, і ми дотримуємося заголовка Retry-After перед повторним надсиланням.

Чи блокує режим конфіденційності Telegram-бота алерти про посилання?

Режим конфіденційності стосується лише повідомлень людей у групах, але не вихідних викликів sendMessage вашого бота. Elido надсилає алерти через токен вашого бота на chat_id, вказаний під час налаштування, тому режим конфіденційності тут не має значення. Важливо інше: бот має бути доданий до чату і мати право надсилати повідомлення ще до того, як прийде перший алерт.

Чи можна замінити скомпрометований токен Telegram-бота без втрати історії алертів?

Так. Зверніться до BotFather, виконайте /revoke, згенеруйте новий токен і вставте його в Elido у той самий рядок інтеграції. chat_id та фільтри подій залишаються прив'язаними до запису інтеграції, тому історичні логи алертів у /docs/guides/observability надалі доступні для запитів. Старий токен перестає працювати в момент відкликання через BotFather, тому виконуйте заміну під час планового технічного обслуговування.

Спробуйте Elido

Вставте URL - отримайте коротке посилання

Без реєстрації. Посилання живе 30 днів. Зареєструйтесь, щоб зберегти назавжди.

Безкоштовно, без реєстрації · 2 на день

Спробуйте Elido

URL-скорочувач із хостингом у ЄС: власні домени, глибока аналітика, відкритий API. Безкоштовний тариф - без кредитної картки.

Теги
discord url shortener alerts
telegram bot alerts
discord webhook short link
telegram link tracking
discord embed alerts

Читати далі