Iniciar sesión');
}
// 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 ⚠️
" .
"No se pueden crear bases de datos automáticamente en este tipo de hosting.
" .
"SOLUCIÓN:
" .
"1. Crea manualmente la base de datos y usuario en tu panel de control
" .
"2. Usa install_manual.php en su lugar
" .
"3. Lee la guía: GUIA_HESTIACP.md
" .
"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();
}
}
?>
Configuración automática con credenciales aleatorias
Configurando base de datos automáticamente
Tu sistema WhatsApp Bot está listo para usar
CREDENCIALES_SISTEMA.txt contiene toda la información