Кейсы
Telegram-бот Автоматизация

Telegram-бот для OCR с монетизацией

Фото и PDF в бота — текст наружу через Vision LLM. Бесплатные лимиты, платные пакеты, ЮKassa, согласие по 152-ФЗ и админка прямо в Telegram.

2026 4 мин. чтения
Клиент Scan Text
Срок 10 дней
Стек Python 3.12 · aiogram 3 · PostgreSQL · SQLAlchemy 2 · Alembic
Результат Полноценный продукт: распознавание даже с корявых фото и многостраничных PDF, сброс лимитов по расписанию, идемпотентные платежи, соответствие 152-ФЗ, статистика по UTM.
  • 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. Никакой распознавания и сохранения до явного согласия.

Ссылки вида ?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.

Следующий кейс

Freelance Radar: ИИ-агент для поиска и фильтрации заказов

Автономная система мониторинга бирж и чатов. Парсинг 24/7, семантический анализ ТЗ через Gemini и скоринг лидов без ручного скроллинга.