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