Кнопка «Написать в Telegram» на сайте обычно ведёт на личный аккаунт владельца. Отсюда три неудобства: личный ник висит на сайте для всех, ответить может только один человек, а переписка живёт в личных сообщениях и пропадает вместе с ними. На этом сайте кнопка ведёт на бота. Посетитель пишет боту, сообщение попадает в рабочую группу, ответ из группы бот отправляет посетителю. Всё это — 250 строк в теме WordPress, без отдельного сервера.
Это первая часть цикла «Мастерская разработчика». Цикл — о собственных инструментах вокруг сайтов: бот, сервер обновлений плагинов, зонды для проверки вёрстки — и о том, как не обмануть себя замером.
Схема
- посетитель открывает
t.me/<бот>и пишет; - бот отправляет текст в рабочую группу с шапкой: имя, ник, id;
- менеджер отвечает в группе ответом (reply) на это сообщение;
- бот находит, чьё это было сообщение, и копирует ответ посетителю.
Посетитель не видит ни группы, ни других людей — только бота. Ответить может любой из группы.
Какое сообщение в группе от кого
Главная структура — карта «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 без личного аккаунта, с перепиской в админке.
// загружаю комментарии…