Files
whatsapp/legacy/install.php
2026-01-28 03:09:52 -05:00

493 lines
24 KiB
PHP

<?php
/**
* Instalador automático del sistema WhatsApp Bot
* Desarrollado por U-Site.app - https://u-site.app
* Genera contraseña aleatoria y configura la base de datos
* Fecha: 13 de noviembre de 2025
*/
// Verificar si la instalación ya está completada
$installationLockFile = '.installation_completed';
if (file_exists($installationLockFile)) {
header('Location: login.php');
exit('La instalación ya está completada. <a href="login.php">Iniciar sesión</a>');
}
// Función para generar contraseña aleatoria segura
function generateRandomPassword($length = 20) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*-_=+';
$password = '';
for ($i = 0; $i < $length; $i++) {
$password .= $chars[random_int(0, strlen($chars) - 1)];
}
return $password;
}
// Configuración de la instalación (compatible con cPanel)
$dbHost = 'localhost';
$dbName = 'whatsapp_bot';
$dbUser = 'whatsapp_user';
$dbPass = generateRandomPassword(20);
$dbRootUser = 'root';
$dbRootPass = ''; // En cPanel puede requerir contraseña
// Generar contraseña para admin
$adminPassword = generateRandomPassword(12);
$installStep = $_GET['step'] ?? 'welcome';
$errors = [];
$success = [];
// Procesar instalación
if ($installStep === 'install' && $_POST) {
try {
// 1. Intentar conectar como root para crear base de datos y usuario
try {
$rootPdo = new PDO("mysql:host=$dbHost;charset=utf8mb4", $dbRootUser, $dbRootPass);
$rootPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
// Si no se puede conectar como root, es probable que sea hosting compartido
throw new Exception("⚠️ HOSTING COMPARTIDO DETECTADO ⚠️<br><br>" .
"No se pueden crear bases de datos automáticamente en este tipo de hosting.<br><br>" .
"<strong>SOLUCIÓN:</strong><br>" .
"1. Crea manualmente la base de datos y usuario en tu panel de control<br>" .
"2. Usa <a href='install_manual.php' class='btn btn-warning btn-sm'>install_manual.php</a> en su lugar<br>" .
"3. Lee la guía: <a href='GUIA_HESTIACP.md' target='_blank'>GUIA_HESTIACP.md</a><br><br>" .
"Error técnico: " . $e->getMessage());
}
// 2. Crear base de datos
$rootPdo->exec("CREATE DATABASE IF NOT EXISTS `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$success[] = "✅ Base de datos '$dbName' creada correctamente";
// 3. Crear usuario con permisos
$rootPdo->exec("DROP USER IF EXISTS '$dbUser'@'localhost'");
$rootPdo->exec("CREATE USER '$dbUser'@'localhost' IDENTIFIED BY '$dbPass'");
$rootPdo->exec("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$dbUser'@'localhost'");
$rootPdo->exec("FLUSH PRIVILEGES");
$success[] = "✅ Usuario '$dbUser' creado con contraseña aleatoria";
// 4. Conectar con nuevo usuario
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 5. Crear tablas desde schema.sql
$schema = file_get_contents('database/schema.sql');
if (!$schema) {
throw new Exception("No se pudo leer el archivo schema.sql");
}
// Ejecutar comandos SQL uno por uno
$statements = array_filter(array_map('trim', explode(';', $schema)));
$tablesCreated = 0;
foreach ($statements as $statement) {
if (!empty($statement) && !preg_match('/^--/', $statement)) {
$pdo->exec($statement);
if (preg_match('/CREATE TABLE|INSERT INTO/', $statement)) {
$tablesCreated++;
}
}
}
$success[] = "✅ $tablesCreated elementos de base de datos procesados";
// 6. Actualizar archivo de configuración
$configFile = 'config/config.php';
$configContent = file_get_contents($configFile);
$configContent = preg_replace("/define\('DB_HOST',\s*'[^']*'\);/", "define('DB_HOST', '$dbHost');", $configContent);
$configContent = preg_replace("/define\('DB_NAME',\s*'[^']*'\);/", "define('DB_NAME', '$dbName');", $configContent);
$configContent = preg_replace("/define\('DB_USER',\s*'[^']*'\);/", "define('DB_USER', '$dbUser');", $configContent);
$configContent = preg_replace("/define\('DB_PASS',\s*'[^']*'\);/", "define('DB_PASS', '$dbPass');", $configContent);
$configContent = preg_replace("/define\('ADMIN_PASSWORD',\s*'[^']*'\);/", "define('ADMIN_PASSWORD', '" . password_hash($adminPassword, PASSWORD_DEFAULT) . "');", $configContent);
// Auto-detectar URL del servidor
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';
$host = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['SCRIPT_NAME']);
$autoUrl = $protocol . $host . $path;
$configContent = preg_replace("/define\('APP_URL',\s*'[^']*'\);/", "define('APP_URL', '$autoUrl');", $configContent);
file_put_contents($configFile, $configContent);
$success[] = "✅ Archivo config.php actualizado con nuevas credenciales";
// 7. Crear archivo de bloqueo de instalación
$lockContent = "Instalación completada: " . date('Y-m-d H:i:s') . "\n";
$lockContent .= "Desarrollado por: U-Site.app\n";
$lockContent .= "URL: https://u-site.app\n";
file_put_contents($installationLockFile, $lockContent);
$success[] = "✅ Sistema bloqueado contra reinstalaciones";
// 8. Crear archivo de credenciales para referencia
$credentialsFile = "CREDENCIALES_SISTEMA.txt";
$credentialsContent = "=== CREDENCIALES DEL SISTEMA WHATSAPP BOT ===\n";
$credentialsContent .= "Desarrollado por: U-Site.app (https://u-site.app)\n";
$credentialsContent .= "Generado automáticamente: " . date('Y-m-d H:i:s') . "\n\n";
$credentialsContent .= "=== BASE DE DATOS ===\n";
$credentialsContent .= "Host: $dbHost\n";
$credentialsContent .= "Base de datos: $dbName\n";
$credentialsContent .= "Usuario: $dbUser\n";
$credentialsContent .= "Contraseña: $dbPass\n\n";
$credentialsContent .= "=== PANEL ADMINISTRATIVO ===\n";
$credentialsContent .= "Usuario: admin\n";
$credentialsContent .= "Contraseña: $adminPassword\n";
$credentialsContent .= "URL Login: $autoUrl/login.php\n\n";
$credentialsContent .= "⚠️ IMPORTANTE: Guarda estas credenciales en un lugar seguro.\n";
$credentialsContent .= "⚠️ Elimina este archivo después de guardar las credenciales.\n";
$credentialsContent .= "⚠️ El sistema está protegido contra reinstalaciones.\n\n";
$credentialsContent .= "📞 Soporte técnico: support@u-site.app\n";
file_put_contents($credentialsFile, $credentialsContent);
$success[] = "✅ Archivo de credenciales creado: $credentialsFile";
$installStep = 'completed';
} catch (PDOException $e) {
$errors[] = "❌ Error de base de datos: " . $e->getMessage();
} catch (Exception $e) {
$errors[] = "❌ Error general: " . $e->getMessage();
}
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>🚀 Instalador WhatsApp Bot</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
:root {
--primary-color: #25d366;
--secondary-color: #075e54;
--bg-gradient: linear-gradient(135deg, #25d366 0%, #075e54 100%);
}
body {
background: var(--bg-gradient);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.install-card {
background: rgba(255,255,255,0.95);
border-radius: 20px;
backdrop-filter: blur(10px);
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
}
.btn-install {
background: var(--bg-gradient);
border: none;
color: white;
padding: 15px 30px;
border-radius: 10px;
font-weight: 600;
}
.btn-install:hover {
transform: translateY(-2px);
color: white;
}
.password-display {
background: #f8f9fa;
border: 2px dashed #28a745;
border-radius: 10px;
font-family: 'Courier New', monospace;
font-size: 1.1rem;
font-weight: bold;
color: #155724;
word-break: break-all;
padding: 15px;
}
.step-indicator {
width: 40px;
height: 40px;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
margin-right: 15px;
font-weight: bold;
}
.step-active { background: var(--primary-color); color: white; }
.step-completed { background: #28a745; color: white; }
.step-pending { background: #e9ecef; color: #6c757d; }
.console-output {
background: #1e1e1e;
color: #00ff00;
border-radius: 10px;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
max-height: 300px;
overflow-y: auto;
}
.blink {
animation: blink 1s infinite;
}
@keyframes blink {
0%, 50% { opacity: 1; }
51%, 100% { opacity: 0; }
}
</style>
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-lg-8">
<div class="install-card p-5">
<?php if ($installStep === 'welcome'): ?>
<!-- Pantalla de Bienvenida -->
<div class="text-center mb-4">
<i class="fas fa-database text-primary" style="font-size: 4rem;"></i>
<h1 class="mt-3 fw-bold">Instalador WhatsApp Bot</h1>
<p class="text-muted">Configuración automática con credenciales aleatorias</p>
<div class="mt-3">
<small class="text-muted">
Desarrollado por <strong><a href="https://u-site.app" target="_blank" class="text-decoration-none">U-Site.app</a></strong> |
<a href="https://u-site.app/support" target="_blank" class="text-decoration-none">Soporte técnico</a>
</small>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-4">
<div class="d-flex align-items-center">
<span class="step-indicator step-active">1</span>
<div>
<h6 class="mb-1">Crear BD</h6>
<small class="text-muted">Base de datos: <strong>whatsapp_bot</strong></small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="d-flex align-items-center">
<span class="step-indicator step-pending">2</span>
<div>
<h6 class="mb-1">Crear Usuario</h6>
<small class="text-muted">Usuario: <strong>whatsapp_user</strong></small>
</div>
</div>
</div>
<div class="col-md-4">
<div class="d-flex align-items-center">
<span class="step-indicator step-pending">3</span>
<div>
<h6 class="mb-1">Configurar</h6>
<small class="text-muted">Aplicar configuración</small>
</div>
</div>
</div>
</div>
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
<strong>Configuración automática para cPanel/hosting compartido:</strong>
<ul class="mb-0 mt-2">
<li><strong>Host:</strong> localhost (compatible con cualquier hosting)</li>
<li><strong>Base de datos:</strong> whatsapp_bot (se creará automáticamente)</li>
<li><strong>Usuario DB:</strong> whatsapp_user (se creará automáticamente)</li>
<li><strong>Contraseña DB:</strong> Se generará aleatoriamente (20 caracteres)</li>
<li><strong>Usuario Admin:</strong> admin</li>
<li><strong>Contraseña Admin:</strong> Se generará aleatoriamente (12 caracteres)</li>
</ul>
</div>
<div class="alert alert-success">
<i class="fas fa-shield-alt me-2"></i>
<strong>Características de seguridad:</strong>
<ul class="mb-0 mt-2">
<li>✅ Protección contra reinstalaciones</li>
<li>✅ Sistema de login con bloqueo por intentos</li>
<li>✅ Contraseñas encriptadas</li>
<li>✅ Auto-detección de URL del servidor</li>
<li>✅ Compatible con cualquier hosting cPanel</li>
</ul>
</div>
<div class="alert alert-warning">
<i class="fas fa-exclamation-triangle me-2"></i>
<strong>Requisitos:</strong> Asegúrate de que MySQL esté funcionando en Laragon
</div>
<div class="alert alert-danger">
<i class="fas fa-server me-2"></i>
<strong>⚠️ ¿Usas hosting compartido? (HestiaCP, cPanel, etc.)</strong><br>
Este instalador automático <strong>NO funcionará</strong> en hosting compartido porque requiere privilegios de administrador.<br><br>
<strong>👉 SOLUCIÓN:</strong>
<a href="install_manual.php" class="btn btn-warning btn-sm me-2">
<i class="fas fa-tools me-1"></i>Usar Instalador Manual
</a>
<a href="GUIA_HESTIACP.md" target="_blank" class="btn btn-info btn-sm">
<i class="fas fa-book me-1"></i>Ver Guía
</a>
</div>
<div class="text-center mb-4">
<div class="row g-3">
<div class="col-md-6">
<div class="password-display">
🔐 CONTRASEÑA BD:<br>
<strong><?= htmlspecialchars($dbPass) ?></strong>
</div>
</div>
<div class="col-md-6">
<div class="password-display">
👤 CONTRASEÑA ADMIN:<br>
<strong><?= htmlspecialchars($adminPassword) ?></strong>
</div>
</div>
</div>
</div>
<div class="text-center">
<a href="?step=install" class="btn btn-install btn-lg">
<i class="fas fa-play me-2"></i>Iniciar Instalación
</a>
</div>
<?php elseif ($installStep === 'install'): ?>
<!-- Pantalla de Instalación -->
<div class="text-center mb-4">
<i class="fas fa-cog fa-spin text-warning" style="font-size: 3rem;"></i>
<h2 class="mt-3">Instalando Sistema...</h2>
<p class="text-muted">Configurando base de datos automáticamente</p>
</div>
<form method="POST" id="installForm">
<div class="console-output p-4 mb-4">
<div>WhatsApp Bot Installer v1.0</div>
<div>Connecting to MySQL server (localhost)...</div>
<div>Generating secure random password...</div>
<div class="mt-3">
<strong style="color: #ffff00;">🔐 CONTRASEÑAS GENERADAS:</strong><br>
<span style="color: #00ffff; font-size: 1.0rem;">DB: <?= htmlspecialchars($dbPass) ?></span><br>
<span style="color: #00ff00; font-size: 1.0rem;">Admin: <?= htmlspecialchars($adminPassword) ?></span>
</div>
<div class="mt-2">Creating database 'whatsapp_bot'...</div>
<div>Creating user 'whatsapp_user'@'localhost'...</div>
<div>Granting privileges...</div>
<div>Installing database schema...</div>
<div>Updating configuration files...</div>
<div class="text-success mt-2">Ready to execute installation <span class="blink">_</span></div>
</div>
<div class="text-center">
<button type="submit" class="btn btn-install btn-lg">
<i class="fas fa-database me-2"></i>Ejecutar Instalación
</button>
</div>
</form>
<script>
// Auto-submit después de mostrar la información
setTimeout(function() {
document.getElementById('installForm').submit();
}, 4000);
</script>
<?php elseif ($installStep === 'completed'): ?>
<!-- Pantalla de Completado -->
<div class="text-center mb-4">
<i class="fas fa-check-circle text-success" style="font-size: 4rem;"></i>
<h1 class="mt-3 text-success fw-bold">¡Instalación Completada!</h1>
<p class="text-muted">Tu sistema WhatsApp Bot está listo para usar</p>
</div>
<!-- Mostrar errores si los hay -->
<?php if (!empty($errors)): ?>
<div class="alert alert-danger">
<h5><i class="fas fa-exclamation-triangle me-2"></i>Errores encontrados:</h5>
<?php foreach ($errors as $error): ?>
<div><?= htmlspecialchars($error) ?></div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<!-- Mostrar éxitos -->
<?php if (!empty($success)): ?>
<div class="alert alert-success">
<h5><i class="fas fa-check-circle me-2"></i>Instalación exitosa:</h5>
<?php foreach ($success as $msg): ?>
<div><?= htmlspecialchars($msg) ?></div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<!-- Mostrar credenciales -->
<div class="row g-4 mb-4">
<div class="col-md-6">
<h5><i class="fas fa-database me-2 text-primary"></i>Credenciales de BD</h5>
<div class="bg-light p-3 rounded">
<div><strong>Host:</strong> <?= $dbHost ?></div>
<div><strong>Base de datos:</strong> <?= $dbName ?></div>
<div><strong>Usuario:</strong> <?= $dbUser ?></div>
<div class="mt-2">
<strong>Contraseña:</strong><br>
<div class="password-display mt-1">
<?= htmlspecialchars($dbPass) ?>
</div>
</div>
</div>
<h5 class="mt-3"><i class="fas fa-user-shield me-2 text-success"></i>Credenciales Admin</h5>
<div class="bg-light p-3 rounded">
<div><strong>Usuario:</strong> admin</div>
<div class="mt-2">
<strong>Contraseña:</strong><br>
<div class="password-display mt-1">
<?= htmlspecialchars($adminPassword) ?>
</div>
</div>
<div class="mt-2"><strong>URL Login:</strong><br>
<a href="login.php" target="_blank"><?= AUTO_DETECTED_URL ?? $autoUrl ?? '' ?>/login.php</a>
</div>
</div>
</div>
<div class="col-md-6">
<h5><i class="fas fa-link me-2 text-success"></i>Próximos Pasos</h5>
<div class="d-grid gap-2">
<a href="login.php" class="btn btn-install">
<i class="fas fa-sign-in-alt me-2"></i>Iniciar Sesión
</a>
<a href="test.php" class="btn btn-outline-primary">
<i class="fas fa-check-circle me-2"></i>Probar Sistema
</a>
<a href="server_setup.php" class="btn btn-outline-warning">
<i class="fab fa-whatsapp me-2"></i>Configurar WhatsApp
</a>
</div>
</div>
</div>
<div class="alert alert-warning">
<i class="fas fa-exclamation-triangle me-2"></i>
<strong>¡IMPORTANTE!</strong>
<ul class="mb-0 mt-2">
<li>Guarda las credenciales en un lugar seguro</li>
<li>El archivo <code>CREDENCIALES_SISTEMA.txt</code> contiene toda la información</li>
<li>Elimina este archivo después de guardar las credenciales</li>
<li><strong>El sistema está protegido contra reinstalaciones</strong></li>
<li>Configura tu token de WhatsApp después del login</li>
<li>Soporte técnico: <a href="mailto:support@u-site.app">support@u-site.app</a></li>
</ul>
</div>
<?php endif; ?>
<!-- Footer -->
<div class="mt-5 pt-4 border-top text-center">
<small class="text-muted">
WhatsApp Bot Manager v1.0 by <strong>U-Site.app</strong> |
Instalación automática con credenciales seguras |
<a href="https://u-site.app/support" target="_blank">Soporte</a>
</small>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>