Files
rmser/ocr-service/qr_manager.py
SERTY 91923b8616 .venv deleted
ocr ready to test
2025-11-29 12:29:08 +03:00

86 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 []