Делали ли вы электронную визу в Индию? А, может, в Южную Корею? Или подавались на лотерею 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 - абсолютно бесплатно и без регистрации.

Спасибо, что дочитали пост до конца! Думаю, теперь у вас не возникнет никаких проблем с созданием фото себе на визу ;)
Бро, это просто великолепно!
Это спасение от головняка с фотографиями на Госуслугах!
Спасибо огромное!
В закладки !
.... и вы еще спрашиваете, в чем ценность Клуба и почему я тут остаюсь
по делу:
я печатаю все фото на доки на формате 9х12 матовой, тк это самый распространенный и дешевый формат. что бы оптимально было замосчаю фоткой весь кадр с отступами от краёв по 8мм, сохраняюю 150-300dpi, сохраняю *.tiff (без опций), *.pdf (1.3), по-моему сохраняю в CMYK пространстве, но в целом в печати могут и за меня и это бесплатно. разделяю фотки 1мм и перекрестья свеееееетло-серые, где резать (свыше 4см стоит поставить ещё полоску самую тонкую 0,1мм где резать, что бы не скривить самыми плохими ножницами . маникюрные справятся скривить на 2см шаге)
я помню глаза одного чела из фото на документы, когда я ему принес на печать фотки 9х12 самую дешевую позицию в их спектре услуг, но по сути дела мне была нужна французкая виза, которая у них бы обошлась в 55 раз дороже, а нож одолжил у сотрудника, а может и его попросил :)
__
контекст:
я дизайнер, был фотографом, и были времена, когда автоматизировал внутренними скриптами фотошоп (технический дизайн), а ещё стажировался в мастерской где печатли фото, в том числе и на документы :)) ретушировал себе фото на гос паспорт, из тех пор печатаю на все эти штуки одну и ту же фотографию уже лет 12
Просто шикарная работа, спасибо за такой классный инструмент! Подскажи пожалуйста, как обстоят дела с конфиденциальностью? Хранишь ли ты какие-либо материалы у себя или они удаляются сразу после обработки и сохраняются только в чате с Телеграмом?
Шикарный сервис! Проверил две фото для грин карты кропнутые ботом в Astar Photo validator. Все проходят!


Фича реквест: вообще убрать галочку включающую удаление фона и по умолчанию не удалять фон (чтобы никто не ошибся не удалил случайно)
круто!
Круто, спасибо!
Как ни приду в фото студию, постоянно говорят то сядь ровно,т о подбородок выше, то рот закрыть и т.д.
Однако не знаю насколько поза и т.д на фотке важны
Планируешь ли как-то над этим поработать?
Привет!
Вообще офигенная тема, спасибо что поделился. Однозначно буду пользоваться
Но есть фича-реквест: показывать что ты будешь делать с фотографией и возможность выключать какие-то навороты
Например, фото на гринку (лотерею), если мне не изменяет память, имеет требование - БЕЗ программной замены фона. У тебя же бот фон заменяет, что влечёт к непригодности фотографии для лотереи
Кто-то может упустить из виду этот момент, загрузить такое фото в анкету, после чего анкету молча забреют:(
🩷🩷🩷🩷🩷
Спасибо. Можно будет снести "Фото на документы" скачанную с торрентов сто лет назад.
Один момент важный: фото на лотерею грин-кард должны быть без обработки, только с обрезкой (так они всегда требовали). Не знаю насколько там умный парсер фоток с их стороны, но возможно будет блочить те, у которых фон убран, например. Возможно, это стоит сделать маленькой незаметной опцией
Очень круто! Только у меня на десктопной телеге обрезается по правому краю почему-то...