Кнопка «Написать в Telegram» на сайте обычно ведёт на личный аккаунт владельца. Отсюда три неудобства: личный ник висит на сайте для всех, ответить может только один человек, а переписка живёт в личных сообщениях и пропадает вместе с ними. На этом сайте кнопка ведёт на бота. Посетитель пишет боту, сообщение попадает в рабочую группу, ответ из группы бот отправляет посетителю. Всё это — 250 строк в теме WordPress, без отдельного сервера.

Это первая часть цикла «Мастерская разработчика». Цикл — о собственных инструментах вокруг сайтов: бот, сервер обновлений плагинов, зонды для проверки вёрстки — и о том, как не обмануть себя замером.

Схема

  1. посетитель открывает t.me/<бот> и пишет;
  2. бот отправляет текст в рабочую группу с шапкой: имя, ник, id;
  3. менеджер отвечает в группе ответом (reply) на это сообщение;
  4. бот находит, чьё это было сообщение, и копирует ответ посетителю.

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

Какое сообщение в группе от кого

Главная структура — карта «id сообщения в группе → id посетителя». Её пополняет каждое пересланное сообщение, по ней бот понимает, кому отправить ответ:

function tg_bot_map_add(array $msgIds, int $userId): void
{
    $map = get_option('tg_bot_map', []);
    foreach ($msgIds as $id) {
        $map[(int) $id] = $userId;
    }
    if (count($map) > 3000) {
        $map = array_slice($map, -3000, null, true);   // старые диалоги забываются
    }
    update_option('tg_bot_map', $map, false);           // false — не грузить на каждой странице
}

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

Текст — отправкой, файлы — копией

Текст бот отправляет в группу одним сообщением вместе с шапкой. С фото, файлом или голосовым так не выйдет, поэтому сначала уходит шапка, а за ней copyMessage — копия сообщения. Именно копия, а не пересылка (forwardMessage): у копии нет пометки «переслано от» со ссылкой на аккаунт посетителя, это просто сообщение бота — и ответ на него гарантированно пойдёт через бота.

Обратно — тоже copyMessage, из группы в личный чат посетителя. Так ответ может быть чем угодно: текстом, файлом, голосовым. Доставили — бот ставит под ответом реакцию 👍. Не доставили (например, посетитель заблокировал бота) — отвечает в группе «Не доставлено: …», чтобы менеджер не ждал зря.

Режим приватности бота не мешает

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

Без вебхука

Обычно бот получает сообщения вебхуком — Telegram сам присылает запрос на сервер. Наш сервер снаружи для Telegram недоступен, поэтому бот сам забирает новые сообщения раз в минуту через getUpdates, кроном WordPress. Как устроен этот опрос (замок, смещение до обработки, прокси) — в части про подписку через бота: это тот же бот, подписка на статьи и связь с посетителями живут в одном опросе.

$chat = $m['chat'] ?? [];
if (($chat['type'] ?? '') === 'private') {
    tg_bot_from_visitor($m, $group);                         // посетитель → группа
} elseif ((string) ($chat['id'] ?? '') === $group && !empty($m['reply_to_message'])) {
    tg_bot_from_group($m, $group);                           // ответ менеджера → посетителю
}

Защита и учёт

  • лимит 30 сообщений в час от одного посетителя — счётчик в транзиенте; сверх лимита бот молча не пересылает;
  • сообщения других ботов игнорируются;
  • приветствие на /start со ссылкой на политику обработки данных: отправляя сообщение, человек передаёт имя и ник;
  • переписка в админке: на каждого посетителя одна запись типа «заявка» (как у формы на сайте), каждое сообщение дописывается строкой с датой и стрелкой → или ←, плюс статус доставки.

Переписка в админке — не только для отчёта. Telegram-группу можно случайно очистить или потерять доступ к ней, а заявки на сайте остаются, рядом с заявками из формы.

Что не получилось бы с личным ником

Личный аккаунтБот + группа
ник на сайтеличный, навсегдабота, можно сменить группу
кто отвечаетодин человеклюбой в группе
историяв личкев группе и в админке сайта
спамв личкулимит и игнор ботов
ушёл сотрудникпереписка ушла с нимосталась

Нужен такой бот на ваш сайт?

Напишите — сделаю связь через Telegram без личного аккаунта, с перепиской в админке.

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

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

Комментарии

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

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