Многие читатели охотнее подпишутся в 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.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.