.venv deleted

ocr ready to test
This commit is contained in:
2025-11-29 12:29:08 +03:00
parent 449556c4e4
commit 91923b8616
2094 changed files with 562 additions and 370942 deletions

86
ocr-service/qr_manager.py Normal file
View File

@@ -0,0 +1,86 @@
import logging
import requests
from typing import Optional, List
from pyzbar.pyzbar import decode
from PIL import Image
import numpy as np
# Импортируем модель из parser.py, чтобы типы совпадали!
from parser import ParsedItem
# В продакшене лучше вынести в конфиг
API_TOKEN = "36590.yqtiephCvvkYUKM2W"
API_URL = "https://proverkacheka.com/api/v1/check/get"
logger = logging.getLogger(__name__)
def detect_and_decode_qr(image: np.ndarray) -> Optional[str]:
"""
Пытается найти QR-код на изображении и вернуть его сырое содержимое.
"""
try:
# Pyzbar лучше работает с PIL Image
pil_img = Image.fromarray(image)
# Декодируем
decoded_objects = decode(pil_img)
for obj in decoded_objects:
if obj.type == 'QRCODE':
qr_data = obj.data.decode("utf-8")
logger.info(f"QR Code detected: {qr_data}")
return qr_data
return None
except Exception as e:
logger.error(f"Error during QR detection: {e}")
return None
def fetch_data_from_api(qr_raw: str) -> List[ParsedItem]:
"""
Отправляет данные QR-кода в API proverkacheka.com и парсит JSON-ответ.
"""
try:
payload = {
'qrraw': qr_raw,
'token': API_TOKEN
}
logger.info("Sending request to Check API...")
response = requests.post(API_URL, data=payload, timeout=10)
if response.status_code != 200:
logger.error(f"API Error: Status {response.status_code}")
return []
data = response.json()
# Проверяем успешность ответа (code: 1 - успех)
if data.get('code') != 1:
logger.warning(f"API returned non-success code: {data.get('code')}")
return []
json_data = data.get('data', {}).get('json', {})
items_data = json_data.get('items', [])
parsed_items = []
for item in items_data:
# API возвращает цены в копейках (int), нужно делить на 100
price = float(item.get('price', 0)) / 100.0
total_sum = float(item.get('sum', 0)) / 100.0
quantity = float(item.get('quantity', 0))
name = item.get('name', 'Unknown')
parsed_items.append(ParsedItem(
raw_name=name,
amount=quantity,
price=price,
sum=total_sum
))
return parsed_items
except Exception as e:
logger.error(f"Error fetching/parsing API data: {e}")
return []