From 7b977abeb6ce905f8a7b197392a9bdc4c19c3d05 Mon Sep 17 00:00:00 2001 From: jandres Date: Tue, 4 Feb 2025 10:42:57 -0600 Subject: [PATCH] Initial commit --- Dockerfile | 24 + __pycache__/database_handler.cpython-313.pyc | Bin 0 -> 5515 bytes __pycache__/db_handler.cpython-313.pyc | Bin 0 -> 5601 bytes __pycache__/webhook_handler.cpython-313.pyc | Bin 0 -> 6118 bytes config copy.yaml | 50 + config.yaml | 55 + db_handler.py | 86 ++ qr_codes.db | Bin 0 -> 24576 bytes qr_detector copy.py | 274 +++++ qr_detector.log | 1085 ++++++++++++++++++ qr_detector.py | 267 +++++ requirements.txt | 5 + webhook_handler.py | 126 ++ 13 files changed, 1972 insertions(+) create mode 100644 Dockerfile create mode 100644 __pycache__/database_handler.cpython-313.pyc create mode 100644 __pycache__/db_handler.cpython-313.pyc create mode 100644 __pycache__/webhook_handler.cpython-313.pyc create mode 100644 config copy.yaml create mode 100644 config.yaml create mode 100644 db_handler.py create mode 100644 qr_codes.db create mode 100644 qr_detector copy.py create mode 100644 qr_detector.log create mode 100644 qr_detector.py create mode 100644 requirements.txt create mode 100644 webhook_handler.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5ae8da1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# Usar una imagen base de Python +FROM python:3.9-slim + +# Instalar dependencias del sistema necesarias para OpenCV y zbar +RUN apt-get update && apt-get install -y \ + libzbar0 \ + libgl1-mesa-glx \ + libglib2.0-0 \ + && rm -rf /var/lib/apt/lists/* + +# Directorio de trabajo +WORKDIR /app + +# Copiar requirements.txt primero para aprovechar la caché de Docker +COPY requirements.txt . + +# Instalar dependencias de Python +RUN pip install --no-cache-dir -r requirements.txt + +# Copiar el código fuente +COPY . . + +# Comando para ejecutar la aplicación +CMD ["python", "qr_detector.py"] \ No newline at end of file diff --git a/__pycache__/database_handler.cpython-313.pyc b/__pycache__/database_handler.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb5f9c506b246fe305650d30f6526452d3757939 GIT binary patch literal 5515 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 literal 0 HcmV?d00001 diff --git a/__pycache__/webhook_handler.cpython-313.pyc b/__pycache__/webhook_handler.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43c66c2a8fdede44bf800e0f31c38c4636403332 GIT binary patch literal 6118 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 W=ULplL7@5EeV*gGKO bool: + """Verifica si un código QR ya existe en la base de datos""" + query = 'SELECT COUNT(*) FROM qr_codes WHERE qr_data = ?' + try: + with self.get_connection() as conn: + cursor = conn.cursor() + cursor.execute(query, (qr_data,)) + (count,) = cursor.fetchone() + return count > 0 + except sqlite3.Error as e: + self.logger.error(f"Error verificando QR: {e}") + return False + + def save_qr(self, qr_data: str,camera_name: str) -> bool: + """Guarda un nuevo código QR en la base de datos""" + if self.check_qr_exists(qr_data): + return False + + insert_sql = 'INSERT INTO qr_codes (qr_data,camera_name) VALUES (?, ?)' + try: + with self.get_connection() as conn: + cursor = conn.cursor() + cursor.execute(insert_sql, (qr_data,camera_name)) + conn.commit() + self.logger.info(f"QR guardado en DB: {qr_data}") + return True + except sqlite3.Error as e: + self.logger.error(f"Error guardando QR: {e}") + return False + + def get_all_qrs(self) -> list: + """Obtiene todos los códigos QR almacenados""" + query = 'SELECT qr_data, created_at FROM qr_codes ORDER BY created_at DESC' + try: + with self.get_connection() as conn: + cursor = conn.cursor() + cursor.execute(query) + return cursor.fetchall() + except sqlite3.Error as e: + self.logger.error(f"Error obteniendo QRs: {e}") + return [] \ No newline at end of file diff --git a/qr_codes.db b/qr_codes.db new file mode 100644 index 0000000000000000000000000000000000000000..18b001e8ee4ed3938ae305c77106843271f8cb91 GIT binary patch literal 24576 zcmeI4U5Mk>702cAcr@d&)kjr-qh@jch>76*+N#4wo?1v>8_4#d^d%HRo>C~}B@o(&K9thO5|X?m3%ysiKJ1x{ zHxOEq9DyzCf@INNN^g;_O ztE-`(U9;u3hW1QJ(L2a;*YoSmTD4VUTh-?_YplDMJsUmxX_$7}UHWqE*ubK8*m|Q? zd%o6Wx105?YV#Udt11UEgUou?v!S#PcPY zo?lp5Uky>}po4B%dm6rnl;okUJKK`WN#fmK5ggV<658##g_WnD4vlD!8(L^@hz1I# z?$~iR!xQYM4xS}FTf?U&?>rN7B5}9wM#56$0g0fqo|~}Z?!^%da{cm=AX#!kET-s^ zlk7v|)DYNeA6d5CH`ooFX@s>G*=cLK*--~LUX~NmsiS@*Jv$E&$T*HkJo+S+uo5fG z+stPC?{O_o$9@}&EZoxVEYl-`x*`sIyU^}~O+pZVaA?>3QQpViQ=UCCuiYpkss6@HC9P&;<7 z!VAJ0+e2!%XIJ=4J}G2`Tq+}^GFdhwmW6y-EcIhFRXIaovK7BtRlEXHg;AC;8jk6#hAdu&$bi_hAms4n(`VrCjG14?0H`Gn7^SB3D+J1id z(|}0U&FfOm6%j;VM93Z!$(OUG!Gbf8MwyK}g9comJ5X<`29C1K>1Nj#-1_|=UiSqB zmtD~dtC02K3EAv)r|?KB4k8b%cm3YG|9H*U6H8c!Q1l@R0#5dEu!PLC9v-=TPM>%5 zykMQuzw7tbKT!jEd3Q+h{*cN9#%^iyQX!B_1uwoBrm08BfU=QR_Sjv&x3v9u!1lN+ zC2Y>k2Ok}uFHWH&mW7|pIhNHa%WwVs&li2m_~JF9BxF6W`8>{YceI^oJ988b(bPfk z3Wuj^6q&Qlp@B^2TCiuPotYHQ=ouIARD;^pD}8xSLK;&1e!lU--Oqe)M3Re6%)A`o zb9k5M%rS&HjF8;_&n5mzB|gGmumAxd00e*l5C8%|00;m9AOHk_01yBIUt0pPx$tVp zt;Aqrq0yF89T6w@|4i&5D)CO@ZX(Nk%xp2M@xR4ijc?&9fWO9m6>H*yumAxd00e*l z5C8%|00;m9An*+(aGr@!m84e)U>|D8G<4gx@RLbyc(ZX?TCZ-^npLTRSAqHsK3C2a z%Y5-%JVKR5?Z>quR!=w7-9z$Zb9U>P*V-*L!PVURvh!GUX6wRogh~f|SCI2qJw2@YOA+dlZ{;Q_$<}cxhtu`6q7Q6Yu^+(9;)Iz! zGv&OKz^Qtgw_7)!v+T_mTD2K{$`qcZBUE)F5I6M04njr;wI2j$CeJNIsMX}CCW0*| zXDQ~6o{B6`cW9pg;b@zxA$RswOE)O0{}Ost<5!#6Y^L-oB0VFjdvs!(F7}HybX>rY>!$7B;WgQdR59=04(jc3+$2 zrg(mSBE#L961To+R(rk?j!-X6c5+v@ara0W&p2ACE*jt$F!0{fG!Drfu8(l3jGE$Swa!NIRg8(>rf@a-Y+{ct7Z zzSJ{4&%-2v>t{PfdByG5qk`dB+3KXDl4e&EKIt)&I+6MI;!5>6wW6weU+5?wvNx5GGMM zc@AOjOt`e<26}RWAdu|jKN^Dn?-w`(KY;)c00KY&2mk>f00e*l5C8%|00;nquMdIm LhLcN^B?12hy=|Ez literal 0 HcmV?d00001 diff --git a/qr_detector copy.py b/qr_detector copy.py new file mode 100644 index 0000000..9e28ea1 --- /dev/null +++ b/qr_detector copy.py @@ -0,0 +1,274 @@ +# Agregar al inicio del archivo, después de los imports existentes +import cv2 +from pyzbar import pyzbar + +import os +import json +from datetime import datetime +import requests # Para webhooks si se necesitan +import time +import logging +import sys +import yaml +from pathlib import Path +from typing import Optional, Tuple, List +from dataclasses import dataclass +from contextlib import contextmanager +from db_handler import DatabaseHandler, DatabaseError + +@dataclass +class QRData: + """Clase para almacenar información del código QR""" + data: str + code_type: str + coordinates: Tuple[int, int, int, int] + timestamp: float + +class QRDetectorError(Exception): + """Clase base para excepciones del detector QR""" + pass + +class CameraError(QRDetectorError): + """Error relacionado con la cámara""" + pass + +class QRDecodeError(QRDetectorError): + """Error en la decodificación del QR""" + pass + +class ConfigError(QRDetectorError): + """Error en la configuración""" + pass + +class QRDetector: + def __init__(self, config_path: str = 'config.yaml'): + self.config = self.load_config(config_path) + self.setup_logging() + self.camera_id = self.config['camera']['id'] + self.min_delay = self.config['camera']['min_delay'] + self.camera = None + self.last_code = None + self.last_time = 0 + + # Inicializar base de datos si está habilitada + if self.config['database']['enabled']: + try: + self.db = DatabaseHandler(self.config['database']) + self.logger.info("Base de datos inicializada correctamente") + except DatabaseError as e: + self.logger.error(f"Error inicializando base de datos: {e}") + raise + + def load_config(self, config_path: str) -> dict: + """Carga la configuración desde el archivo YAML""" + try: + with open(config_path, 'r') as file: + return yaml.safe_load(file) + except Exception as e: + raise ConfigError(f"Error cargando configuración: {e}") + + def setup_logging(self): + """Configura el sistema de logging basado en la configuración""" + log_config = self.config['logging'] + handlers = [] + + if log_config['output']['console']: + handlers.append(logging.StreamHandler(sys.stdout)) + + if log_config['output']['file']['enabled']: + handlers.append(logging.FileHandler(log_config['output']['file']['path'])) + + logging.basicConfig( + level=getattr(logging, log_config['level']), + format=log_config['format'], + handlers=handlers + ) + self.logger = logging.getLogger(__name__) + + @contextmanager + def initialize_camera(self): + """Inicializa la cámara de manera segura usando context manager""" + try: + self.camera = cv2.VideoCapture(self.camera_id) + if not self.camera.isOpened(): + raise CameraError("No se pudo abrir la cámara") + yield self.camera + finally: + if self.camera: + self.camera.release() + cv2.destroyAllWindows() + self.logger.info("Recursos de la cámara liberados") + + def process_frame(self, frame) -> List[QRData]: + """Procesa un frame y retorna la lista de códigos QR detectados""" + try: + qr_codes = pyzbar.decode(frame) + current_time = time.time() + results = [] + + for qr_code in qr_codes: + try: + data = qr_code.data.decode('utf-8') + code_type = qr_code.type + coordinates = qr_code.rect + + if (data != self.last_code or + (current_time - self.last_time) > self.min_delay): + + qr_data = QRData( + data=data, + code_type=code_type, + coordinates=coordinates, + timestamp=current_time + ) + results.append(qr_data) + + self.last_code = data + self.last_time = current_time + + # Guardar en base de datos si está habilitada + if self.config['database']['enabled']: + try: + qr_dict = { + 'data': data, + 'code_type': code_type, + 'coordinates': coordinates, + 'timestamp': current_time + } + self.db.save_qr_code(qr_dict) + scan_count = self.db.get_scan_count(data) + self.logger.info(f"QR guardado en DB. Total escaneos: {scan_count}") + except DatabaseError as e: + self.logger.error(f"Error guardando en base de datos: {e}") + + except UnicodeDecodeError as e: + self.logger.error(f"Error decodificando QR: {e}") + raise QRDecodeError("Error al decodificar el contenido del QR") + + return results + + except Exception as e: + self.logger.error(f"Error procesando frame: {e}") + raise QRDetectorError(f"Error en el procesamiento del frame: {e}") + + def draw_qr_info(self, frame, qr_data: QRData): + """Dibuja la información del QR en el frame con efectos visuales mejorados""" + try: + display_config = self.config['display'] + x, y, w, h = qr_data.coordinates + + # Dibujar rectángulo principal + cv2.rectangle( + frame, + (x, y), + (x + w, y + h), + tuple(display_config['rectangle']['color']), + display_config['rectangle']['thickness'] + ) + + # Dibujar esquinas del QR + l = 30 # longitud de las líneas de las esquinas + # Esquina superior izquierda + cv2.line(frame, (x, y), (x + l, y), (0, 255, 255), 2) + cv2.line(frame, (x, y), (x, y + l), (0, 255, 255), 2) + # Esquina superior derecha + cv2.line(frame, (x + w, y), (x + w - l, y), (0, 255, 255), 2) + cv2.line(frame, (x + w, y), (x + w, y + l), (0, 255, 255), 2) + # Esquina inferior izquierda + cv2.line(frame, (x, y + h), (x + l, y + h), (0, 255, 255), 2) + cv2.line(frame, (x, y + h), (x, y + h - l), (0, 255, 255), 2) + # Esquina inferior derecha + cv2.line(frame, (x + w, y + h), (x + w - l, y + h), (0, 255, 255), 2) + cv2.line(frame, (x + w, y + h), (x + w, y + h - l), (0, 255, 255), 2) + + # Crear fondo semi-transparente para el texto + overlay = frame.copy() + cv2.rectangle( + overlay, + (x, y - 40), + (x + w, y), + (0, 0, 0), + -1 + ) + frame = cv2.addWeighted(overlay, 0.5, frame, 0.5, 0) + + # Mostrar información + display_text = f"{qr_data.code_type}: {qr_data.data}" + cv2.putText( + frame, + display_text, + (x + 5, y - 15), + cv2.FONT_HERSHEY_SIMPLEX, + 0.6, + (255, 255, 255), # Color blanco para mejor contraste + 2 + ) + + # Contador de escaneos si está disponible + if self.config['database']['enabled']: + try: + scan_count = self.db.get_scan_count(qr_data.data) + count_text = f"Escaneos: {scan_count}" + cv2.putText( + frame, + count_text, + (x + w - 100, y + h + 25), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (0, 255, 255), + 1 + ) + except DatabaseError: + pass + + self.logger.info(f"QR detectado - Tipo: {qr_data.code_type}, Datos: {qr_data.data}") + + except Exception as e: + self.logger.error(f"Error dibujando información del QR: {e}") + raise QRDetectorError(f"Error al dibujar información: {e}") + + def run(self): + """Método principal para ejecutar el detector""" + self.logger.info("Iniciando detector de códigos QR...") + + with self.initialize_camera() as camera: + while True: + try: + success, frame = camera.read() + if not success: + raise CameraError("Error capturando frame") + + qr_codes = self.process_frame(frame) + + for qr_data in qr_codes: + self.draw_qr_info(frame, qr_data) + + cv2.imshow(self.config['display']['window_name'], frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + self.logger.info("Cerrando aplicación...") + break + + except CameraError as e: + self.logger.error(f"Error de cámara: {e}") + break + except QRDecodeError as e: + self.logger.error(f"Error de decodificación: {e}") + continue + except Exception as e: + self.logger.error(f"Error inesperado: {e}") + break + +def main(): + try: + detector = QRDetector() + detector.run() + except ConfigError as e: + print(f"Error en la configuración: {e}") + sys.exit(1) + except Exception as e: + print(f"Error crítico en la aplicación: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/qr_detector.log b/qr_detector.log new file mode 100644 index 0000000..7a13257 --- /dev/null +++ b/qr_detector.log @@ -0,0 +1,1085 @@ +2025-02-03 20:24:36,329 - INFO - Base de datos inicializada correctamente +2025-02-03 20:24:36,330 - INFO - Base de datos inicializada correctamente +2025-02-03 20:24:36,330 - INFO - Iniciando detector de códigos QR... +2025-02-03 20:25:13,374 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:25:13,374 - INFO - QR detectado - Tipo: QRCODE, Datos: https://merca.truper.com/qr/index.php?codigo=maq_elec +2025-02-03 20:26:10,111 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:26:10,111 - INFO - QR detectado - Tipo: QRCODE, Datos: tel: +2025-02-03 20:26:12,152 - INFO - QR guardado en DB. Total escaneos: 2 +2025-02-03 20:26:12,153 - INFO - QR detectado - Tipo: QRCODE, Datos: tel: +2025-02-03 20:26:13,075 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:26:13,076 - INFO - QR detectado - Tipo: QRCODE, Datos: http://en.m.wikipedia.org +2025-02-03 20:26:15,093 - INFO - QR guardado en DB. Total escaneos: 2 +2025-02-03 20:26:15,094 - INFO - QR detectado - Tipo: QRCODE, Datos: http://en.m.wikipedia.org +2025-02-03 20:26:56,315 - INFO - Cerrando aplicación... +2025-02-03 20:26:56,924 - INFO - Recursos de la cámara liberados +2025-02-03 20:36:06,439 - INFO - Base de datos inicializada correctamente +2025-02-03 20:36:06,440 - INFO - Base de datos inicializada correctamente +2025-02-03 20:36:06,440 - INFO - Iniciando detector de códigos QR... +2025-02-03 20:36:38,717 - INFO - QR guardado en DB. Total escaneos: 3 +2025-02-03 20:36:38,719 - INFO - QR detectado - Tipo: QRCODE, Datos: http://en.m.wikipedia.org +2025-02-03 20:36:49,130 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:36:49,132 - INFO - QR detectado - Tipo: QRCODE, Datos: Hello, world! +2025-02-03 20:37:55,186 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:37:55,187 - INFO - QR detectado - Tipo: QRCODE, Datos: http://apple.com +2025-02-03 20:38:31,810 - INFO - Cerrando aplicación... +2025-02-03 20:38:32,398 - INFO - Recursos de la cámara liberados +2025-02-03 20:56:56,286 - INFO - Base de datos inicializada correctamente +2025-02-03 20:56:56,287 - INFO - Base de datos inicializada correctamente +2025-02-03 20:56:56,287 - INFO - Iniciando detector de códigos QR... +2025-02-03 20:57:24,185 - INFO - Base de datos inicializada correctamente +2025-02-03 20:57:24,186 - INFO - Base de datos inicializada correctamente +2025-02-03 20:57:24,186 - INFO - Iniciando detector de códigos QR... +2025-02-03 20:57:25,997 - ERROR - Error procesando frame: name 'pyzbar' is not defined +2025-02-03 20:57:25,998 - ERROR - Error inesperado: Error en el procesamiento del frame: name 'pyzbar' is not defined +2025-02-03 20:57:26,542 - INFO - Recursos de la cámara liberados +2025-02-03 20:58:10,415 - INFO - Base de datos inicializada correctamente +2025-02-03 20:58:10,415 - INFO - Base de datos inicializada correctamente +2025-02-03 20:58:10,415 - INFO - Iniciando detector de códigos QR... +2025-02-03 20:58:26,227 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:58:26,228 - INFO - QR detectado - Tipo: QRCODE, Datos: https://lobbyfix.com/?utm_source=blog&utm_medium=qr&utm_campaign=qr +2025-02-03 20:58:29,234 - INFO - QR guardado en DB. Total escaneos: 2 +2025-02-03 20:58:29,236 - INFO - QR detectado - Tipo: QRCODE, Datos: https://lobbyfix.com/?utm_source=blog&utm_medium=qr&utm_campaign=qr +2025-02-03 20:59:27,163 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 20:59:27,165 - INFO - QR detectado - Tipo: QRCODE, Datos: www.abcsubmit.com +2025-02-03 20:59:36,038 - INFO - Cerrando aplicación... +2025-02-03 20:59:36,608 - INFO - Recursos de la cámara liberados +2025-02-03 21:07:31,046 - WARNING - Intento 1/3 fallido. Status: 404, Response: +404 Not Found + +

