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)