Делали ли вы электронную визу в Индию? А, может, в Южную Корею? Или подавались на лотерею Green Card в США? Если да, то вы точно знаете, что для заявки на все эти документы надо прикрепить фотографию определённого размера с целым набором требований...
А такое ну просто необходимо автоматизировать!
И, как можно догадаться, сайтов для автоматизации фотографий на документы просто куча. Только вот есть одна проблема: все эти сайты хотят много денег - от 5 до 12 долларов за приведение фото к нужным требованиям.
Терпеть такое я, конечно же, не стал и написал своего бота в Телеграме, который делает это всё бесплатно.

С чего всё началось
Сидел я одним зимним вечером на диване. А моя девушка планировала поезду с подругами в Китай и в это время заполняла анкету на визу (да-да, тогда еще нужны были визы!).
Когда она всё заполнила, я подошёл поинтересоваться, как все прошло. И вдруг обнаружил, что для подачи заявки она с подругами купила создание фото на визу за 400 рублей. Тогда я подумал про себя: "А отличный бизнес можно сделать - удаляем задний фон, выравниваем лицо на фото - и ко мне потекут горы денег. Богатство и слава! АХАХАХАХАХ!" И благополучно забыл об этом.
И вот, спустя почти год, мне на работе стало скучно, и я решил, что пора приниматься за дело (естественно, в рабочее время). Получилось сделать бота быстро и хорошо (в течении одной недели), поэтому решил оставить его бесплатным для всех.

Придумываем архитектуру
Делаем мы приложение для себя, поэтому самое главное - чтобы его было приятно разрабатывать. Поэтому в выборе архитектуры я полагался только на свои специфичные вкусы.
Я люблю Телеграм-ботов - их просто и быстро делать, поэтому будем делать свой собственный Телеграм-миниапп для обработки фото на визы.

Чтобы сделать Телеграм-миниапп, у нас будут следующие компоненты:
Bot server
Обычный сервер на питоне, который:
обрабатывает сообщения от пользователя в чате
дает ему ссылку на фронтенд
принимает от фронтенда запрос на обработку фото и кладет его в очередь
когда фото готово, отправляет его пользователю в чат
Frontend miniapp
А вот это у нас будет сайт на React!
Если давать юзеру интерфейс через чат Телеграма, то это неудобно (как из огромного списка стран для документов найти нужную?) и не очень красиво (хочется показать приятный лоадер, пока генерируем фото). А миниаппы в Телеграме позволяют нам открыть свой сайт и избавиться от всех этих проблем.
Этот сайт будет:
давать пользователю возможность выбрать страну, выбрать тип документа и загрузить фото
показывать красивый лоадер, пока мы генерируем для пользователя фото
Photo processing worker
Это будет простенький сервис на питоне, который:
принимает фото из очереди
обрабатывает его и передает нашему Bot Server'у
Что ж, архитектура спланирована, пора приступать к реализации.
Займемся скраппингом данных
У каждой страны и у каждого документа есть свои требования к:
- размерам (в пикселях, мм или дюймах)
- расположению лица на фото (какой размер лицо занимает по высоте, размер отступа от верха фото до макушки и т.д.)
- размеру файла (у некоторых документов в Китае максимальный размер 40кб)
- цвету заднего фона (некоторые просят голубой фон вместо белого)
Так как же нам их получить? Все просто - украсть с других сайтов. Вместо тысячи слов вот вам ссылка на репозиторий со скриптами для скраппинга и нормализации данных с одного известного сайта для виз + готовые JSON-файлы.
Создаем worker для обработки фото
Для обработки фото нам понадобится удаление заднего фона, поиск лица и его ключевых точек на картинке.
Удаление заднего фона - задача очень известная и решений опубликовано куча. Но не все они нам подойдут - тот же rembg довольно старый и плохо работает с волосами (а у нас их планируется много). Я решил взять свежую модельку ZhengPeng7/BiRefNet для поиска маски заднего фона.

Моделька довольно большая и на CPU работает медленно, поэтому пришлось взять тачку с RTX 3060 чтобы работало быстрее.
Для поиска лица и ключевых точек мы возьмем dlib. Он старенький, но в этой задаче нам ювелирная точность не понадобится.

Создаем сервер для нашего бота
Мы сделали worker, но чтобы отпралять туда запросы нам нужно обрабатывать запросы от пользователей в чате Телеграма. Давайте напишем бота!
Для создания бота я взял библиотечку python-telegram-bot, чтобы обрабатывать сообщения в чате Телеграма от пользователей и давать им ссылку на наш миниапп. И добавил FastAPI для двух роутов - один чтобы пользователь отправлял свою картинку и мы слали её в очередь, второй - чтобы принимать готовое фото от worker'а и слать его юзеру в чат.
Готовим фронтенд для миниаппа
Для frontend'а мы делаем все максимально просто - берем create-react-app и копируем дизайн текстов и кнопок как у бота @BotFather. И все, наш фронтенд готов!

Обходим ограничения Роскомнадзора
Наши три компонента системы готовы, и если мы их успешно задеплоили, то приложение должно работать без проблем. Так ведь?
Если вы, как и я, выбрали для деплоя фронтенда AWS, то у вас возникнут некоторые сложности... У ребят из России, когда они пользовались мобильным интернетом от МТС, фронтенд моего миниаппа просто не открывался (получается МТС блочат весь трафик на AWS?).
У меня как раз был сервер в Германии на хостинге hosting-russia.ru, к которому Роскомнадзор, похоже, относится более лояльно. Сделаем его прокси-сервером!
Делаем небольшую настройку NGINX для переадресации трафика с нашего сервера на AWS и Роскомнадзор перестал быть нам страшен. Пользователи из России спокойно смогут сгенерировать себе любые фотографии для виз!
Финальный результат
Посмотреть результат и сгенерировать себе фото на документы можно в photovisa_bot - абсолютно бесплатно и без регистрации.

Спасибо, что дочитали пост до конца! Думаю, теперь у вас не возникнет никаких проблем с созданием фото себе на визу ;)
Бро, это просто великолепно!
Это спасение от головняка с фотографиями на Госуслугах!
Спасибо огромное!
Круто, спасибо!
Как ни приду в фото студию, постоянно говорят то сядь ровно,т о подбородок выше, то рот закрыть и т.д.
Однако не знаю насколько поза и т.д на фотке важны
Планируешь ли как-то над этим поработать?