Уведомления в Telegram

Компонент отправляет уведомления сайта в Telegram через вашего бота. Пользователи подключают Telegram в профиле и сами выбирают, какие уведомления получать. Администраторы и рабочие группы получают служебные события сайта с кнопками решений. Новые записи сайта публикуются в ваши каналы. Если хостинг не достаёт до Telegram, работает через ваш адрес API или прокси.

Что делает компонент

Что понадобится

ТребованиеПояснение
InstantCMS 2.18.2 или новее
PHP 7.2–8.4 с расширениями cURL и OpenSSLЕсть почти на любом хостинге. Проверено на PHP 7.4, 8.2 и 8.4
Сайт на HTTPS с действующим сертификатомНужен, чтобы Telegram мгновенно передавал сайту «Запустить», нажатия кнопок и добавление бота в группы. Без HTTPS тоже работает — см. «Сайт без HTTPS»
Планировщик: cron раз в минутуУведомления уходят через штатную очередь InstantCMS
Свой бот в TelegramСоздаётся за минуту у @BotFather, бесплатно. Один бот обслуживает один сайт

Бот и токен

  1. Откройте в Telegram @BotFather и отправьте /newbot.
  2. Задайте имя бота (его видят пользователи, например «Уведомления сайта») и адрес, оканчивающийся на bot.
  3. BotFather пришлёт токен вида 123456789:AA… — скопируйте его.
Токен — это пароль к боту: не публикуйте его и не передавайте третьим лицам. Один бот обслуживает один сайт: если тот же бот уже подключён к другой программе (webhook или опрос), они будут мешать друг другу.

Установка и обновление

  1. Сделайте резервную копию файлов и базы данных сайта.
  2. Откройте Дополнения → Установить пакет дополнения, выберите ZIP-архив и нажмите «Продолжить».
  3. Для обновления используйте архив с пометкой update. Настройки, подключённые пользователи, каналы и журнал сохранятся.

При установке создаются шесть таблиц {префикс}tgnotify_* и две задачи планировщика. Ядро CMS не изменяется.

Настройка за 5 минут

Откройте Компоненты → Уведомления в Telegram. На странице «Состояние» есть список шагов, выполненные отмечаются галочкой.

  1. Опции → Бот: вставьте токен в поле «Токен бота» и сохраните.
  2. Состояние → «Проверить подключение». Должно появиться «Подключение работает: бот „…“». Если ошибка связи — см. «Если Telegram недоступен».
  3. Состояние → «Подключить webhook». Должно появиться «Webhook подключён».
  4. Подключите Telegram себе: Профиль → Настройки → Уведомления → «Подключить Telegram» → в чате с ботом нажмите «Запустить». Бот ответит «Аккаунт … подключён».
  5. Состояние → «Отправить тест себе». В Telegram придёт тестовое сообщение.

Если Telegram недоступен с хостинга

С российских хостингов адрес api.telegram.org бывает недоступен или отвечает с перебоями: «Проверить подключение» в этом случае сама пробует запасные адреса серверов Telegram.

Запасной адрес — подбирается сам

Часто не отвечает только тот адрес, который хостинг получает из DNS, а другие серверы Telegram доступны. Нажмите Состояние → «Проверить подключение»: если основной адрес молчит, компонент по очереди пробует запасные и сохраняет тот, что ответил, в поле «IP-адрес api.telegram.org». Сообщение об этом появится вверху страницы. Если позже основной адрес снова заработает, проверка вернёт прямую связь сама.

Сайт по-прежнему обращается к api.telegram.org и проверяет его сертификат — меняется только сервер, к которому идёт соединение. Адрес можно вписать и вручную из официального списка сетей Telegram; поле действует, когда «Свой адрес API» пуст.

Если не ответил ни один адрес, хостинг закрыл Telegram целиком. На «Состоянии» появится красный блок «Нет связи с Telegram» с тремя выходами: посредник Cloudflare Worker, свой прокси или письмо в поддержку хостинга (готовый текст там же).

Свой адрес API

Посредник, который принимает запросы сайта и передаёт их в Telegram. Проще всего — бесплатный Cloudflare Worker:

  1. Зарегистрируйтесь на cloudflare.com, откройте Workers & Pages → Create → Worker.
  2. Замените код воркера на этот и нажмите Deploy:
    export default {
      async fetch(request) {
        const url = new URL(request.url);
        url.hostname = 'api.telegram.org';
        return fetch(new Request(url, request));
      }
    };
  3. Скопируйте адрес воркера, например https://tg-proxy.ваше-имя.workers.dev, и вставьте его в поле «Свой адрес API» (без «/» в конце). Сохраните и нажмите «Проверить подключение».

