Эта статья для тех, кому интересно, что происходит между кнопкой «Напоминать в Telegram» и сообщением в мессенджере. Пользоваться напоминаниями можно и без этого, а вот доверять каналу легче, когда понимаешь, как он работает.
Почему бот один, а не свой у каждого салона
Мы могли бы просить каждый салон завести бота через BotFather, вставить токен в настройки и настроить вебхук. Мастер, который работает один, бросит это на втором шаге. И будет прав: он пришёл принимать записи, а не администрировать ботов.
Поэтому бот один на всю платформу. Клиент видит название салона в тексте сообщения, а отправитель общий. Это честно: человек подписался на напоминания сервиса, а не начал переписку с мастером.
Салон, которому нужен именно свой бот со своим именем, подключает его как интеграцию. Это отдельный канал, и он работает как раньше.
Что зашито в ссылку подписки
Кнопка на странице записи ведёт на t.me/<бот>?start=<маркер>. В маркере четыре части:
777-52-1788438490-a3d2dc5d8e7c8e76e359
│ │ │ └─ подпись
│ │ └─ срок действия
│ └─ компания
└─ клиент
Состояние на сервере не хранится: ни таблицы, ни записи в кеше. Маркер живёт сутки и проверяется подписью, поэтому переживает перезапуск сервера и очистку кеша, и его не нужно чистить по расписанию.
Почему подпись такая короткая
Подпись в маркере — 20 знаков, 80 бит. Это не экономия. Telegram ограничивает полезную нагрузку команды /start 64 символами, и в них надо уместить ещё три числа. Полная подпись туда не входит.
80 бит для маркера, который живёт сутки и даёт право получать напоминания об одном визите, достаточно с запасом. Подобрать его перебором дороже, чем позвонить в салон и спросить, когда запись.
Проверка подписи идёт функцией с постоянным временем выполнения. Обычное сравнение строк завершается на первом несовпавшем символе, и по времени ответа можно подбирать подпись по одному знаку.
Отклоняется всё, что не сошлось: поддельная подпись, подменённый клиент или салон, просроченный маркер. На это есть тест, который пытается подменить каждую часть.
Что делает бот
| Команда | Действие |
|---|---|
/start с маркером | Привязывает чат к карточке клиента |
/start без маркера | Объясняет, что открывать надо со страницы записи |
/stop | Отписывает от всех салонов сразу |
| любой текст | Объясняет, что бот не ведёт переписку |
/stop отписывает везде намеренно. Человек отказывается от рассылки, а не от одного мастера, и помнить, сколько их было, он не обязан. Просить его уточнить означает не отписать.
На посторонний текст бот отвечает, а не молчит. Молчащий бот выглядит сломанным, и клиент возвращается в салон с вопросом «а оно работает?». Но и переписку бот не ведёт и вида не делает: человек ждал бы ответа мастера.
Как защищён вход
Адрес, на который Telegram присылает сообщения, открыт всему интернету, иначе Telegram до него не достучится. Настоящее сообщение от чужого отличает только секрет в заголовке, который задаёт наш же вызов при настройке вебхука.
Проверка закрывается, а не пропускает: секрет не задан — отказ. Без неё кто угодно мог бы прислать сообщение с чужим маркером и подписать свой чат на напоминания о чужих визитах, то есть узнавать, кто, когда и к какому мастеру ходит.
Что это значит для салона
Ничего не нужно настраивать. Кнопка появляется сама, когда бот платформы включён, и не появляется, когда нет: ссылка на несуществующего бота хуже её отсутствия. Если клиент подписался, напоминания уходят бесплатно и без лимитов.
Комментарии
Комментариев пока нет. Задайте вопрос — отвечаем в течение суток.