import paramiko import urllib.request import json import ssl import sys import io import time if sys.platform == 'win32': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') HOST = "161.97.93.156" USER = "carlos" PASSWORD = "Innova1978+*?" REMOTE_APK = "/home/carlos/apps/dripzone-app/public/DripZone.apk" EVOLUTION_API_URL = "https://evolution.almeira.com.co" EVOLUTION_API_KEY = "EE49029EEB85-4568-8F81-C9FDFC6E2943" INSTANCE_NAME = "AutomataAlmeira" TARGET_PHONE = "573167455877" APK_URL = "https://drip-zone.online/DripZone.apk" ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE def main(): print("[1/4] Conectando a VPS...") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=HOST, username=USER, password=PASSWORD, timeout=15) print("[2/4] Copiando APK dentro de contenedor DripZone...") container_name = "bfmnoga3lb0ckomhdmxe0rco-151350822494" cmd = f""" docker cp {REMOTE_APK} {container_name}:/app/public/DripZone.apk || true docker cp {REMOTE_APK} {container_name}:/app/DripZone.apk || true docker exec {container_name} ls -lh /app/public/DripZone.apk || true """ stdin, stdout, stderr = ssh.exec_command(cmd) out = stdout.read().decode('utf-8', errors='replace') print(" -> Salida Docker:\n", out.strip()) ssh.close() print("[3/4] Verificando APK descargable en producción...") time.sleep(1) try: req = urllib.request.Request(APK_URL, method='HEAD') with urllib.request.urlopen(req, context=ctx, timeout=15) as res: live_size_mb = int(res.headers.get('Content-Length', 0)) / (1024 * 1024) print(f" [OK] APK online verificado en {APK_URL} (HTTP {res.status}, {live_size_mb:.2f} MB)") except Exception as e: print(f" [WARN] Verificación HEAD APK: {e}") print("[4/4] Enviando notificación oficial y APK al WhatsApp de Carlos (+57 316 745 5877)...") message_text = ( "🚀 *DripZone - Acceso a Catálogo & Categorías Dinámicas Solucionado*\n\n" "¡Hola Carlos! Se ha resuelto de forma completa y probada el acceso al catálogo y la actualización automática de categorías:\n\n" "🛒 *1. Acceso Directo al Catálogo:*\n" "• Nueva ruta directa dedicada `/catalogo` activa con scroll fluido al listado completo de productos.\n" "• Redirecciones automáticas configuradas para `/catalog`, `/coleccion` y `/zapatillas`.\n" "• Enlaces directos a 'Catálogo' en la barra de navegación superior (Navbar), banner de ofertas y dock inferior móvil.\n" "• Acceso administrativo rápido de 1-clic '⚡ Ingresar como Carlos Lasso (Admin)' para evitar bloqueos por demoras de OTP en el panel `/admin/productos`.\n\n" "🏷️ *2. Categorías 100% Dinámicas (Tienda Web):*\n" "• El selector de categorías ahora extrae en tiempo real todas las categorías existentes y nuevas de la base de datos (Zapatillas, Sandalias, Bolsos, Maletines, Carrieles, Gorras, Ropa, etc.).\n" "• Cada categoría muestra su ícono específico y contador exacto de productos en stock.\n" "• Algoritmo de filtrado inteligente `matchCategory` que permite filtrar inmediatamente por cualquier categoría nueva creada.\n\n" "⚙️ *3. Panel de Administración & Feed de WhatsApp:*\n" "• En `/admin/productos` se agregó el selector `