photo_bot: тестовый мод — фото напрямую в ИИ, без публикации

This commit is contained in:
Denis Krivochenko
2026-08-17 16:03:04 +07:00
parent 9f35db6f09
commit aee2fe8f25
5 changed files with 268 additions and 16 deletions
+66 -5
View File
@@ -15,6 +15,7 @@ import config.config as config
from utils import states
from utils.menu import MENU_TEXT
from photo_bot.photo_processor import prepare_ad_photo, get_crop_coordinates
from photo_bot.ai_validator import validate_photo_with_ai
from utils.texts import (
EMOJI_DIGITS,
PHOTO_MAIN_MENU_TEXT,
@@ -29,6 +30,12 @@ from utils.texts import (
photo_cancel_text,
photo_preview_ready,
photo_moderation_pending,
PHOTO_TEST_WELCOME_TEXT,
PHOTO_TEST_PREVIEW_TEXT,
PHOTO_TEST_RECEIVING_TEXT,
PHOTO_TEST_AI_CHECKING_TEXT,
photo_test_result,
photo_test_ai_error,
)
# 🔌 Импортируем централизованную функцию сбора статистики из main
@@ -175,7 +182,8 @@ async def photo_module_handler(msg: Message):
return
# --- ПЕРВАЯ ПРОВЕРКА: если нет фото в pending_photos, проверяем статус модерации ---
if user_id not in pending_photos and not is_attachment:
# (в тестовом моде API не трогаем — фото никуда не публикуется)
if user_id not in pending_photos and not is_attachment and not config.PHOTO_TEST_MODE:
status = await check_moderation_status(user_id)
if status.get("status") == "ok" and status.get("moderation_status") == "pending":
photo_id = status.get("photo_id", "???")
@@ -188,6 +196,53 @@ async def photo_module_handler(msg: Message):
# Ошибка проверки — не блокируем, просто логируем
logger.warning(f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}")
# --- ТЕСТОВЫЙ МОД: кнопка 1 отправляет фото НАПРЯМУЮ в ИИ, фото никуда не публикуется ---
if not is_attachment and user_id in pending_photos and config.PHOTO_TEST_MODE:
if cmd == "1":
photo_data = pending_photos[user_id]
original_path = photo_data['path']
await msg.answer(PHOTO_TEST_AI_CHECKING_TEXT, parse_mode="html")
try:
with open(original_path, 'rb') as f:
raw_photo = f.read()
ai_res = await asyncio.to_thread(validate_photo_with_ai, raw_photo)
except Exception as e:
logger.error(f"🔥 [TEST MODE] Ошибка чтения фото: {e}")
ai_res = {'ok': False, 'verdict': '', 'reason': '', 'error': str(e)}
if not ai_res['ok']:
# Фото остаётся в pending — можно повторить проверку (кнопка 1)
log_menu_stats(user_id, "Photo Bot (TEST)", "Ошибка обращения к ИИ")
await msg.answer(photo_test_ai_error(), parse_mode="html")
return
verdict = ai_res['verdict']
reason = ai_res['reason'] or 'Причина не указана.'
log_menu_stats(user_id, "Photo Bot (TEST)", f"ИИ-вердикт: {verdict}")
# Фото остаётся в pending — можно повторить проверку другим фото (кнопка 2)
await msg.answer(photo_test_result(verdict, reason), parse_mode="html")
return
elif cmd == "2":
log_menu_stats(user_id, "Photo Bot (TEST)", "Загрузка другого фото")
photo_data = pending_photos[user_id]
original_path = photo_data['path']
if os.path.exists(original_path):
os.remove(original_path)
if 'preview_path' in photo_data and os.path.exists(photo_data['preview_path']):
os.remove(photo_data['preview_path'])
del pending_photos[user_id]
await msg.answer(PHOTO_TEST_WELCOME_TEXT, parse_mode="html")
return
# --- Защита от мусорного ввода при висящем превью (тестовый мод) ---
else:
await msg.answer(PHOTO_TEST_PREVIEW_TEXT, parse_mode="html")
return
# --- ПОДТВЕРЖДЕНИЕ ОТПРАВКИ (Кнопка 1) ---
if not is_attachment and user_id in pending_photos:
if cmd == "1":
@@ -336,10 +391,16 @@ async def photo_module_handler(msg: Message):
log_menu_stats(user_id, "Photo Bot", "Загрузка и обработка нового фото")
await asyncio.sleep(0.5)
await msg.answer(
photo_preview_ready(),
parse_mode="html"
)
if config.PHOTO_TEST_MODE:
await msg.answer(
PHOTO_TEST_PREVIEW_TEXT,
parse_mode="html"
)
else:
await msg.answer(
photo_preview_ready(),
parse_mode="html"
)
except Exception as e:
logger.error(f"🔥 Полная ошибка: {e}", exc_info=True)
await handle_photo_error(msg, user_id, "Скачивание и обработка файла", str(e))