selenium/test_buscador.php

173 lines
7.4 KiB
PHP

<?php
require_once("vendor/autoload.php"); // Incluye autoload de Composer para Selenium WebDriver y PHPMailer
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverBy;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverWait;
use Facebook\WebDriver\WebDriverKeys;
use Facebook\WebDriver\Chrome\ChromeOptions;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
//Se optienen las variables de entorno (Crear un archivo .env en la raiz del proyecto con las variables EMAIL y PASSWORD)
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$email = $_ENV['EMAIL'];
$password = $_ENV['PASSWORD'];
// Crear ChromeOptions
$options = new ChromeOptions();
$options->addArguments([
'--start-maximized',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.122 Safari/537.36',
'--disable-blink-features=AutomationControlled'
]);
$host = 'http://localhost:4444/wd/hub';
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$capabilities->setCapability('pageLoadStrategy', 'normal');
//DEFINIMOS LOS SITIOS OFICIALES
$sitios_oficiales = [
'https://www.gugler.com.ar/',
'https://mi.gugler.com.ar/',
'https://campusvirtual.gugler.com.ar/'
];
//COMENZAMOS EL TEST
try {
$palabra_buscar = "gugler";
$logs ="";
// Crear el cliente de Selenium
echo "0 - Ejecutando test de monitoreo del sitio oficial en Chrome.\n";
//$driver = RemoteWebDriver::create($host, $capabilities); // opcion para las capabilities.
$driver = RemoteWebDriver::create($host, [
'browserName' => 'chrome',
'goog:chromeOptions' => $options->toArray(),
'pageLoadStrategy' => 'normal'
]);
$wait = new WebDriverWait($driver, 10);
$driver->executeScript("Object.defineProperty(navigator, 'languages', {get: () => ['es-ES', 'es']})");
$driver->executeScript("Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]})");
$driver->manage()->window()->maximize();
// Paso 1: Navegar a Google
$driver->get('https://www.google.com/');
echo "1 - Ingresando al buscador google.\n";
$driver->executeScript("window.scrollTo(0, 500)");
$searchBox = $driver->findElement(WebDriverBy::name('q'));
// Paso 2: Ingresar la palabra "gugler" en el cuadro de búsqueda
$letras = str_split($palabra_buscar);
foreach ($letras as $letra) {
$searchBox->sendKeys($letra);
sleep(rand(1, 2)); # Simula escritura
}
$searchBox->submit();
echo "2 - Se realizó la búsqueda de la palabra --> ". $palabra_buscar .".\n";
// Paso 3: Esperar a que se carguen los resultados
sleep(2); // Esperar a que se carguen los resultados
$captcha = $driver->findElements(WebDriverBy::id('captcha-form'));
if ($captcha) {
echo "⚠️ Captcha detectado, se espera 15 segundos para completarlo.\n";
sleep(15);
}
// Verificar si el primer resultado es uno de los sitios oficiales
$wait->until(
WebDriverExpectedCondition::presenceOfElementLocated(
WebDriverBy::cssSelector('div#search a[href^="http"]')
)
);
// Obtener el primer resultado
$resultados = $driver->findElements(WebDriverBy::cssSelector('div#center_col a[href^="http"]'));
$primero = $resultados[0]->getAttribute('href');
// Se muestran todos los resultados
echo "\n";
$lista_resultados = "";
foreach ($resultados as $index => $elemento) {
$url = $elemento->getAttribute('href');
// Valor por defecto
$esPatrocinado = "";
// Buscar si el enlace está dentro de un bloque de anuncios (#tads o #tadsb)
$anuncios = $elemento->findElements(
WebDriverBy::xpath('ancestor::*[@id="tads" or @id="tadsb"]')
);
if (count($anuncios) > 0) {
$esPatrocinado = "(Patrocinado)";
}
$lista_resultados .= "Resultado #" . sprintf("%2d",($index + 1)) . " " . $esPatrocinado . ": " . substr($url,0,50) . "\n";
echo " Resultado #" . sprintf("%2d",($index + 1)) . " " . $esPatrocinado . ": " . substr($url,0,50) . "\n";
}
echo "\n";
// Comprobamos si el primer resultado está en nuestra lista de sitios oficiales
echo "3 - Comprobando el resultado con la lista de sitios oficiales.\n";
echo "4 - Resultado del test: ";
if (in_array($primero, $sitios_oficiales)) {
$detectado = false;
$logs .= "✅ ¡Test exitoso! El primer resultado es un sitio oficial --> ". $primero .".\n";
} else {
$detectado = true;
$logs .= "❌ Test fallido. El primer resultado no es un sitio oficial --> ". $primero .".\n";
}
echo $logs;
echo "5 - Se realizó una captura de pantalla.\n";
$screenshotPath = './capturas/google_search.png'; // Asegúrate de que este directorio sea escribible
$driver->takeScreenshot($screenshotPath);
// Se realiza una captura de pantalla
echo "6 - Se envia correo electrónico con la captura de pantalla del sitio detectado.\n";
if ($detectado) {
$mail = new PHPMailer(true);
try {
// Configuración del servidor SMTP
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = $email; // Tu correo de Gmail
$mail->Password = $password; // Tu contraseña
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->isHTML(true);
// Remitente y destinatario
$mail->setFrom('ccharlaselenium@gmail.com', 'Monitoreo Buscador - Posible phishing de sitio Gugler');
$mail->addAddress('exequiel84@gmail.com'); // Destinatario
// Asunto y cuerpo del correo
$mail->Subject = 'Monitoreo Buscador - Posible phishing de sitio Gugler';
$cuerpo_mail = 'Se ha detectado un posible intento de phishing del sitio oficial que se esta comprobando. Se incluye una captura de pantalla con los resultados de la prueba y el listado completo de resultados.<br><br> <b>Resultado del test:</b> <br><br>';
$cuerpo_mail .= $logs;
$cuerpo_mail .= "<br><br> <b>Lista de resultados:</b> <br><br>";
$cuerpo_mail .= nl2br($lista_resultados);
$cuerpo_mail .= "<br> Quedamos a disposición ante cualquier consulta.<br> Saludos cordiales.<br> Sector de Monitoreo.";
$mail->Body = $cuerpo_mail;
// Adjuntar la captura de pantalla
$mail->addAttachment($screenshotPath);
// Enviar el correo
$mail->send();
echo '7 - Se envió correo con el caso detectado.\n';
} catch (Exception $e) {
echo "7 - Hubo un error al enviar el correo: {$mail->ErrorInfo}";
}
} else { echo "7 - No se envió correo ya que no se detectó un sitio no oficial.\n";}
} catch (Exception $e) {
echo "Importante, hubo un error el test: " . $e->getMessage() . "\n";
} finally {
// Cerrar el driver
$driver->quit();
}
?>