После публикации статьи работа обычно ещё не заканчивается. Нужно открыть канал, загрузить обложку, написать несколько строк и добавить ссылку. Если каналов два, всё приходится повторять.

Для своего журнала я настроил автоматические анонсы в Telegram и MAX. Теперь публикация на сайте запускает отправку в оба канала. В каждом появляется обложка, короткое описание и предложение перейти к полной статье.

Статья остаётся на сайте

В каналы отправляется анонс. Полный текст, оглавление и остальные материалы доступны на сайте.

Для анонса используются название статьи, её краткое описание и обложка. Такой формат позволяет быстро понять тему публикации и решить, хочется ли читать дальше.

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

Обложка тоже важна

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

У каждой статьи журнала своя тематическая обложка. Эта же иллюстрация используется в анонсе. Она помогает связать запись в канале с материалом, который откроется после перехода.

Для Telegram изображение загружается непосредственно с сервера. В MAX используется ссылка на обложку, размещённую на сайте. Оба варианта проверены на опубликованных материалах.

Отправка через небольшую очередь

Анонсы не отправляются прямо во время сохранения записи. После публикации для каждого канала создаётся отдельное задание.

На сервере раз в минуту проверяется очередь. Это позволяет отделить публикацию статьи от обращения к внешним сервисам и обрабатывать отправку независимо для Telegram и MAX.

Из-за такой схемы анонс может появиться с небольшой задержкой. Для моего журнала это удобнее, чем связывать сохранение записи со временем ответа мессенджера.

Как это устроено технически

На сайте работают два небольших плагина WordPress — отдельно для Telegram и MAX. Они установлены как MU-плагины: WordPress загружает их автоматически.

Плагины отслеживают событие transition_post_status. Когда обычная запись впервые переходит в состояние publish, проверяются условия отправки: статья открыта, не защищена паролем и ещё не имеет отметки об анонсе. После этого через wp_schedule_single_event создаётся задание в очереди WordPress.

Обработку очереди запускает системный cron раз в минуту. Поэтому отправка не зависит от того, посещает ли кто-нибудь сайт в этот момент.

Обработчик получает название, краткое описание, постоянную ссылку и обложку статьи. Затем формирует запрос к API мессенджера:

  • в Telegram — sendPhoto, с загрузкой файла обложки и подписью;
  • в MAX — POST /messages, с изображением и кнопкой-ссылкой «Читать на сайте».

Соединения используют HTTPS с проверкой сертификатов. Токены ботов хранятся в закрытых конфигурационных файлах вне публичного каталога сайта.

Для каждой статьи сохраняются состояние отправки и идентификатор сообщения в каждом канале. Дополнительно используется блокировка, чтобы два одновременно запущенных обработчика не отправили один анонс дважды. Если ответ мессенджера потерялся и результат неизвестен, автоматическая повторная отправка не выполняется — сначала нужно проверить канал.

Обновление статьи не должно создавать дубль

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

Поэтому отправка запускается при переходе записи в опубликованное состояние. Для статьи сохраняется результат отдельно по каждому каналу: отправлена ли она и какой идентификатор получил анонс.

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

При этом уже отправленные сообщения не обновляются автоматически вместе со статьёй. Если меняется заголовок или смысл краткого описания, анонс нужно проверить отдельно.

Почему нельзя повторять любую неудачную отправку

Самая неприятная ситуация — когда сервер отправил запрос, но не дождался ответа.

Это ещё не означает, что сообщения в канале нет. Мессенджер мог принять публикацию, а соединение оборвалось уже после этого. Безусловный повтор способен создать дубль.

В моей настройке такая отправка отмечается как неопределённая и требует проверки. Автоматические повторы предусмотрены для явного ограничения частоты запросов и ограничены по количеству.

Мне важнее разобраться с сомнительной отправкой, чем получить несколько одинаковых сообщений подряд.

Старые статьи отправили отдельно

На момент подключения каналов в журнале уже были публикации. Для них потребовалась отдельная отправка архива — по порядку выхода на сайте.

В каждом анонсе проверили заголовок, обложку и ссылку. Затем сверили последовательность сообщений.

Архивная отправка не стала частью обычной автопубликации. У уже размещённых статей сохранены отметки об отправке, поэтому последующие правки не должны заново публиковать их в каналах.

Что получилось

Проверка закончилась не только установкой кода. Новая статья появилась на сайте, а её анонсы были отправлены в Telegram и MAX. В сообщениях проверили изображения и ссылки на нужный материал.

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

Это небольшое изменение, но оно убрало повторяющуюся работу. А время, которое раньше уходило на копирование ссылок и загрузку картинок в два канала, можно потратить на следующую статью.