From b5cd3df5dd527c786111fa09d3c541f4db388518 Mon Sep 17 00:00:00 2001 From: dddennnisss Date: Sun, 23 Aug 2026 04:33:19 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82-=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC:=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=B4=D1=80=D0=B0=20=D0=B8=D0=B7=20/check/=20(?= =?UTF-8?q?=D0=BA=D0=B0=D0=BA=D0=BE=D0=B9=20=D0=BA=D0=B0=D0=B4=D1=80=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D1=80=D0=B8=D0=BB=20=D1=81=D0=B0=D0=B9?= =?UTF-8?q?=D1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/handlers.cpython-313.pyc | Bin 28935 -> 28989 bytes photo_bot/handlers.py | 1 + utils/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 126 bytes utils/__pycache__/texts.cpython-313.pyc | Bin 50826 -> 51854 bytes utils/texts.py | 20 +++++++++++++++--- 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 utils/__pycache__/__init__.cpython-313.pyc diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc index 400f9651e042d97f4a4cea642b52b0accfff9903..74832722641e9c345510b11c7bd91c7fadf22fc1 100644 GIT binary patch delta 2258 zcmZXUe{54#6vyxFyZy1QuiM&0N#6)8>O+-cGUSa|ojfx~}q9h<=|L9~4A>to+?tL9G+T@+{ zKIePRz2}{K(-$t|&o5(nMV6fie*3CkeC(?aItZIJcfB z@m~@i%`$nIJpyK%uWcnaeI zvFeF7jkVDn9%KjT$+eruEN-OJT-DuX*Q|aQ#1%H7jNnw^J>>$%X?7q@!)h*nH?`_t zsTsad7l~mOinTDWnzn0Wepn*QCe)a3C|A8&r4L)-6_hPq5+9pm4+>Z9^V zVjqmJ0)`gc{xVzkdGQF_k;&sxb}rLl-xjeTG`)@;%lPC`zRXxS0_Uu6V^K}V_ps-* znEhVyMcdh|RvXau9r{>YszbRWtJ{w?>i6k8*-b4Tc)-l;lBQj`ZFhB-o@3dpiXUXJ zWW#tD`yjgkPq1qpes&{!BK4{RY3|X-!OEk%glz}w8a*!T0bx6Z^@1%OT^9CDu+Gs1 zVGpv4L$&f#o20d93X8}Da}4kHy`-b*a#}uxr_jH&ZuZRZF5F-EdAI`OakjK2iSK8v zTld%Q9xI1=TXc*5P}~9^xOepf#<4!heje^)mJuI*xKKTE$Rb;(W+wMO(t>9`f~>;( z+s;UMwy;khB=|FSa%XGlX$a5Qx%r9xw)3cyz}3D0_~e6yL*t6AZLYfhXyoixHVDkz$$a>IcSBz^=RSfp6xh4REobu zsU8acbPuMAi=6I_a5~cfR7TD;rpq~g69e>+Z+bd7ecJ?7MZRrT+#J8-m45PFZw;sK zy+A?oeI@mC{GkmnM1F{bIh}O_g~{2n20{5Qzy@-*oBBAPD+O#K=Uhsh<9RD!D>-kY zRUGGnfDtlRLj;9gG-X9|kqW9rrMZFioaUkHl!eSU5t4Zpo{z(pfblR>jBHi zl_nx+1Lmtd1pwMXr_z@hbEMg;(7aadi-2MN3{X8;(}lkS&@}?j(;XAsM;#sbkP9E zTaAGI(ybmUlK+AUW!&Vi08A0o+qHlddrYH>C3$X~u`{K&P2Xa;K6A@_Ts6 zomO!5(w+V!Cu1}8uf>S5xo?ADS`XYu4B8-;G-$I})1WOup(_ORBrz1LsVgvJ_!dJc zGxHQU^r6x`1geSw=vXAcEfYRe^x>k1nTR;tec@Y+K2r2iCshXRhLR|ua1)J`)k#wc z$w-ye(NqllMw_Th#jIvL0S)D$qck!XNJ~X;D|)!Ke4{kX9j=3shR%iO*OfCgEoO}3kjsIryjd7|nuN23-epcW^f7AK$5pzMU&sxj}J2|Vc8q|M02ttJnE zhY1cz;2{ql&MoQ;<$tO(2(iVzTkw3LYkCUXPVpFFN1v$1YYLw}(Sd6wt+?!%wt~1{ Pk&wl+Y~imnZIJm7sn!{v delta 2199 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 PudB;Fu&K*Tv;O}8Ou>(q delta 5652 zcmZ{n3tZIIw#WZ_X7&IBqw*MDit(eG3$8g+|JRsr*k!Lo$KlLNlzd9bk8}R?%In1{`sl-FniYi z{?>l{_pH6vuw%FRx$WkZZ|!!QhOb4(wl4eUVNJWKIz6xce&bu$t0@;v>>~WtRL0%` zm$|&=U6JiEiz)cd!S_^;Nj!>gJHGpQ%wzhAX|dWe%Q7Z2#d}1jqt^`2SW*MUOuss= zcZ5YerkEUWAh|>ypjCQiwu)JbdgOx!$2@YJU?8)JJmg7D)I2Pcbw7uk*xeVQV$K65 z`LJiiPt-}YIg=33W{G1ixL}EMyJ??1Y8M`%$W5>-Tsh*W#*{)2szXfe@Mz4X^a7aK;e zCbGmp)(|N%khMgXBB|*PX^U7#sMO%Jp2!mhvVlmMfz%LLW+1ghmK(@MA}hpG_$BuR z`X-{~HND6po+jiK&v+`tX2X386wi`UY4F`bWTk;@B_hRhcs6~@Y$NLHB^FUfq{>g` zsW{(Gs9Nm!$E7m3u}6H&*B zZa4V-hRBYZpNXgwB-I<7Um~*8Kwc)&U?8s$X*7^_B5+UWyh?PJ->*i+*lUD#8;0sc znhfM5kv;c>@asgI4SsJB*=r!Di0mVB+Mi6V;tbK2?%?RdX9@2YAN0Bp^A8CWZz>J5 za%-=4u2(xx;|}yHDq~y41)>M

GjwBO2VdbO#I%nGyXq)~DZ;X8KI=n$PTIUTvx7 zyj&f|V3K2&{-=^^_} zUSiU;cx{yC4G>J2gjrZdn!SPUKv+3B0zUkeeQ1!dx`XiQ1-R7(49u{ko4hu6@Ax8z zrnzl!W3mInvf`71-R7Q|i-J%I79nmkj>?*R9J#V9>C5GS^)&ATJr{c)R71uD7F%RQjSTSWKQL`(+n>Bno2P13Yr zJhp;>UT=GkDq<+{249PHiBi!M|;W$}@h&ODm_Z&n5ZZ6S(x)JVBb-GZO6J)^yqLo+@ zgicAAk=(mpq}xGD40Sttmx%nCB_ex9{L&JMKRJNVUiY6l0Eo{Hfe0GB2qH(OHnV}*nJtMpY?JIr@?FZFL<}{hetpvHON`4HRP`|;oiTtVu90lN4z5II zJ&9Pp4sW{0^0R0@sek9b$oM%lx9H~|4`BQPn)Uhz`O%DbpxLB8Lii0+yW0f2c3(f;lzR%{t>dXa2eSJVv`m|@hiyAL&3s@ ztOL$2yq|YszXNV#|04O67RK@4BYOw77JAsb#Qs$n&Obr+z8<;gRTIC8<_G#m#iJPi z6wN;ZTQZCV!1ct4Qgu6bYXx{B-LHI>pOinvZ7uMB$C{QI*sUaMatvBdlT>FYGnE}6 zcPP6{HHTGGubLyO*{PZaY<%ka!HY}coqs~(Gj;ZZ(5Th^J28G6F&LGa3Z27k;4F!-s}t{DjmeWRy(F3c8Oi6mujEI@Z=m@#tSa4Wzlqje zoLo*u18zj6K=u=r)-SO01B0_qe8{fD$_X)Wuq>Sa1)-*&Dl20M6PAzWx3F*3^Ot|k z_*ZD!VS0Hb`vO8ogu|8cDE>9FSomxC9QGIZc)bJWcq92Y$l{>f>teUy#y|&L^$y~H zLlzI;Bl`+j1Qb;af}3lPhxJG6ar_#6DqGfS*MbG?T$2LtuUi!siqd?e8P7tqMQ^QdV|)sl2VinT3rm1MH>}6j)0oB|MS2K!G;R-h1TAS* z3uH5h-yI1XPFfqc4S;p^Hdp{*dy%-Hcg(tLFWlLN2o@oXI0NNc{2FF^A> znBVNOst}Y`IN9vvg=k)a&zoH=2ojniV8-4ETM@Dk)xO=h@5%TpLJ1vv9k#_NTv0-S z65vRa1IF$PwUr?LSmAuaL-#n)+X5$0Dn;p&z7a=J8r%|LD?@y>Z-sDL0a_w$%Tef3 z!gr0M9k8e%2x|8vGY9Fm{b9Cp)IU@DZKEDV`uhE$whGj*E1kB&Vo3OAe-vMd!c7Qn zby-zh%Rx}mn#6r*ehJ%K=UP>4%S5=P4GdRu&St&Qz7wCiuEZp|6zhzhXkA9A0GrAhr(=6qwp^^`3Cxma!JfM9Btc- z0>j%Pzcn6E9_c3z+xZsMEpXwmD^OhoEC%Bt_DC{+4m$z*BS#t-uR}9T|MX}R<2%rd z)vKOgYGU>9pT|bf72e2{ypo*V6cY1bOW6~tP|ZcvybI?}Ph*$B zdM2J-hLkgd;qd7gb`=WG#Ia9d{TX+%s+m$1Jb6PkH&vsGnp8zhs=_6|g740ZsZm8r zs;VSa8Ir2*NL6gQg0g2lQs|nOH$_NQail6XQk5A=cbo3ADkM_X5UI+CRFy-j8X;8` zkg5R4DAlMWFX;lPfbX)bDDzcG73OkerfSEjMg@jcxlyXDC@CCOev>MnNtM0iA-H-r zW1>n_QspMfLsBIjsgjITNkytGB2~taDnCe-38cFBQr&S`4zX{Jn5v>)svwstprs04 zsUlRWc$6v1W>zW5bWDGdY2c4=;v>g(wO?x&j|6 zuUJyOqU2%u9uB}i%~!2|ckV}X&amNkcn)KO+RV2#^?6Kme_rx+e_l(w|F&5P*K($J z8`p;<-KHVe(?{PW<4&HQ{q{!o&>gdxO=HbCQhgrte|FBD*A1?X7 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)