diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc
index 400f965..7483272 100644
Binary files a/photo_bot/__pycache__/handlers.cpython-313.pyc and b/photo_bot/__pycache__/handlers.cpython-313.pyc differ
diff --git a/photo_bot/handlers.py b/photo_bot/handlers.py
index 57f2ea5..5cde631 100644
--- a/photo_bot/handlers.py
+++ b/photo_bot/handlers.py
@@ -368,6 +368,7 @@ async def photo_module_handler(msg: Message):
check_res.get('forced_moderation'),
check_res.get('timings'),
check_res.get('ai_metrics'),
+ frame=check_res.get('frame'),
),
parse_mode="html"
)
diff --git a/utils/__pycache__/__init__.cpython-313.pyc b/utils/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..1f0e251
Binary files /dev/null and b/utils/__pycache__/__init__.cpython-313.pyc differ
diff --git a/utils/__pycache__/texts.cpython-313.pyc b/utils/__pycache__/texts.cpython-313.pyc
index 3511c60..398bafe 100644
Binary files a/utils/__pycache__/texts.cpython-313.pyc and b/utils/__pycache__/texts.cpython-313.pyc differ
diff --git a/utils/texts.py b/utils/texts.py
index c827b8a..97b63df 100644
--- a/utils/texts.py
+++ b/utils/texts.py
@@ -301,7 +301,7 @@ def _photo_test_receiving(emojis: dict) -> str:
def _photo_test_result(verdict: str, reason: str, cv_approved=None, cv_reason: str = '',
forced=None, timings: dict = None, ai_metrics: dict = None,
- emojis: dict = None) -> str:
+ frame: dict = None, emojis: dict = None) -> str:
emojis = emojis or {}
icons = {"Прошел": "✅", "Не прошел": "❌", "На модерацию": "⏳"}
icon = icons.get(verdict, "ℹ️")
@@ -326,6 +326,19 @@ def _photo_test_result(verdict: str, reason: str, cv_approved=None, cv_reason: s
else:
parts.append("🎯 CV-проверка: —\n")
+ # Метрики кадра, которые реально измерил сайт (виден именно проверенный кадр)
+ if frame:
+ bb = frame.get('face_bbox_px') or {}
+ try:
+ box = f"[{bb.get('x1')}..{bb.get('x2')}]×[{bb.get('y1')}..{bb.get('y2')}]"
+ parts.append(
+ f"📐 Кадр (измерено сайтом): {frame.get('img_w')}×{frame.get('img_h')} px, "
+ f"бокс лица {box}, голова {frame.get('head_pct')}% "
+ f"(норма ≥ {int(frame.get('min_head_percent', 30))}%)\n"
+ )
+ except Exception:
+ pass
+
if forced:
parts.append("ℹ️ На сайте включён режим принудительной модерации: в реальном режиме фото ушло бы модератору, а не было опубликовано сразу.\n")
@@ -475,9 +488,10 @@ PHOTO_TEST_AI_CHECKING_TEXT = _photo_test_ai_checking(EMOJI_DIGITS)
PHOTO_TEST_RECEIVING_TEXT = _photo_test_receiving(EMOJI_DIGITS)
def photo_test_result(verdict: str, ai_reason: str = '', cv_approved=None, cv_reason: str = '',
- forced=None, timings: dict = None, ai_metrics: dict = None) -> str:
+ forced=None, timings: dict = None, ai_metrics: dict = None,
+ frame: dict = None) -> str:
return _photo_test_result(verdict, ai_reason, cv_approved, cv_reason,
- forced, timings, ai_metrics, EMOJI_DIGITS)
+ forced, timings, ai_metrics, frame, EMOJI_DIGITS)
def photo_test_ai_error(error: str = '') -> str:
return _photo_test_ai_error(EMOJI_DIGITS, error)