UnicoreCMS

Вебхуки

Публикация новостей в Telegram, Discord, ВКонтакте и на произвольный адрес

Утилиты → Вебхуки. Вебхук отправляет новость во внешний канал, когда она появляется на сайте. Один вебхук — один канал: чтобы новость ушла и в Telegram, и в Discord, заведите два.

События

СобытиеКогда срабатывает
Новая новостьНа сайте опубликована новая новость
Новость из VKLongPoll принёс новый пост из сообщества
Без событияСам не срабатывает: в него шлют напрямую — например, модуль форм присылает новые заявки

События разделены намеренно. Обычно из ВК новости уже уходят в Discord руками, и дублировать их не хочется. Бывает и наоборот, когда в Discord нужны только посты из ВК, а сайтовые анонсы туда не идут.

Вебхук «Без события» — адресат для модулей: они выбирают его по имени в своих настройках и отправляют туда свои сообщения. Новости в такой вебхук не уходят, поэтому канал заявок или уведомлений не смешивается с анонсами.

Каналы

Отправка идёт от вашего бота, поэтому нужны две вещи: токен бота в окружении и адрес чата в вебхуке.

Токен. Напишите @BotFather, выполните /newbot и скопируйте строку вида 123456789:AA.... Положите её в .env рядом с остальными переменными:

.env
TELEGRAM_BOT_TOKEN=123456789:AAHf-примерный-токен

Переменная читается при старте — после правки перезапустите сервер. Токен один на весь сайт: сколько бы вебхуков вы ни завели, все они пишут от этого бота.

Чат. В поле «Куда» укажите @имя_канала для публичного канала или числовой ID для приватного канала и группы (у групп он отрицательный, например -1001234567890). Узнать ID приватного чата можно, переслав из него любое сообщение боту вроде @userinfobot.

Права. Добавьте бота в канал администратором с правом публиковать сообщения. Без права на удаление и редактирование пост уйдёт, но правки новости в канал не доедут.

Разметка. Текст новости переводится в HTML, который понимает Telegram: b, i, u, s, a, code, pre, blockquote. Остальные теги вырезаются, картинки и таблицы из тела новости в пост не переносятся.

Картинка. Обложка новости уходит фотографией с подписью, если текст умещается в 1024 символа. Не уместился — придёт обычным сообщением без картинки, обрезанным до 4096 символов. Если Telegram отказался принять картинку, доставка всё равно засчитывается, а причина попадает в журнал предупреждением.

Адрес выдаёт сам Discord: Настройки канала → Интеграции → Вебхуки → Создать. Скопируйте ссылку вида https://discord.com/api/webhooks/... и вставьте её в поле «URL».

Сообщение приходит эмбедом: заголовок, текст, картинка новости, ссылка на страницу.

Пост уходит на стену сообщества, поэтому нужен токен сообщества с правом wall:

.env
VK_APIKEY=vk1.a.примерный-токен

В поле «Куда» укажите ID сообщества числом, без club и без минуса — знак сервер подставит сам.

ВКонтакте не поддерживает разметку в постах: ссылки, жирный шрифт и списки из новости в текст не попадут — останется чистый текст, обрезанный до 4000 символов. Ссылка на новость дописывается отдельной строкой, обложка уходит вложением.

Обычный POST с телом новости в JSON на любой ваш адрес. Пригодится, чтобы отдать новость в свой сервис или в очередь.

Не любой адрес пройдёт

Перед отправкой сервер проверяет адрес и отклоняет всё, что ведёт в локальную сеть или на служебные адреса облаков. Это защита от SSRF: без неё через вебхук можно дотянуться до внутренних сервисов вашей же сети.

Когда уходит пост

У каждого вебхука два переключателя:

ПереключательЧто делает
Публиковать автоматическиНовость уйдёт в канал сразу при создании, без нажатия кнопки
Обновлять пост при правке новостиПосле сохранения изменений опубликованный пост будет отредактирован

Выключите автопубликацию, если хотите решать вручную: в списке новостей у каждой новости есть кнопка отправки, а под ней — «Публикация новости» с галочками каналов.

Скрытая новость в каналы не уходит — сначала снимите с неё скрытие.

Журнал доставок

Лежит там же, в диалоге публикации, и показывает по строке на канал: название вебхука, статус, время и число попыток. Текст ошибки виден при наведении на число попыток.

Доставка идёт через очередь. Если канал не ответил, сервер пробует ещё — до пяти попыток, с растущей паузой от минуты до часа. После пятой доставка получает статус «Ошибка» и ждёт вас: у такой строки появляется кнопка повтора. Пригодится, когда причина устранена — например, боту выдали недостающее право.

Таймаут запроса пять секунд. Одна сломанная интеграция не мешает остальным — каналы отрабатывают независимо.

Содержание