4.8 KiB
Запрос Opus — ревью реализации DrHider
Дата: 29.06.2026
Контекст
Написан MVP сервиса обфускации документов. Код в трёх файлах. Нужно ревью: что упущено, что сломается, что улучшить.
Файлы (все в contracts-flask)
deploy/services/drhider.py— ядро (≈280 строк)site/templates/drhider.html— страница загрузкиsite/app.py— добавлены роуты/DrHiderиPOST /api/drhider
Что реализовано
Двухпроходная обфускация
- Проход 1 (сбор сущностей): regex-паттерны (телефон, email, ИНН/ОГРН/КПП, БИК, р/с, к/с, паспорт) + COMPANY_PATTERN (ООО/ЗАО/АО/ИП) + опционально LLM-NER для имён/адресов.
- Глобальный словарь
_mapping[оригинал] = заменаобеспечивает согласованность: одна сущность → одна замена во всех файлах. - Проход 2 (замена): docx — замена в
paragraphs.runsиtables.cells(python-docx). PDF — read-only через pdfplumber, замена по тексту (без сохранения форматирования — осознанное ограничение MVP).
Генераторы фиктивных значений
- Телефон:
+7 (XXX) XXX-XX-XXс реальными кодами городов. - Email:
<random>@example.ru(фиктивные домены). - ИНН/ОГРН: валидные контрольные суммы.
- Компании: ООО «<существительное>» из словаря.
- ФИО: русские фамилия + инициалы из словарей.
- Адреса: город + улица + дом из словарей.
- Паспорт:
XX XX XXXXXX.
Безопасность
- Вся обработка в памяти.
- Temp-директория для конвертации
.doc→.docx— удаляется вfinally. - Никакой БД, никакого логирования реальных данных.
mapping.csv— внутри ZIP, уходит пользователю.
UI
- Drag&drop, выбор файлов, прогресс.
- Кнопка «Обфусцировать» → POST /api/drhider → скачивание ZIP.
Вопросы к ревью
1. Согласованность замены
Сейчас _mapping — плоский словарь строка → строка. Если в одном файле «Иванов И.И.», а в другом «Иванов Иван Иванович» — это разные ключи, получат разные замены. Как правильно решить?
2. PDF
MVP: текст из PDF извлекается, заменяется, отдаётся как .txt внутри ZIP. Реальное решение — pymupdf (AGPL) или reportlab? Что посоветуешь?
3. .doc → .docx конвертация
Не реализована в этом MVP — файлы .doc просто читаются как текст. Нужно libreoffice (как в convert_doc.py) или есть способ проще?
4. LLM-NER
Сейчас опционален. Промпт просит JSON-массив сущностей. Не слишком ли медленно для 100+ файлов? Как оптимизировать?
5. Замена в docx через runs
python-docx разбивает текст на runs. Слово может быть разбито на несколько runs — замена ломается. Как обойти?
6. Номера договоров
Сейчас НЕ заменяются (нужны для группировки). Но это реальные данные — утечка. Как сделать чтобы были уникальные псевдонимы, но группировка не ломалась?
7. Упущенные типы данных
Что ещё нужно заменять, чего нет в текущих паттернах? (Колонтитулы? Сноски? Изображения с текстом? Подписи?)
8. Архитектура
Код в одном файле drhider.py — нормально для MVP или уже пора разбивать?
9. Edge cases
- Пустой файл?
- ZIP с вложенным ZIP?
- PDF без текста (сканированный)?
- Файл с паролем?
Ожидаемый ответ
По каждому вопросу: что не так → как исправить → приоритет (MVP/позже/опционально).