Telegram-бот для OCR с монетизацией
Фото и PDF в бота — текст наружу через Vision LLM. Бесплатные лимиты, платные пакеты, ЮKassa, согласие по 152-ФЗ и админка прямо в Telegram.
- Vision LLM OCR вместо классического движка
- 2 лимита Бесплатно + пакеты, сброс по крону
- 152-ФЗ Согласие до любой обработки
Проблема
Запрос: бот, чтобы студенты кидали фото конспектов или сканы и получали текст. Задача простая на словах, но потребовала лимитов, оплаты, учёта персданных и админки без отдельного интерфейса.
Было
Заказчику нужен бот для аудитории (студенты, преподаватели): скинул фото или PDF — получил текст. Без бота люди перепечатывали вручную или пользовались разрозненными сервисами. Ни лимитов, ни монетизации, ни учёта согласий на обработку персданных не было: всё это предстояло спроектировать и встроить в один продукт.
Что построено
Единый контур: пользователь отправляет фото или PDF в Telegram — бот возвращает распознанный текст. Под капотом: лимиты (бесплатные страницы сбрасываются по расписанию, платные пакеты — отдельный баланс), оплата через ЮKassa, обязательное согласие на обработку персданных по 152-ФЗ, UTM-метки из deep link и админка в самом Telegram.
1. OCR через Vision LLM (OpenRouter)
Не классический OCR-движок: изображение ресайзится и уходит в Vision-модель с system-промптом. На выходе — структурированный текст даже с нечётких или под углом фото. Качество выше, чем у «слепого» распознавания по пикселям.
2. PDF — в картинки, потом OCR
Многостраничные PDF обрабатываются так: pypdf + pdf2image + Poppler рендерят каждую страницу в изображение, каждая страница отдельно прогоняется через Vision LLM. Работает и для сканов учебников, и для сгенерированных PDF.
3. Двойные лимиты
Бесплатный лимит страниц в день сбрасывается по расписанию (Celery Beat). Платные пакеты — персональный баланс в БД с сохранённым «снимком» тарифа на момент покупки: подменить условия после покупки нельзя. Логика зафиксирована в миграциях (007, 008).
4. Оплата через ЮKassa
Пользователь выбирает пакет в боте → бот отдаёт ссылку на оплату → ЮKassa при успехе шлёт webhook → баланс зачисляется. Важно: один платёж обрабатывается один раз. У каждого платежа уникальный ключ идемпотентности; повторный приход того же webhook не приводит к повторному зачислению.
5. 152-ФЗ: согласие до обработки
Middleware перехватывает каждого нового пользователя. Пока не принята политика обработки персданных — бот не обрабатывает ни фото, ни PDF. Никакой распознавания и сохранения до явного согласия.
6. UTM из deep link
Ссылки вида ?start=utm_source_X пишут источник трафика в базу. Можно смотреть, откуда приходят пользователи и кто в итоге платит.
7. Админка в Telegram
Статистика пользователей, ручное изменение балансов, рассылка, настройки лимитов — всё через команды и кнопки бота. Отдельный веб-интерфейс не нужен.
Хитрые детали
- Идемпотентность платежей: webhook от ЮKassa может прийти дважды. Проверка по уникальному ключу перед зачислением исключает двойное списание и двойное начисление.
- Лимиты и пакеты: бесплатные страницы живут до сброса по крону; платные — это баланс в БД плюс snapshot тарифа на момент покупки, без «подкрутки» задним числом.
- Деплой: описан вариант на Docker Compose (bot, worker, beat, БД, Redis) и вариант без Docker: системные PostgreSQL и Redis, Nginx + Certbot или Traefik.
- Качество: pytest с реальными PostgreSQL и Redis в CI, Ruff, Mypy; GitHub Actions на каждый пуш.
Под капотом
Поток запроса и оплаты:
Пользователь
→ Telegram Webhook → aiogram
→ Middleware: 152-ФЗ, лимиты
→ Celery Task: pdf2image / resize → OpenRouter Vision API
→ Результат → пользователь
ЮKassa → Webhook → проверка idempotency_key → зачисление баланса
До / После
| Показатель | До (без бота) | После (с ботом) |
|---|---|---|
| Получение текста | Ручное перепечатывание, сторонние сервисы | Фото или PDF в бота — текст в ответ |
| Качество OCR | Зависит от сервиса | Vision LLM, лучше на корявых фото и сканах |
| Лимиты и оплата | Нет единой системы | Бесплатный лимит + пакеты, сброс по расписанию |
| Персданные | Не формализовано | Согласие до обработки, соответствие 152-ФЗ |
| Управление | — | Админка в Telegram: балансы, рассылка, настройки |
Итог
Полноценный продукт с монетизацией, а не прототип: распознавание фото и PDF через Vision LLM, платёжный контур без дублей, лимиты с честным сбросом, учёт согласий и статистика по источникам. Production ready.
Нужен похожий бот с лимитами и оплатой под свою аудиторию? Напишите — обсудим.
Полноценный продукт: распознавание даже с корявых фото и многостраничных PDF, сброс лимитов по расписанию, идемпотентные платежи, соответствие 152-ФЗ, статистика по UTM.