BeeSection BeeSection

Как это устроено: почему один Telegram-бот на всех и как клиент подписывается

Заметка о том, как устроен Telegram-канал напоминаний: почему бот один на платформу, что зашито в ссылку подписки и почему подпись в ней такая короткая.

BeeSection · · 4 мин чтения
Читать на другом языке: Українська English

Эта статья для тех, кому интересно, что происходит между кнопкой «Напоминать в Telegram» и сообщением в мессенджере. Пользоваться напоминаниями можно и без этого, а вот доверять каналу легче, когда понимаешь, как он работает.

Почему бот один, а не свой у каждого салона

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

Поэтому бот один на всю платформу. Клиент видит название салона в тексте сообщения, а отправитель общий. Это честно: человек подписался на напоминания сервиса, а не начал переписку с мастером.

Салон, которому нужен именно свой бот со своим именем, подключает его как интеграцию. Это отдельный канал, и он работает как раньше.

Что зашито в ссылку подписки

Кнопка на странице записи ведёт на t.me/<бот>?start=<маркер>. В маркере четыре части:

777-52-1788438490-a3d2dc5d8e7c8e76e359
│   │  │          └─ подпись
│   │  └─ срок действия
│   └─ компания
└─ клиент

Состояние на сервере не хранится: ни таблицы, ни записи в кеше. Маркер живёт сутки и проверяется подписью, поэтому переживает перезапуск сервера и очистку кеша, и его не нужно чистить по расписанию.

Почему подпись такая короткая

Подпись в маркере — 20 знаков, 80 бит. Это не экономия. Telegram ограничивает полезную нагрузку команды /start 64 символами, и в них надо уместить ещё три числа. Полная подпись туда не входит.

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

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

Отклоняется всё, что не сошлось: поддельная подпись, подменённый клиент или салон, просроченный маркер. На это есть тест, который пытается подменить каждую часть.

Что делает бот

КомандаДействие
/start с маркеромПривязывает чат к карточке клиента
/start без маркераОбъясняет, что открывать надо со страницы записи
/stopОтписывает от всех салонов сразу
любой текстОбъясняет, что бот не ведёт переписку

/stop отписывает везде намеренно. Человек отказывается от рассылки, а не от одного мастера, и помнить, сколько их было, он не обязан. Просить его уточнить означает не отписать.

На посторонний текст бот отвечает, а не молчит. Молчащий бот выглядит сломанным, и клиент возвращается в салон с вопросом «а оно работает?». Но и переписку бот не ведёт и вида не делает: человек ждал бы ответа мастера.

Как защищён вход

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

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

Что это значит для салона

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

Статья помогла?

Похожие статьи

Как это устроено: почему сайт открывается на украинском, даже если в браузере русский
Как это устроено

Как это устроено: почему сайт открывается на украинском, даже если в браузере русский

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

· 2 мин чтения
Как это устроено: почему два администратора не посадят двух клиентов на одно время
Как это устроено

Как это устроено: почему два администратора не посадят двух клиентов на одно время

Проверка «время свободно» и сохранение записи — два разных действия, и между ними успевает пролезть вторая запись. Как блокировка на уровне базы закрывает эту щель для CRM, онлайн-записи и календаря сразу.

· 2 мин чтения
Как это устроено: адрес страницы записи и почему мы не подсказываем свободные
Как это устроено

Как это устроено: адрес страницы записи и почему мы не подсказываем свободные

Почему адрес страницы записи выбирает человек, а не система, какие слова зарезервированы, почему проверка отвечает только «да» или «нет» и почему адрес нельзя изменить.

· 3 мин чтения

Комментарии

Комментариев пока нет. Задайте вопрос — отвечаем в течение суток.

Оставить комментарий

Почта не публикуется. Она нужна только чтобы вам ответить.