Задача
К офтальмологу приходят и с реальными жалобами, и «просто проверить». Разбирать это на приёме — тратить время врача. Бот берёт первичный сбор на себя: задаёт вопросы, проводит тесты, считает уровень срочности и присылает врачу готовый протокол — приём начинается не с чистого листа.
Проект прошёл три версии технического задания за полтора года: от анкеты со светофором до платформы с интерактивными тестами, юридически корректными согласиями и ветвлением по точному возрасту пациента.
Развитие продукта
- v1.0 · май 2025Анкета и светофорДве ветки — ребёнок и взрослый, скоринг по красным флагам и факторам приоритета, три уровня срочности, запись на приём.
- v2.0Блок интерактивных тестовСетка Амслера и проверка на астигматизм с картинками, тест на конвергенцию для детей. Скоринг переписан целиком: восемь красных флагов, семь факторов приоритета.
- v3.0 · август 2026Ребрендинг, 152-ФЗ и анамнезРаздельные согласия на персональные данные и данные о здоровье, блок соматического анамнеза с 12 лет, три дополнительных теста, свободный ответ на любом вопросе. Двадцать новых полей и миграция боевой базы без потерь.
Что оказалось нетривиальным
- Свободный ответ на каждом из 42 экранов. ТЗ требовало текстовое поле везде. Вместо 42 обработчиков — один механизм: экран объявляет, какое поле заполняет и куда вести дальше. Новый вопрос подключается одной строкой.
- Движок однотипных блоков. Три батареи вопросов, 19 штук суммарно, описаны данными, а не кодом. Врач правит формулировку без программиста.
- Ветвление по точному возрасту. Детям до трёх лет тесты с картинками не показываются — ребёнок не скажет, волнистая ли линия. Блок анамнеза открывается с 12 лет по введённому возрасту, а не по диапазону: иначе двенадцатилетний из группы «7–12» его бы не получил.
- Фейковый Telegram для тестов. Подменён транспорт aiogram: настоящий диспетчер получает настоящие апдейты, исходящие вызовы перехватываются. Весь сценарий прогоняется за секунды без реального бота — и уже ловил ошибки, которые дошли бы до пациентов.
- Миграция под живой нагрузкой. На сервере работала старая версия с реальными пациентами. Схема расширяется на старте: недостающие колонки добавляются автоматически, данные остаются на месте. Проверено на копии до того, как коснулось боевой базы.
- Протокол без внешних сервисов. Генератор документа переписан с Node.js на python-docx, картинки тестов рисуются кодом. Сервер держит только Python — нечему ломаться при обновлении и нет вопросов по лицензиям на изображения.
Эксплуатация
Развёртывание — systemd-сервис с автоперезапуском и стартом после перезагрузки. Данные — один файл SQLite, резервная копия перед каждым обновлением. Приватность — согласия по 152-ФЗ, удаление данных командой пользователя.
Границы применимости
Скрининг на экране телефона не может быть точным: изображение масштабируется под устройство, а угловой размер сетки Амслера при этом плывёт. Поэтому бот нигде не ставит диагноз — он сортирует по срочности и передаёт наблюдения врачу.
- Дисклеймер показывается перед тестами и повторяется в каждом результате.
- Дополнительные тесты не влияют на итоговый уровень срочности — только на протокол.
- Спорные места ТЗ вынесены в код отдельным блоком допущений, чтобы врач мог их подтвердить или изменить.
Цифры
26
автотестов · 693 строки
Бот в Telegram: @EyeCheck_robot. Данные о нагрузке приведены на август 2026.