Подойдёт и свой Bot API Server или любой обратный прокси к api.telegram.org.

Прокси

Если у вас есть прокси-сервер, укажите его в поле «Прокси»: socks5://логин:пароль@адрес:порт или http://адрес:порт. Через него пойдут запросы сайта к Telegram; проверка сертификата Telegram остаётся включённой. Пароль прокси скрыт в форме и не попадает в журналы.

Эти настройки касаются запросов сайта к Telegram (отправка сообщений). События от Telegram к сайту (webhook) приходят на адрес сайта напрямую. Если они не доходят — на «Состоянии» будет «последняя ошибка Telegram», — включите опрос раз в минуту: тогда сайт сам забирает события тем же путём — через IP-адрес, свой адрес API или прокси.

Опции

Пользователи

Администраторам

«Копия всех уведомлений пользователей» и «Копия всех исходящих писем» нужны только для отладки. На рабочем сайте держите обе выключенными. В рабочие группы эти копии не уходят.

Тихие часы

Блок Опции → Тихие часы: поля «Начало» и «Конец» задают один период, например начало 22:00 и конец 08:00. В это время сообщения приходят без звука — и подписчикам, и в рабочие группы; они не задерживаются, утром уже лежат в чате. Период может переходить через полночь и действует каждый день. Ниже — «Весь день без звука»: отмеченные дни недели, например суббота и воскресенье, проходят без звука круглые сутки. Время — по часам сервера сайта.

Формат и доставка

Автопостинг в каналы

Сайт без HTTPS, тестовый сайт или webhook не доходит

Telegram присылает события только на HTTPS-адрес с действующим сертификатом. Для тестового сайта и в случае, когда события Telegram не доходят до сайта, выберите Опции → Получение событий от Telegram → Опрос раз в минуту. Компонент сам забирает события через планировщик: подключение пользователя и нажатия кнопок срабатывают в течение минуты.

Если был подключён webhook, нажмите на «Состоянии» «Отключить webhook»: пока он подключён, Telegram не отдаёт события опросом.

Что видит пользователь

Куда приходят сообщения. Блок «Личные уведомления в Telegram» в профиле управляет только личным чатом пользователя с ботом. Подключение не подписывает на канал и не добавляет в группы. Для подключения достаточно открыть бота по кнопке из своего профиля, нажать «Запустить», вернуться на сайт и выбрать уведомления. MAX подключается и настраивается отдельно.

Имя подключённого аккаунта берётся из Telegram. У старых перенесённых привязок компонент восстанавливает его автоматически через настроенное соединение с Telegram; до получения имени показывает ник пользователя сайта. Технический номер аккаунта вместо имени не выводится. Переподключать бота ради имени не нужно.

Кнопки в сообщениях

КнопкаГдеЧто делает
⚙ НастроитьЛичные уведомленияОткрывает настройки уведомлений профиля на сайте
🔕 ОтключитьЛичные уведомленияСтавит уведомления этого человека на паузу; включить снова — кнопкой «🔔 Включить уведомления» или командой /start
✅ ОдобритьМатериал или комментарий на модерацииОдобряет запись штатной модерацией сайта: запись публикуется, задача модератора закрывается, автор получает обычное уведомление «Одобрено»
🗑 УдалитьКомментарий на модерации, новый комментарийКомментарий на модерации отклоняется и удаляется, опубликованный — скрывается («Комментарий удалён»)
ОткрытьСлужебные событияОткрывает запись, комментарий или профиль на сайте
Кто может нажать «Одобрить» и «Удалить». Только тот, чей Telegram подключён к учётной записи администратора сайта или модератора этого типа контента (для комментариев — модератора комментариев). Остальным бот ответит «Нет прав». Подделать кнопку нельзя: данные кнопки подписаны секретом сайта.

После решения в тот же чат (и ту же тему) приходит итог: «✅ Материал одобрен: «…» — имя модератора». Повторное нажатие ответит «Уже решено на сайте».

Рабочие группы