404 Not Found

+ +2025-02-03 21:07:36,133 - WARNING - Intento 2/3 fallido. Status: 404, Response: +404 Not Found + +

404 Not Found

+ +2025-02-03 21:08:33,859 - INFO - Webhook enviado exitosamente a https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:08:33,860 - INFO - Conexión de webhook probada exitosamente +2025-02-03 21:08:33,870 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:10:00,694 - ERROR - Error procesando frame: name 'DatabaseError' is not defined +2025-02-03 21:10:00,694 - ERROR - Error inesperado: Error en el procesamiento del frame: name 'DatabaseError' is not defined +2025-02-03 21:10:01,233 - INFO - Recursos de la cámara liberados +2025-02-03 21:10:46,233 - INFO - Webhook enviado exitosamente a https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:10:46,234 - INFO - Conexión de webhook probada exitosamente +2025-02-03 21:10:46,234 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:11:10,109 - ERROR - Error procesando frame: name 'DatabaseError' is not defined +2025-02-03 21:11:10,110 - ERROR - Error inesperado: Error en el procesamiento del frame: name 'DatabaseError' is not defined +2025-02-03 21:11:10,651 - INFO - Recursos de la cámara liberados +2025-02-03 21:13:20,806 - INFO - Webhook enviado exitosamente a https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:13:20,807 - INFO - Conexión de webhook probada exitosamente +2025-02-03 21:13:20,807 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:13:58,920 - ERROR - Error procesando frame: 'QRDetector' object has no attribute 'db' +2025-02-03 21:13:58,920 - ERROR - Error inesperado: Error en el procesamiento del frame: 'QRDetector' object has no attribute 'db' +2025-02-03 21:13:59,464 - INFO - Recursos de la cámara liberados +2025-02-03 21:16:06,585 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:16:39,122 - INFO - Datos enviados al webhook: http://en.m.wikipedia.org +2025-02-03 21:16:53,725 - INFO - Datos enviados al webhook: http://en.m.wikipedia.org +2025-02-03 21:24:09,640 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:24:29,988 - INFO - Nuevo lote añadido: https://sans.org/ouch +2025-02-03 21:25:02,370 - INFO - Nuevo lote añadido: https://apple.co/3ygzxCD +2025-02-03 21:26:21,301 - INFO - Base de datos inicializada correctamente +2025-02-03 21:26:21,301 - INFO - Base de datos inicializada correctamente +2025-02-03 21:26:21,302 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:26:27,843 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 21:26:27,845 - INFO - QR detectado - Tipo: QRCODE, Datos: https://apple.co/3ygzxCD +2025-02-03 21:26:39,368 - INFO - QR guardado en DB. Total escaneos: 1 +2025-02-03 21:26:39,369 - INFO - QR detectado - Tipo: QRCODE, Datos: https://www.ncsc.admin.ch +2025-02-03 21:27:04,217 - INFO - Cerrando aplicación... +2025-02-03 21:27:04,760 - INFO - Recursos de la cámara liberados +2025-02-03 21:27:55,915 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:28:03,950 - INFO - Nuevo lote añadido: https://www.ncsc.admin.ch +2025-02-03 21:28:27,101 - INFO - Nuevo lote añadido: http://www.joydeepdeb.com/ +2025-02-03 21:32:34,347 - INFO - Intentando enviar a API: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:32:34,348 - INFO - Headers: {'Content-Type': 'application/json', 'x-api-key': 'tu-api-key-aqui'} +2025-02-03 21:32:34,348 - INFO - Payload: {'lotes': ['https://www.ncsc.admin.ch', 'http://www.joydeepdeb.com/']} +2025-02-03 21:32:48,946 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:33:04,505 - INFO - QR detectado - Contenido: http://www.joydeepdeb.com/ +2025-02-03 21:33:04,506 - INFO - Lote añadido. Total lotes: 1 +2025-02-03 21:33:04,506 - INFO - Contenido actual de lotes: ['http://www.joydeepdeb.com/'] +2025-02-03 21:33:18,582 - INFO - QR detectado - Contenido: https://sans.org/ouch +2025-02-03 21:33:18,583 - INFO - Lote añadido. Total lotes: 2 +2025-02-03 21:33:18,583 - INFO - Contenido actual de lotes: ['http://www.joydeepdeb.com/', 'https://sans.org/ouch'] +2025-02-03 21:34:03,978 - INFO - QR detectado - Contenido: tel: +2025-02-03 21:34:03,978 - INFO - Lote añadido. Total lotes: 3 +2025-02-03 21:34:03,978 - INFO - Contenido actual de lotes: ['http://www.joydeepdeb.com/', 'https://sans.org/ouch', 'tel:'] +2025-02-03 21:34:08,088 - INFO - QR detectado - Contenido: http://en.m.wikipedia.org +2025-02-03 21:34:08,088 - INFO - Lote añadido. Total lotes: 4 +2025-02-03 21:34:08,088 - INFO - Contenido actual de lotes: ['http://www.joydeepdeb.com/', 'https://sans.org/ouch', 'tel:', 'http://en.m.wikipedia.org'] +2025-02-03 21:34:10,089 - INFO - QR detectado - Contenido: https://sans.org/ouch +2025-02-03 21:34:10,090 - INFO - QR ya existe en lotes, no se añade +2025-02-03 21:34:18,762 - INFO - QR detectado - Contenido: tel: +2025-02-03 21:34:18,763 - INFO - QR ya existe en lotes, no se añade +2025-02-03 21:35:33,282 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:35:37,948 - INFO - QR detectado - Contenido: http://en.m.wikipedia.org +2025-02-03 21:35:37,948 - INFO - Lote añadido. Total lotes: 1 +2025-02-03 21:35:37,948 - INFO - Contenido actual de lotes: ['http://en.m.wikipedia.org'] +2025-02-03 21:35:37,949 - INFO - Intentando enviar a API: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:35:37,949 - INFO - Headers: {'Content-Type': 'application/json', 'x-api-key': 'tu-api-key-aqui'} +2025-02-03 21:35:37,949 - INFO - Payload: {'lotes': ['http://en.m.wikipedia.org']} +2025-02-03 21:35:58,828 - INFO - Respuesta de la API - Status Code: 200 +2025-02-03 21:35:58,829 - INFO - Respuesta de la API - Contenido: This URL has no default content configured. View in Webhook.site. +2025-02-03 21:35:58,829 - INFO - Lotes enviados exitosamente: ['http://en.m.wikipedia.org'] +2025-02-03 21:36:10,509 - INFO - QR detectado - Contenido: http://en.m.wikipedia.org +2025-02-03 21:36:10,509 - INFO - Lote añadido. Total lotes: 1 +2025-02-03 21:36:10,509 - INFO - Contenido actual de lotes: ['http://en.m.wikipedia.org'] +2025-02-03 21:36:10,510 - INFO - Intentando enviar a API: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:36:10,510 - INFO - Headers: {'Content-Type': 'application/json', 'x-api-key': 'tu-api-key-aqui'} +2025-02-03 21:36:10,510 - INFO - Payload: {'lotes': ['http://en.m.wikipedia.org']} +2025-02-03 21:36:31,493 - INFO - Respuesta de la API - Status Code: 200 +2025-02-03 21:36:31,494 - INFO - Respuesta de la API - Contenido: This URL has no default content configured. View in Webhook.site. +2025-02-03 21:36:31,494 - INFO - Lotes enviados exitosamente: ['http://en.m.wikipedia.org'] +2025-02-03 21:39:33,186 - INFO - No hay lotes para enviar +2025-02-03 21:39:33,186 - INFO - Recursos liberados +2025-02-03 21:40:23,592 - INFO - Base de datos inicializada correctamente +2025-02-03 21:40:23,593 - INFO - Configuración API cargada: +2025-02-03 21:40:23,593 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:40:23,593 - INFO - Batch size: 1 +2025-02-03 21:40:23,593 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:40:23,593 - INFO - Batch size configurado: 1 +2025-02-03 21:40:37,968 - ERROR - Error en verificación de QR: Expecting value: line 1 column 1 (char 0) +2025-02-03 21:40:37,970 - INFO - Nuevo QR detectado - Contenido: tel: +2025-02-03 21:40:37,970 - INFO - Lote añadido. Total lotes: 1 +2025-02-03 21:40:37,971 - INFO - Contenido actual de lotes: ['tel:'] +2025-02-03 21:40:37,972 - INFO - Intentando enviar a API: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:40:37,972 - INFO - Headers: {'Content-Type': 'application/json', 'x-api-key': 'tu-api-key-aqui'} +2025-02-03 21:40:37,973 - INFO - Payload: {'lotes': ['tel:']} +2025-02-03 21:40:58,808 - INFO - Respuesta de la API - Status Code: 200 +2025-02-03 21:40:58,809 - INFO - Respuesta de la API - Contenido: This URL has no default content configured. View in Webhook.site. +2025-02-03 21:40:58,809 - INFO - Lotes enviados exitosamente: ['tel:'] +2025-02-03 21:44:29,790 - INFO - No hay lotes para enviar +2025-02-03 21:44:29,791 - INFO - Recursos liberados +2025-02-03 21:44:46,093 - INFO - Base de datos inicializada correctamente +2025-02-03 21:44:46,094 - INFO - Configuración API cargada: +2025-02-03 21:44:46,094 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-03 21:44:46,094 - INFO - Batch size: 1 +2025-02-03 21:44:46,094 - INFO - Iniciando detector de códigos QR... +2025-02-03 21:44:46,095 - INFO - Batch size configurado: 1 +2025-02-03 21:44:55,063 - INFO - QR guardado en DB: http://en.m.wikipedia.org +2025-02-03 21:44:55,063 - INFO - QR guardado en base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:55,063 - INFO - Añadido a lotes para API. Total: 1 +2025-02-03 21:44:55,064 - INFO - Enviando lotes a API: ['http://en.m.wikipedia.org'] +2025-02-03 21:44:57,049 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,049 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,110 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,112 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,135 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,136 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,172 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,173 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,198 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,199 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,224 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,224 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,248 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,248 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,347 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,348 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,373 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,374 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,410 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,411 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,435 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,436 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,473 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,474 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,498 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,499 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,526 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,527 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,547 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,548 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,590 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,651 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:57,676 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:58,557 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:58,574 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:58,670 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:58,687 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,280 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,408 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,430 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,474 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,497 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,521 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:44:59,542 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:00,337 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:00,436 - INFO - QR guardado en DB: https://sans.org/ouch +2025-02-03 21:45:00,436 - INFO - QR guardado en base de datos: https://sans.org/ouch +2025-02-03 21:45:00,436 - INFO - Añadido a lotes para API. Total: 1 +2025-02-03 21:45:05,908 - INFO - Lotes enviados exitosamente +2025-02-03 21:45:05,908 - INFO - Enviando lotes a API: ['https://sans.org/ouch'] +2025-02-03 21:45:08,895 - INFO - QR guardado en DB: http://www.joydeepdeb.com/ +2025-02-03 21:45:08,896 - INFO - QR guardado en base de datos: http://www.joydeepdeb.com/ +2025-02-03 21:45:08,896 - INFO - Añadido a lotes para API. Total: 1 +2025-02-03 21:45:09,556 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,557 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,588 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,588 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,618 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,619 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,650 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,684 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,685 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,729 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,730 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,763 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,763 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,788 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,789 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,812 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,813 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,858 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,923 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,956 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:09,989 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,039 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,067 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,088 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,110 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,132 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,162 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,197 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,228 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,257 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:10,342 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,412 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,412 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,876 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,922 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,957 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:11,988 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,019 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,053 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,054 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,084 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,085 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,114 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,145 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,179 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,225 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,259 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,260 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,285 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:12,285 - INFO - QR ya existe en la base de datos: http://en.m.wikipedia.org +2025-02-03 21:45:21,186 - ERROR - Error en envío a API: HTTPSConnectionPool(host='webhook.site', port=443): Read timed out. (read timeout=5) +2025-02-03 21:45:21,187 - INFO - Enviando lotes a API: ['http://www.joydeepdeb.com/'] +2025-02-03 21:45:22,849 - INFO - QR guardado en DB: +2025-02-03 21:45:22,850 - INFO - QR guardado en base de datos: +2025-02-03 21:45:22,850 - INFO - Añadido a lotes para API. Total: 1 +2025-02-03 21:45:36,508 - ERROR - Error en envío a API: HTTPSConnectionPool(host='webhook.site', port=443): Read timed out. (read timeout=5) +2025-02-03 21:45:36,509 - INFO - Enviando lotes a API: [''] +2025-02-03 21:45:57,018 - ERROR - Error en envío a API: HTTPSConnectionPool(host='webhook.site', port=443): Read timed out. (read timeout=5) +2025-02-03 21:46:44,215 - INFO - Recursos liberados +2025-02-04 08:40:52,293 - INFO - Base de datos inicializada correctamente +2025-02-04 08:40:52,294 - INFO - Configuración API cargada: +2025-02-04 08:40:52,294 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 08:40:52,294 - INFO - Batch size: 1 +2025-02-04 08:40:52,295 - INFO - Iniciando detector de códigos QR... +2025-02-04 08:40:52,295 - INFO - Batch size configurado: 1 +2025-02-04 08:41:16,135 - INFO - QR guardado en DB: Hello :) +2025-02-04 08:41:16,135 - INFO - QR guardado en base de datos: Hello :) +2025-02-04 08:41:16,136 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 08:41:16,138 - INFO - Enviando lotes a API: ['Hello :)'] +2025-02-04 08:41:16,190 - INFO - QR guardado en DB: https://l.ead.me/api-1 +2025-02-04 08:41:16,190 - INFO - QR guardado en base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:16,190 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 08:41:16,192 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,239 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,287 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,336 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,398 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,451 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,509 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,567 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,628 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,691 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,751 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,812 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,837 - INFO - Lotes enviados exitosamente +2025-02-04 08:41:16,838 - INFO - Enviando lotes a API: ['https://l.ead.me/api-1'] +2025-02-04 08:41:16,873 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,936 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:16,997 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,058 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,119 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,180 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,243 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,302 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,377 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,413 - INFO - Lotes enviados exitosamente +2025-02-04 08:41:17,446 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,510 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,576 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,640 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,703 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:17,953 - INFO - QR guardado en DB: https://qr-codes.io/1tTjBstLWTE +2025-02-04 08:41:17,954 - INFO - QR guardado en base de datos: https://qr-codes.io/1tTjBstLWTE +2025-02-04 08:41:17,954 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 08:41:17,955 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:17,956 - INFO - Enviando lotes a API: ['https://qr-codes.io/1tTjBstLWTE'] +2025-02-04 08:41:18,019 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,084 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,149 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,213 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,282 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,348 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,416 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,480 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,524 - INFO - Lotes enviados exitosamente +2025-02-04 08:41:18,546 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,615 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,682 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,750 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,816 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,882 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:18,947 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,013 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,076 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,140 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,207 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,273 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,336 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,337 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,400 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,401 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,464 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,465 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,530 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,531 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,594 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,594 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,662 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,725 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,726 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,790 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,791 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,856 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,857 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,921 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,922 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:19,988 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:19,989 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,053 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,054 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,119 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,119 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,179 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,180 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,242 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,243 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,306 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,306 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,370 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,371 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 08:41:20,438 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,502 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,565 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,630 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 08:41:20,671 - INFO - Recursos liberados +2025-02-04 08:42:18,804 - INFO - Base de datos inicializada correctamente +2025-02-04 08:42:18,805 - INFO - Configuración API cargada: +2025-02-04 08:42:18,805 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 08:42:18,805 - INFO - Batch size: 1 +2025-02-04 08:42:18,805 - INFO - Iniciando detector de códigos QR... +2025-02-04 08:42:18,806 - INFO - Batch size configurado: 1 +2025-02-04 08:42:23,754 - INFO - Recursos liberados +2025-02-04 08:42:33,191 - INFO - Base de datos inicializada correctamente +2025-02-04 08:42:33,191 - INFO - Configuración API cargada: +2025-02-04 08:42:33,192 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 08:42:33,192 - INFO - Batch size: 1 +2025-02-04 08:42:33,192 - INFO - Iniciando detector de códigos QR... +2025-02-04 08:42:33,192 - INFO - Batch size configurado: 1 +2025-02-04 08:42:40,142 - INFO - Recursos liberados +2025-02-04 09:28:48,553 - INFO - Base de datos inicializada correctamente +2025-02-04 09:28:48,554 - INFO - Configuración API cargada: +2025-02-04 09:28:48,555 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 09:28:48,555 - INFO - Batch size: 1 +2025-02-04 09:28:48,555 - INFO - Iniciando detector de códigos QR... +2025-02-04 09:28:48,555 - INFO - Batch size configurado: 1 +2025-02-04 09:29:22,643 - INFO - Base de datos inicializada correctamente +2025-02-04 09:29:22,644 - INFO - Configuración API cargada: +2025-02-04 09:29:22,644 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 09:29:22,644 - INFO - Batch size: 1 +2025-02-04 09:29:22,644 - INFO - Iniciando detector de códigos QR... +2025-02-04 09:29:22,645 - INFO - Batch size configurado: 1 +2025-02-04 09:29:28,152 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:28,206 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:28,461 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:28,562 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:29,915 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:30,287 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:30,341 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:30,662 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:30,718 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:32,770 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:35,493 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:35,544 - ERROR - Error procesando QR individual: DBHandler.save_qr() missing 1 required positional argument: 'camera_name' +2025-02-04 09:29:37,638 - INFO - Recursos liberados +2025-02-04 09:30:06,433 - INFO - Base de datos inicializada correctamente +2025-02-04 09:30:06,434 - INFO - Configuración API cargada: +2025-02-04 09:30:06,434 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 09:30:06,435 - INFO - Batch size: 1 +2025-02-04 09:30:06,435 - INFO - Iniciando detector de códigos QR... +2025-02-04 09:30:06,435 - INFO - Batch size configurado: 1 +2025-02-04 09:30:09,379 - INFO - QR guardado en DB: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:09,380 - INFO - QR guardado en base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:09,380 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:30:09,430 - INFO - Enviando lotes a API: ['https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html'] +2025-02-04 09:30:10,073 - INFO - Lotes enviados exitosamente +2025-02-04 09:30:11,369 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,475 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,528 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,637 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,689 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,741 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,792 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:11,848 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:12,102 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:12,962 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,588 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,636 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,684 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,733 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,781 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,830 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,878 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,927 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:13,977 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,027 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,075 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,127 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,173 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,219 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,266 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,313 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,360 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,631 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,680 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,727 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,773 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,819 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,866 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,914 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:30:14,944 - INFO - Recursos liberados +2025-02-04 09:54:20,393 - INFO - Base de datos inicializada correctamente +2025-02-04 09:55:36,817 - INFO - Base de datos inicializada correctamente +2025-02-04 09:55:36,818 - INFO - Configuración API cargada: +2025-02-04 09:55:36,819 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 09:55:36,820 - INFO - Batch size: 1 +2025-02-04 09:55:36,820 - INFO - Iniciando detector de códigos QR... +2025-02-04 09:55:36,820 - INFO - Batch size configurado: 1 +2025-02-04 09:55:46,227 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,277 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,326 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,374 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,422 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,468 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,516 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,606 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,652 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,742 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,789 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,839 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,886 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:46,934 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,028 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,074 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,122 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,168 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,215 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,263 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,311 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,357 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,406 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,455 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,502 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,550 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,598 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,646 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,694 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,739 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,787 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,836 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,884 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,932 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:47,980 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:48,030 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:48,078 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:55:51,076 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,077 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,171 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,172 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,173 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,173 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,228 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,228 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,229 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,229 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,293 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,293 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,295 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,295 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,353 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,354 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,355 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,355 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,415 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,415 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,416 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,416 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,473 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,474 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,475 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,475 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,533 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,534 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,535 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,535 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,595 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,596 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,597 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,597 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,652 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,652 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,654 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,654 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,655 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,655 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,712 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,713 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,714 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,715 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,715 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,716 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,771 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,771 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,772 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,772 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,773 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,773 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,832 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,833 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,834 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,834 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,835 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,836 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,890 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,890 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,891 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,891 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,893 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,893 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,948 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,949 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,950 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,951 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,952 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:51,952 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,008 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,008 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,009 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,010 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,011 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,011 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,067 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,068 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,069 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,069 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,070 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,071 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,127 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,128 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,129 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,129 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,131 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,131 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,190 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,191 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,192 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,192 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,193 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,194 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,253 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,254 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,254 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,255 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,256 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,256 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,335 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,335 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,337 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,337 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,338 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,339 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,396 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,397 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,398 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,399 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,399 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,400 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,455 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,455 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,456 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,457 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,512 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,513 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,514 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,514 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,569 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,569 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,570 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,571 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,571 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,572 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,628 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,629 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,630 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,630 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,687 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,688 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,689 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,689 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,690 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,691 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,749 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,749 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,750 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,751 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,752 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,752 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,814 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,815 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,816 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,816 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,817 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,817 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,876 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,877 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,878 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,878 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,880 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,880 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,939 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,939 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,941 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,941 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,943 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:52,943 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,005 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,006 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,007 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,007 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,008 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,009 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,065 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,065 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,066 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,067 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,067 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,068 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,128 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,130 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,131 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,131 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,133 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,134 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,188 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,189 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,190 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,191 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,192 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,192 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,243 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,244 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,245 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,246 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,299 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,299 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,301 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,301 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,356 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,357 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,358 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,358 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,413 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,413 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,414 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,415 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,468 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,469 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,470 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,470 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,660 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,661 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,662 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,662 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,716 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,716 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,717 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,717 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,771 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,771 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,772 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,773 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,828 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,829 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,829 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,830 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,884 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,884 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,885 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,886 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,940 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,941 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,942 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,942 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,998 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,998 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,999 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:53,999 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,000 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,000 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,059 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,059 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,060 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,061 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,062 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,062 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,116 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,117 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,118 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,118 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,259 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,259 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,260 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,260 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,313 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,313 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,314 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,314 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,367 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,367 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,368 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,368 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,422 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,422 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,423 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,423 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,478 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,478 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,479 - ERROR - Error de conexión a la base de datos: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:55:54,480 - ERROR - Error guardando QR: UNIQUE constraint failed: qr_codes.camera_name +2025-02-04 09:57:44,309 - INFO - Recursos liberados +2025-02-04 09:57:45,962 - INFO - Base de datos inicializada correctamente +2025-02-04 09:57:45,963 - INFO - Configuración API cargada: +2025-02-04 09:57:45,963 - INFO - URL: https://webhook.site/92f87e0c-3611-43b1-8010-b873835b9e75 +2025-02-04 09:57:45,963 - INFO - Batch size: 1 +2025-02-04 09:57:45,963 - INFO - Iniciando detector de códigos QR... +2025-02-04 09:57:45,963 - INFO - Batch size configurado: 1 +2025-02-04 09:57:54,567 - INFO - QR guardado en DB: https://l.ead.me/api-1 +2025-02-04 09:57:54,567 - INFO - QR guardado en base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:54,567 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:57:54,568 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:57:54,622 - INFO - Enviando lotes a API: ['https://l.ead.me/api-1'] +2025-02-04 09:57:55,154 - INFO - QR guardado en DB: Text to Create QR for. +2025-02-04 09:57:55,154 - INFO - QR guardado en base de datos: Text to Create QR for. +2025-02-04 09:57:55,154 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:57:55,156 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,156 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:57:55,231 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,274 - INFO - Lotes enviados exitosamente +2025-02-04 09:57:55,275 - INFO - Enviando lotes a API: ['Text to Create QR for.'] +2025-02-04 09:57:55,309 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,381 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,447 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,515 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,573 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,636 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,692 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,750 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,808 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,850 - INFO - Lotes enviados exitosamente +2025-02-04 09:57:55,870 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,931 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:55,991 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,052 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,110 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,172 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,237 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,299 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,360 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,423 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,492 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,560 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,621 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,686 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,752 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,820 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,888 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:56,956 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,029 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,102 - INFO - QR guardado en DB: https://www.fotor.com/qr-code-generator/ +2025-02-04 09:57:57,102 - INFO - QR guardado en base de datos: https://www.fotor.com/qr-code-generator/ +2025-02-04 09:57:57,103 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:57:57,105 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,106 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,106 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:57:57,176 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,177 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,177 - INFO - Enviando lotes a API: ['https://www.fotor.com/qr-code-generator/'] +2025-02-04 09:57:57,243 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,244 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,312 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,313 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,382 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,383 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,449 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,450 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,515 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,515 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,583 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,584 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,653 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,654 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,725 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,725 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,735 - INFO - Lotes enviados exitosamente +2025-02-04 09:57:57,796 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,797 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:57,867 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:57,868 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,003 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,004 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,071 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,072 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,139 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,140 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,203 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,204 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,272 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,273 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,338 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,339 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,406 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,407 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,475 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,476 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,545 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,546 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,617 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,617 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,689 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,690 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,762 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,763 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,835 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,836 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,905 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,906 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:58,973 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:58,974 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,038 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,039 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,096 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,097 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,155 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,155 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,213 - INFO - QR ya existe en la base de datos: https://www.fotor.com/qr-code-generator/ +2025-02-04 09:57:59,214 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,215 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,269 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,270 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,325 - INFO - QR ya existe en la base de datos: https://www.fotor.com/qr-code-generator/ +2025-02-04 09:57:59,326 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,327 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,380 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,381 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,436 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,437 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,494 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,494 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,556 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,557 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,622 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,623 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,690 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,691 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,757 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,758 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,822 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:57:59,823 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,883 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:57:59,945 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,014 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,345 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,644 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,645 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,707 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,708 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,767 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,768 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,833 - INFO - QR ya existe en la base de datos: https://www.fotor.com/qr-code-generator/ +2025-02-04 09:58:00,834 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,835 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,902 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,903 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:00,966 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:00,967 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:01,033 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:01,034 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:01,830 - INFO - QR guardado en DB: https://apple.co/3ygzxCD +2025-02-04 09:58:01,831 - INFO - QR guardado en base de datos: https://apple.co/3ygzxCD +2025-02-04 09:58:01,831 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:01,831 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:01,882 - INFO - Enviando lotes a API: ['https://apple.co/3ygzxCD'] +2025-02-04 09:58:02,514 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:03,991 - INFO - QR guardado en DB: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:03,992 - INFO - QR guardado en base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:03,992 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:03,992 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:04,052 - INFO - Enviando lotes a API: ['https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html'] +2025-02-04 09:58:04,593 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:05,863 - INFO - QR guardado en DB: Hello :) +2025-02-04 09:58:05,864 - INFO - QR guardado en base de datos: Hello :) +2025-02-04 09:58:05,864 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:05,864 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:05,919 - INFO - Enviando lotes a API: ['Hello :)'] +2025-02-04 09:58:05,976 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,033 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,088 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,147 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,369 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,428 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,483 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:06,484 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,527 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:06,537 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:06,538 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,595 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:06,596 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,655 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,712 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,777 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,841 - INFO - QR guardado en DB: http://www.joydeepdeb.com/ +2025-02-04 09:58:06,842 - INFO - QR guardado en base de datos: http://www.joydeepdeb.com/ +2025-02-04 09:58:06,842 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:06,843 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,844 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 09:58:06,844 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:06,904 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,905 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 09:58:06,905 - INFO - Enviando lotes a API: ['http://www.joydeepdeb.com/'] +2025-02-04 09:58:06,965 - INFO - QR ya existe en la base de datos: https://l.ead.me/api-1 +2025-02-04 09:58:06,966 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 09:58:07,036 - INFO - QR guardado en DB: https://qr-codes.io/1tTjBstLWTE +2025-02-04 09:58:07,037 - INFO - QR guardado en base de datos: https://qr-codes.io/1tTjBstLWTE +2025-02-04 09:58:07,037 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:07,039 - INFO - QR ya existe en la base de datos: http://www.joydeepdeb.com/ +2025-02-04 09:58:07,039 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:07,040 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 09:58:07,040 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:07,104 - INFO - QR ya existe en la base de datos: http://www.joydeepdeb.com/ +2025-02-04 09:58:07,105 - INFO - QR ya existe en la base de datos: https://www.tripadvisor.ie/Restaurant_Review-g189112-d7075860-Reviews-The_Indian_Sizzler-Albufeira_Faro_District_Algarve.html +2025-02-04 09:58:07,106 - INFO - QR ya existe en la base de datos: Hello :) +2025-02-04 09:58:07,450 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:07,451 - INFO - Enviando lotes a API: ['https://qr-codes.io/1tTjBstLWTE'] +2025-02-04 09:58:08,703 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:09,715 - INFO - QR guardado en DB: https://kreatology.com/contact/ +2025-02-04 09:58:09,715 - INFO - QR guardado en base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:09,715 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:09,715 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:09,768 - INFO - Enviando lotes a API: ['https://kreatology.com/contact/'] +2025-02-04 09:58:09,957 - INFO - QR guardado en DB: https://www.aptika.com/qrcode/ +2025-02-04 09:58:09,958 - INFO - QR guardado en base de datos: https://www.aptika.com/qrcode/ +2025-02-04 09:58:09,958 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:09,958 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:10,021 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,082 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,152 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,217 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,282 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,345 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:10,346 - INFO - Enviando lotes a API: ['https://www.aptika.com/qrcode/'] +2025-02-04 09:58:10,346 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,412 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,476 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,538 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,607 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:10,672 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:11,006 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:11,288 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:11,351 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:11,413 - INFO - QR ya existe en la base de datos: https://kreatology.com/contact/ +2025-02-04 09:58:12,838 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:12,893 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:12,908 - INFO - QR guardado en DB: https://tcea.org/ +2025-02-04 09:58:12,908 - INFO - QR guardado en base de datos: https://tcea.org/ +2025-02-04 09:58:12,908 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:12,909 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:12,964 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:12,964 - INFO - Enviando lotes a API: ['https://tcea.org/'] +2025-02-04 09:58:13,020 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,079 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,136 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,195 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,273 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,338 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,401 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,463 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,531 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,581 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:13,597 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,660 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,722 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,911 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:13,974 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,036 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,092 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,154 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,212 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,271 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,335 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,400 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,460 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,521 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:14,583 - INFO - QR ya existe en la base de datos: Text to Create QR for. +2025-02-04 09:58:15,234 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,398 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,458 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,518 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,579 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,867 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,927 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:15,995 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:16,059 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:16,121 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:16,185 - INFO - QR ya existe en la base de datos: https://tcea.org/ +2025-02-04 09:58:18,570 - INFO - QR guardado en DB: https://www.canva.com/ +2025-02-04 09:58:18,570 - INFO - QR guardado en base de datos: https://www.canva.com/ +2025-02-04 09:58:18,571 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:18,571 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:18,653 - INFO - Enviando lotes a API: ['https://www.canva.com/'] +2025-02-04 09:58:18,756 - INFO - QR guardado en DB: http://www.shopify.com +2025-02-04 09:58:18,757 - INFO - QR guardado en base de datos: http://www.shopify.com +2025-02-04 09:58:18,757 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:18,758 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:18,865 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:18,994 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:19,000 - INFO - QR guardado en DB: https://tylerpotts.co.uk +2025-02-04 09:58:19,001 - INFO - QR guardado en base de datos: https://tylerpotts.co.uk +2025-02-04 09:58:19,001 - INFO - Añadido a lotes para API. Total: 1 +2025-02-04 09:58:19,002 - ERROR - Error en el bucle principal: 'QRDetector' object has no attribute 'save_frame_with_qr' +2025-02-04 09:58:19,108 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:19,109 - INFO - QR ya existe en la base de datos: http://www.shopify.com +2025-02-04 09:58:19,190 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:19,191 - INFO - Enviando lotes a API: ['http://www.shopify.com'] +2025-02-04 09:58:19,217 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:19,218 - INFO - QR ya existe en la base de datos: http://www.shopify.com +2025-02-04 09:58:19,316 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:19,317 - INFO - QR ya existe en la base de datos: http://www.shopify.com +2025-02-04 09:58:19,403 - INFO - QR ya existe en la base de datos: https://www.canva.com/ +2025-02-04 09:58:19,736 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:19,737 - INFO - Enviando lotes a API: ['https://tylerpotts.co.uk'] +2025-02-04 09:58:20,304 - INFO - Lotes enviados exitosamente +2025-02-04 09:58:54,986 - INFO - Recursos liberados diff --git a/qr_detector.py b/qr_detector.py new file mode 100644 index 0000000..fc02c70 --- /dev/null +++ b/qr_detector.py @@ -0,0 +1,267 @@ +import os +import cv2 +from pyzbar import pyzbar +import time +import logging +import sys +import yaml +import requests +from pathlib import Path +from typing import Optional, Tuple, List +from dataclasses import dataclass +from contextlib import contextmanager +import threading +from queue import Queue +from db_handler import DBHandler + +@dataclass +class QRData: + """Clase para almacenar información del código QR""" + data: str + code_type: str + coordinates: Tuple[int, int, int, int] + timestamp: float + +class QRDetector: + def __init__(self, config_path: str = 'config.yaml'): + self.config = self.load_config(config_path) + self.setup_logging() + self.camera_id = self.config['camera']['id'] + self.camera_name = self.config.get('camera', {}).get('name', 'NO_CAMERA_NAME') + self.min_delay = self.config['camera']['min_delay'] + self.camera = None + self.last_code = None + self.last_time = 0 + self.lotes = [] + self.api_queue = Queue() + self.running = True + + # Inicializar base de datos + self.db = DBHandler(self.config.get('database', {}).get('path', 'qr_codes.db')) + + # Iniciar thread para procesar envíos a la API + self.api_thread = threading.Thread(target=self.api_worker) + self.api_thread.daemon = True + self.api_thread.start() + + self.headless = self.config.get('headless', {}).get('enabled', False) + + + + # Crear directorio para imágenes si es necesario + + if self.headless and self.config['headless'].get('save_images', False): + + os.makedirs(self.config['headless']['image_output_dir'], exist_ok=True) + + # Verificar configuración de API + if 'api' in self.config: + self.logger.info(f"Configuración API cargada:") + self.logger.info(f"URL: {self.config['api']['url']}") + self.logger.info(f"Batch size: {self.config['api'].get('batch_size', 1)}") + else: + self.logger.error("No se encontró configuración de API") + + def load_config(self, config_path: str) -> dict: + """Carga la configuración desde el archivo YAML""" + try: + with open(config_path, 'r') as file: + return yaml.safe_load(file) + except Exception as e: + self.logger.error(f"Error cargando configuración: {e}") + sys.exit(1) + + def setup_logging(self): + """Configura el sistema de logging""" + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(sys.stdout), + logging.FileHandler('qr_detector.log') + ] + ) + self.logger = logging.getLogger(__name__) + + def api_worker(self): + """Worker thread para procesar envíos a la API""" + while self.running: + try: + lotes = self.api_queue.get(timeout=1) + if lotes: + self._send_to_api(lotes) + self.api_queue.task_done() + except: + continue + + def _send_to_api(self, lotes): + """Envía los lotes a la API (método interno)""" + try: + api_url = self.config['api']['url'] + headers = { + 'Content-Type': 'application/json', + 'x-api-key': self.config['api']['api_key'] + } + + payload = { + "lotes": lotes + } + + self.logger.info(f"Enviando lotes a API: {lotes}") + response = requests.post(api_url, json=payload, headers=headers, timeout=5) + + if response.status_code == 200: + self.logger.info(f"Lotes enviados exitosamente") + else: + self.logger.error(f"Error enviando lotes: {response.status_code}") + + except Exception as e: + self.logger.error(f"Error en envío a API: {e}") + + def send_to_api(self): + """Encola los lotes para envío asíncrono""" + if not self.lotes: + return + + # Copiar los lotes actuales y limpiar la lista + lotes_to_send = self.lotes.copy() + self.lotes = [] + + # Encolar para envío asíncrono + self.api_queue.put(lotes_to_send) + + @contextmanager + def initialize_camera(self): + """Inicializa la cámara""" + try: + self.camera = cv2.VideoCapture(self.camera_id) + if not self.camera.isOpened(): + self.logger.error("No se pudo abrir la cámara") + sys.exit(1) + yield self.camera + finally: + if self.camera: + self.camera.release() + cv2.destroyAllWindows() + self.send_to_api() # Enviar lotes pendientes al cerrar + self.logger.info("Recursos liberados") + + def process_frame(self, frame) -> List[QRData]: + """Procesa un frame y retorna los códigos QR detectados""" + try: + qr_codes = pyzbar.decode(frame) + current_time = time.time() + results = [] + + for qr_code in qr_codes: + try: + data = qr_code.data.decode('utf-8') + code_type = qr_code.type + coordinates = qr_code.rect + + if (data != self.last_code or + (current_time - self.last_time) > self.min_delay): + + # Verificar si el QR ya existe en la base de datos local + if self.db.check_qr_exists(data): + self.logger.info(f"QR ya existe en la base de datos: {data}") + continue + + # Guardar en la base de datos local + if self.db.save_qr(data,self.camera_name): + self.logger.info(f"QR guardado en base de datos: {data}") + + qr_data = QRData( + data=data, + code_type=code_type, + coordinates=coordinates, + timestamp=current_time + ) + results.append(qr_data) + + # Añadir a lotes para envío a API solo si es nuevo + if data not in self.lotes: + self.lotes.append(data) + self.logger.info(f"Añadido a lotes para API. Total: {len(self.lotes)}") + + self.last_code = data + self.last_time = current_time + + except Exception as e: + self.logger.error(f"Error procesando QR individual: {e}") + + return results + + except Exception as e: + self.logger.error(f"Error procesando frame: {e}") + return [] + + def draw_qr_info(self, frame, qr_data: QRData): + """Dibuja la información del QR en el frame""" + try: + x, y, w, h = qr_data.coordinates + + # Dibujar rectángulo + cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) + + # Mostrar información + display_text = f"{qr_data.code_type}: {qr_data.data}" + cv2.putText( + frame, + display_text, + (x, y - 10), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (0, 255, 0), + 2 + ) + + except Exception as e: + self.logger.error(f"Error dibujando información: {e}") + + def run(self): + """Método principal para ejecutar el detector""" + self.logger.info("Iniciando detector de códigos QR...") + batch_size = self.config['api'].get('batch_size', 1) + self.logger.info(f"Batch size configurado: {batch_size}") + + with self.initialize_camera() as camera: + while True: + try: + success, frame = camera.read() + if not success: + self.logger.error("Error capturando frame") + break + + qr_codes = self.process_frame(frame) + + for qr_data in qr_codes: + if self.headless: + self.save_frame_with_qr(frame, qr_data) + else: + self.draw_qr_info(frame, qr_data) + cv2.imshow('QR Detector', frame) + + if not self.headless: + if cv2.waitKey(1) & 0xFF == ord('q'): + self.running = False + if self.lotes: + self.logger.info(f"Enviando {len(self.lotes)} lotes pendientes...") + self.send_to_api() + self.api_queue.join() + break + + # Verificar y enviar lotes + if len(self.lotes) >= batch_size: + self.send_to_api() + + except Exception as e: + self.logger.error(f"Error en el bucle principal: {e}") + continue + +def main(): + detector = QRDetector() + detector.run() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..af2d285 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +opencv-python>=4.5.0 +pyzbar>=0.1.8 +numpy>=1.19.0 +pyyaml>=5.4.0 +requests>=2.32.3 \ No newline at end of file diff --git a/webhook_handler.py b/webhook_handler.py new file mode 100644 index 0000000..883fac3 --- /dev/null +++ b/webhook_handler.py @@ -0,0 +1,126 @@ +import requests +import logging +import time +from typing import Dict, Any +from dataclasses import dataclass, asdict +from datetime import datetime + +@dataclass +class WebhookConfig: + url: str + method: str + headers: Dict[str, str] + retry: Dict[str, int] + +class WebhookError(Exception): + """Clase para errores relacionados con webhooks""" + pass + +class WebhookHandler: + def __init__(self, webhook_config: dict): + self.config = webhook_config + self.logger = logging.getLogger(__name__) + self.session = requests.Session() + + def prepare_payload(self, qr_data: dict, scan_count: int) -> dict: + """Prepara el payload para el webhook""" + return { + "event_type": "qr_detected", + "timestamp": datetime.now().isoformat(), + "qr_data": { + "content": qr_data.get('data'), + "type": qr_data.get('code_type'), + "scan_count": scan_count, + "coordinates": qr_data.get('coordinates'), + "detection_timestamp": qr_data.get('timestamp') + }, + "device_info": { + "id": "qr_detector_01", # Puedes configurar esto + "location": "main_entrance" # Puedes configurar esto + } + } + + def send_webhook(self, endpoint: WebhookConfig, payload: dict) -> bool: + """Envía el webhook con reintentos""" + max_attempts = endpoint.retry['max_attempts'] + delay = endpoint.retry['delay_seconds'] + + for attempt in range(max_attempts): + try: + response = self.session.request( + method=endpoint.method, + url=endpoint.url, + json=payload, + headers=endpoint.headers, + timeout=10 + ) + + if response.ok: + self.logger.info(f"Webhook enviado exitosamente a {endpoint.url}") + return True + + self.logger.warning( + f"Intento {attempt + 1}/{max_attempts} fallido. " + f"Status: {response.status_code}, " + f"Response: {response.text[:100]}" + ) + + except requests.RequestException as e: + self.logger.error(f"Error en intento {attempt + 1}/{max_attempts}: {e}") + + if attempt < max_attempts - 1: + time.sleep(delay) + + self.logger.error(f"Todos los intentos de webhook fallaron para {endpoint.url}") + return False + + def notify(self, qr_data: dict, scan_count: int) -> None: + """Maneja el envío de notificaciones basado en las reglas configuradas""" + try: + # Verificar reglas de notificación + is_new = scan_count == 1 + should_notify = ( + (is_new and self.config['notification_rules']['send_on_new']) or + (not is_new and self.config['notification_rules']['send_on_repeat']) + ) + + if not should_notify: + return + + payload = self.prepare_payload(qr_data, scan_count) + + for endpoint_config in self.config['endpoints']: + endpoint = WebhookConfig( + url=endpoint_config['url'], + method=endpoint_config['method'], + headers=endpoint_config['headers'], + retry=endpoint_config['retry'] + ) + + self.send_webhook(endpoint, payload) + + except Exception as e: + self.logger.error(f"Error procesando notificación: {e}") + raise WebhookError(f"Error en notificación: {e}") + + def test_connection(self) -> bool: + """Prueba las conexiones a todos los endpoints configurados""" + test_payload = { + "event_type": "connection_test", + "timestamp": datetime.now().isoformat() + } + + all_successful = True + + for endpoint_config in self.config['endpoints']: + endpoint = WebhookConfig( + url=endpoint_config['url'], + method=endpoint_config['method'], + headers=endpoint_config['headers'], + retry=endpoint_config['retry'] + ) + + if not self.send_webhook(endpoint, test_payload): + all_successful = False + + return all_successful \ No newline at end of file