Многие читатели охотнее подпишутся в Telegram, чем оставят почту: ни адреса, ни письма подтверждения, отписаться — одна команда. На этом сайте подписка через бота работает рядом с почтовой и использует ту же таблицу подписчиков и ту же рассылку.
Это 15-я часть цикла «WordPress на кэшируемом сайте».
Ссылка вместо формы
Кнопка «подписаться в Telegram» — обычная ссылка на бота с параметром запуска:
https://t.me/<имя_бота>?start=subscribe
Человек открывает бота и нажимает «Запустить» — Telegram отправляет боту сообщение /start subscribe. Бот записывает идентификатор чата в таблицу подписчиков со статусом «активен» и отвечает: «Готово: пришлю сюда новую статью, как только она выйдет. Отписаться — /stop».
Для кэша это идеальный вариант: на странице нет ни формы, ни ответа сервера — одна и та же ссылка для всех.
Подтверждение не нужно. Подписать чужой Telegram нельзя: команду боту отправляет сам владелец аккаунта, нажав кнопку. Двойное подтверждение нужно почте, потому что почтовый адрес может ввести кто угодно.
Команды
| Команда | Что делает |
|---|---|
/start subscribe, /subscribe | подписать этот чат |
/stop, /unsubscribe | отписать; бот подтверждает и подсказывает, как подписаться снова |
Как бот узнаёт о сообщениях
Обычно бот получает сообщения через вебхук: Telegram сам присылает запрос на сервер. Наш сервер для Telegram снаружи недоступен, поэтому бот сам забирает новые сообщения раз в минуту — тем же кроном WordPress:
function tg_bot_poll(): void
{
if (get_transient('tg_bot_poll_lock')) {
return; // прошлый опрос ещё идёт
}
set_transient('tg_bot_poll_lock', 1, 50);
$offset = (int) get_option('tg_bot_offset', 0);
$updates = tg_api('getUpdates', ['offset' => $offset, 'timeout' => 0, 'allowed_updates' => ['message']], 20);
if (is_wp_error($updates)) {
error_log('[tg-bot] getUpdates: ' . $updates->get_error_message());
delete_transient('tg_bot_poll_lock');
return;
}
foreach ($updates as $u) {
// смещение — до обработки: сбой на одном сообщении не зациклит весь опрос
update_option('tg_bot_offset', (int) $u['update_id'] + 1, false);
// … команды подписки, сообщения посетителей
}
delete_transient('tg_bot_poll_lock');
}
- замок на 50 секунд — меньше минуты, чтобы следующий запуск не пропал, если этот завершился аварийно;
- смещение двигается до обработки сообщения. Если обработка одного упадёт, следующий опрос его не получит снова. Лучше потерять одну команду, чем повторять её каждую минуту бесконечно;
- ответ подписчику приходит с задержкой до минуты. Для подписки это незаметно.
Всё это держится на работающем кроне: на сайте со страницами из кэша это системный крон раз в минуту (вторая часть).
Рассылка — общая с почтой
Новая статья запускает одну рассылку на оба канала (прошлая часть): та же пачка из 40 подписчиков, только для Telegram вместо письма — сообщение с заголовком, кратким описанием, ссылкой и напоминанием про /stop. Между сообщениями — пауза 60 мс, чтобы не упереться в ограничения Telegram на частоту отправки.
Что ещё умеет этот бот
Тот же бот принимает сообщения посетителей и пересылает их в рабочую группу, а ответы из группы — обратно посетителю, не раскрывая личных аккаунтов. Это отдельная история, к кэшу отношения не имеющая, — напишу о ней отдельно.
Хотите подписку на обновления в Telegram?
Пришлите адрес — подключу бота к сайту, с общей рассылкой для почты и Telegram.
// загружаю комментарии…