feat: DrHider MVP — two-pass document obfuscation service
Deploy contracts-flask / validate (push) Successful in 0s

This commit is contained in:
2026-06-29 14:28:27 +04:00
parent c452742271
commit 4956ca1670
4 changed files with 681 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
# Запрос Opus — ревью реализации DrHider
Дата: 29.06.2026
## Контекст
Написан MVP сервиса обфускации документов. Код в трёх файлах. Нужно ревью: что упущено, что сломается, что улучшить.
## Файлы (все в contracts-flask)
1. **`deploy/services/drhider.py`** — ядро (≈280 строк)
2. **`site/templates/drhider.html`** — страница загрузки
3. **`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/позже/опционально)**.