«Дополнительные группы пользователей сайта» в опциях — группы учётных записей InstantCMS. Они определяют, кому присылать служебные сообщения лично, и не создают чат в Telegram. Рабочая группа Telegram — отдельный существующий чат, куда добавлен бот; события для него выбираются в «Каналы и чаты». Администраторы сайта получают служебные события лично автоматически, если подключили бота; галочки личных уведомлений в профиле не заменяют опции «Администраторам».

  1. Создайте группу в Telegram (или откройте существующую) и добавьте в неё бота сайта.
  2. Откройте Компоненты → Уведомления в Telegram → Каналы и чаты. Группа появится в списке сама. Администраторам, подключившим Telegram, бот пришлёт «Бот добавлен в группу».
  3. Нажмите «Настроить» и в блоке «Служебные уведомления» отметьте, что присылать: новые пользователи, модерация, комментарии, заявки форм, новые материалы, удаления, события других дополнений.
  4. По желанию нажмите «Тестовое сообщение» в строке группы.
Выбор для группы не зависит от опций «Администраторам». В группе нет кнопок «Настроить» и «Отключить» — они личные. Отладочные копии писем и уведомлений в группу не уходят.

Темы группы

Если в группе включены темы (форум), уведомления можно направить в отдельную тему: откройте нужную тему и отправьте в ней команду /topic. Бот ответит «Готово: уведомления сайта будут приходить в эту тему». Команда в общей теме возвращает уведомления туда. Выбрать тему может только администратор сайта, подключивший Telegram. Номер темы виден и меняется в настройках группы на сайте — поле «Тема группы».

Чтобы заявки и модерация шли в разные темы, удобнее две группы: например, «Заявки» и «Модерация».

Заявки «Форм»

Получателей выбирают отдельно у каждой формы: личные аккаунты и, при необходимости, рабочие группы. Адреса в поле получателей служат для поиска пользователей сайта; письмо этот блок не отправляет. Если человек одновременно выбран штатным получателем формы и получателем Telegram, ему приходит одна заявка с полями формы. При ошибке обязательного поля заявка не рассылается.

У каждой формы компонента «Формы» в настройках (Компоненты → Формы → форма → Изменить) появляется вкладка «Уведомления в Telegram»:

Получатели заявки в Telegram — выбранные во вкладке и те, кому форма штатно отправляет «Уведомление на сайте» или «Автору записи» (её Опции → Куда отправлять форму). Каждый из них получает одно сообщение с данными заявки — вместо копии штатного уведомления.

Если у формы нет ни тех, ни других получателей, заявки уходят по опциям компонента: администраторам лично и в рабочие группы, где отмечены заявки форм.

В сообщении — название формы, заполненные поля «Поле: значение», ссылки на приложенные файлы и кто отправил (имя или «Гость», IP). Под сообщением — кнопка «Страница с формой». Почтовый шаблон формы не меняется.

Автопостинг в каналы Telegram

Обложка из каталога загрузок сайта отправляется файлом; если Telegram её не принимает, причина доставки без обложки видна в журнале публикаций.

Канал — место для публичных постов с новыми записями сайта. Рабочая группа — место для выбранных служебных событий. Это два независимых назначения. Одинаковые названия канала и группы не делают их одним чатом. Компонент обнаруживает существующие чаты после добавления бота, но сам чаты не создаёт; появление строки в списке не включает отправки. Проверяйте обе колонки: «Новые записи сайта» и «Служебные события сайта». Если в тот же канал публикует SEOline или другое дополнение, оставьте автопостинг только в одном компоненте.

Новые записи сайта публикуются постами в ваши каналы через того же бота. С обложкой пост — фото с подписью: заголовок жирным, краткое описание и кнопка «Читать на сайте»; без обложки — текст с кнопкой. Всё настраивается во вкладке Каналы и чаты.

Подключить канал

  1. Откройте канал в Telegram → «Управление каналом» → «Администраторы» → добавьте бота сайта и оставьте право «Публикация сообщений».
  2. Откройте Каналы и чаты. Канал появится в списке сам. Администраторам бот пришлёт «Бот добавлен в канал».
  3. Нажмите «Проверить права» — в колонке «Состояние» должно быть «Бот на месте».
  4. Нажмите «Настроить», включите «Публиковать новые записи сайта» и выберите типы контента.
Сайт узнаёт о новом канале из событий Telegram, поэтому webhook должен быть подключён (или включён опрос). Если бота добавили раньше, удалите его из администраторов канала и добавьте снова.

Настройки канала

ПолеЧто делает
Публиковать новые записи сайтаГлавный выключатель
Типы контентаЗаписи каких типов публиковать; у каждого канала свой набор
Длина краткого описанияПо умолчанию 300 символов. В подписи к фото Telegram допускает до 1024 символов — длинное описание сокращается само
Ссылка на запись«Кнопкой под постом» или «Ссылкой в конце текста»
Текст кнопки или ссылкиПо умолчанию «Читать на сайте». Пусто — пост без ссылки
Обложка, размер обложки, краткое описаниеДля каждого отмеченного типа контента — из какого поля брать картинку и текст. Telegram скачивает картинку по адресу на сайте; если не смог — пост уйдёт текстом

Какие записи публикуются

Отложенные записи. Поставьте задаче планировщика «Публикация контента по расписанию» период 5–10 минут (Настройки → Планировщик), иначе пост выйдет при её запуске раз в сутки.

Публикации

Вкладка Публикации — все записи, ушедшие в каналы: дата, запись, канал, состояние («В очереди», «Опубликовано», «Ошибка», «Пропущено») и ссылка «Пост ↗». Действие «Опубликовать» у ошибки или пропуска отправляет запись ещё раз.

Админка компонента

ВкладкаЧто там
СостояниеШаги настройки, бот, связь с Telegram (напрямую, свой адрес API, прокси), webhook и его ошибки, подписчики, доставка за 24 часа, каналы и чаты, тихие часы, лицензия
ПодписчикиКто подключил Telegram, состояние, доставка и ошибки. Действия: тестовое сообщение, приостановить, возобновить, отключить Telegram
Каналы и чатыКаналы и группы, куда добавлен бот, что туда уходит и может ли бот писать. Действия: настроить, проверить права, тестовое сообщение, убрать из списка
ПубликацииЖурнал автопостинга
ЖурналКаждое сообщение — одна строка: когда, кому, какое уведомление, состояние и причина ошибки
ЛицензияСостояние лицензии

Все списки — штатные таблицы InstantCMS. На главной панели управления есть блок «Уведомления в Telegram».

Лицензия

Ключ вводить не нужно. После установки компонент сам получает пробную лицензию на 72 часа, автор подтверждает покупку, и лицензия становится бессрочной для домена сайта.

Вместе с «Уведомлениями в MAX»

Компонент работает на одном сайте с «Уведомлениями в MAX» того же автора: у пользователя в профиле два блока, и он выбирает, куда получать уведомления — в Telegram, в MAX или в оба. Настройки, группы и журналы у компонентов свои.

Если что-то не так

ПризнакЧто проверить
«Проверить подключение»: 401 или 404 Unauthorized / Not FoundТокен скопирован не полностью или отозван у @BotFather. Если указан свой адрес API — проверьте его
«Проверить подключение»: cURL error, timeoutХостинг не достаёт до api.telegram.org — см. «Если Telegram недоступен»
Ошибка 407 или «answer is not from the Bot API»Неверный логин или пароль прокси, либо адрес API ведёт не туда
«Webhook работает только на сайте с HTTPS»Адрес сайта в настройках CMS начинается с http://. Включите HTTPS или используйте опрос
Бот не отвечает на «Запустить» и кнопкиНа «Состоянии» нажмите «Проверить подключение»: появится последняя ошибка доставки webhook. Если события не доходят, включите опрос
Опрос не работает, ошибка 409 ConflictПодключён webhook или тот же бот используется другой программой. Нажмите «Отключить webhook»
Уведомления не приходятОткройте «Журнал». «В очереди» долго — проверьте cron. В «Подписчиках» состояние «На паузе» — человек нажал «Отключить»
«Одобрить» отвечает «Нет прав»Telegram нажавшего подключён к учётной записи, которая не администратор и не модератор этого типа контента
Группа стала супергруппойНичего делать не нужно: компонент сам переходит на новый адрес группы
Кнопки не появились в сообщенииTelegram не принимает ссылки на сайт с адресом вида *.test или localhost — на тестовом сайте сообщение уходит без кнопок
Админка открывает только «Лицензия» и «Инструкция»Пробный срок истёк, а покупка ещё не подтверждена

Удаление

Сначала нажмите «Отключить webhook», затем Компоненты → Уведомления в Telegram → Удалить. Таблицы с подписчиками, каналами, журналом и лицензией остаются в базе, чтобы после повторной установки пользователям не пришлось подключаться заново. Папку docs/_shared удалять не нужно: это общее оформление руководств других дополнений автора.