Autor Tema: Extraer informacion (direcciones de correo electronico). (NO SPAM)  (Leído 4070 veces)

0 Usuarios y 1 Visitante están viendo este tema.

zaer

  • Mensajes: 16
  • Liked: 0
Despues de dejar a un lado las problematicas que he tenido con Solaris, Oracle y C/C++ me tome un relax para escribir un script el cual extrae "x" contenido de los motores de busqueda como GOOGLE o Yahoo y que mejor probarlo con direcciones de correo electronico... confirmo... NO ES PARA ESPAM ya que algunos me han criticado como escoria virtual o cosas asi, pero en fin...

el codigo que pongo tendra "xxxxxxxxxxxxxx" en lugar de algunas lineas para evitar que solo hagan copy & paste y no sepan que es lo que hace en realidad.

Código: [Seleccionar]

#!/usr/bin/php
<?php
/*
Un dia como estos
zaer00t@gmail.com
*/
set_time_limit(0);
function extrae_ligas()
{
        #funcion que extrae las ligas de un archivo de texto
        //cargamos archivo
        $direcciones = array();
        $lista = file_get_contents("salida.txt");
        preg_match_all("/https?\:\/\/[^\" ]+(\.txt)+/i",$lista,$coins);
        $elf = array_unique($coins[0]);
        for($i=0;$i<count($elf);$i++)
        {
                if(!empty($elf[$i]))
                {
                        //file_put_contents($log, $elf[$i].$delimiter, FILE_APPEND);
                        //echo "pasa: ".$elf[$i]."<br>";
                        $direcciones[]=$elf[$i];
                }
        }
        return $direcciones;
}
function extrae_mails($directorio)
{
        $tamanio = sizeof($directorio);
        for($i=0; $i<$tamanio; $i++)
        {
                sleep(1);
                echo "entramos";
                $log = date("ymd_his").".txt";
                $delimiter="\n";
                #$file = file_get_contents($directorio[$i]);
                $fh = file_get_contents($directorio[$i]);
                preg_match_all('/\b[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}\b/i', $fh, $matches);
                $elf = array_unique($matches[0]);
                for($i=0;$i<count($elf);$i++)
                {
                                if(!empty($elf[$i]))
                                file_put_contents($log, $elf[$i].$delimiter, FILE_APPEND);
                }
        }
}
function pingpong($host, $timeout = 1)
{
        /* puts esto de los sockets me esta gustando */
        $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
        $socket  = socket_create(AF_INET, SOCK_RAW, SOL_TCP);
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
        socket_connect($socket, $host, null);
        $ts = microtime(true);
        socket_send($socket, $package, strLen($package), 0);
        if (socket_read($socket, 255))
                $result = microtime(true) - $ts;
        else
                $result = false;
        socket_close($socket);
        return $result;
}
function verificador($email)
{
        # validamos primero el correo
        $patron= '/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/';
        if(preg_match($patron,$email))
        {
                echo "\n\tYa chingaste, tienes un email correcto!\n\n";
                /* si tenemos un email correcto, ahora falta verificar el dominio
                   del correo para ver si existe
                */
                # extraemos el nombre del dominio
                preg_match("/(@)+[a-zA-Z0-9.]+\.([^\/]+)/",$email,$dominio);
                $dom = substr($dominio[0],1);
                echo "\nNombre de dominio: ".$dom."\n";
                // verificamos si el dominio existe con la funcion pingpong
                echo "Verificando dominio...  ";
                if(pingpong($dom))
                {
                        echo "dominio valido!\n";
                        /* hasta este punto vamos muy bien, ahora solo falta verificar la direccion completa */
                        $aguanta=2;
                        $errno=0;
                        $errstr=0;
                        if($socket = @fsockopen("smtp.".$dom,587,$errno,$errstr,2))
                        {
                                $responde = fgets($socket);
                                echo "\n\tsocket establecido para $dom ... Zaz!\n";
                                stream_set_timeout($socket, 5);
                                $meta = stream_get_meta_data($socket);
                                echo "$dom responde: $responde\n";
                                #constuimos a testeador
                                $testeador = "testing"."@".$dom;
                                $cmds = array(
                                                "HELOxxxxxxxxxxxxxx.com",
                                                "MAIL FROM: <testing@xxxxxxxxxxxxxx.com>",
                                                "RCPT TO: <$email>",
                                                "QUIT",
                                                        );
                                # si tenemos un pinche error al conectarnos mocos...
                                if(!$meta['timed_out'] && !preg_match('/^2\d\d[ -]/', $responde))
                                {
                                        $error = "\n\tError: $dom dice: $responde\n";
                                        break;
                                }
                                foreach($cmds as $cmd)
                                {
                                        $antes = microtime(true);
                                        fputs($socket, "$cmd\r\n");
                                        $responde = fgets($socket, 4096);
                                        $t = 1000*(microtime(true)-$antes);
                                        echo ("$cmd\n$responde") . "(" . sprintf('%.2f', $t) . " ms)\n";
                                        if(!$meta['timed_out'] && preg_match('/^5\d\d[ -]/', $responde))
                                        {
                                                $error = "FAIL";
                                                break;
                                        }
                                }
                                fclose($socket);
                        }
                        else
                        {
                                echo "nos jodimos";
                        }
                }
                else
                {
                        echo "dominio no valido!\n";
                }
        }
        else
        {
                echo "\n\tmail no valido\n\n";
                return false;
        }
}
#sockets en php
//$host = "search.yahoo.com";
$host = "google.com";
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$port = 80;
for($i=0; $i<9; $i++)
{
        $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        xxxxxxxxxxxxxx
        if($conexion)
        {
                echo "\n\tconexion exitosa\n";
                $buffer = "GET /search?q=\"%40hotmail.com\"%2b\"%40gmail.com\"%2b\"%40megared.net.mx\"%2b\"%40yahoo.com.mx\"+filetype:tx
t&hl=es&lr=&start=".$i."&sa=N HTTP/1.1\r\n".
                "Host: localhost\r\n".
                "Accept: */*".
                "Accept-Language: es-mx".
                "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)\r\n".
                "Connection: Close\r\n\r\n";
                echo "\n\tpasada: ".$i."\n";
                $salida=" ";
                xxxxxxxxxxxxxx
                socket_write($socket,$buffer);
                while($salida = socket_read($socket,2048))
                {
                        fwrite($f1,$salida);
                }
                fclose($f1);
                $x=extrae_ligas();
                extrae_mails($x);
        }
        else
        {
                echo "fallo la conexion";
        }
        socket_close($socket);
}
?>


Una breve explicacion: El script realiza una conexion via socket por el puerto 80 enviando la siguiente peticion: "GET /search?q=\"%40hotmail.com\"%2b\"%40gmail.com\"%2b\"%40megared.net.mx\"%2b\"%40yahoo.com.mx\"+filetype:tx
t" dicha peticion es enviarle parametros de busqueda a la variable "q" del archivo search, es practicamente como si nosotros escribieramos lo siguien en la barra de google: "@hotmail.com"+"@gmail.com"+"@megared.net.mx"+"@yahoo.com.mx"+filetype:txt la cual nos mostrara paginas que contengan archivos con extencion txt y con contenidmo similar a las cadenas concatenadas, que en este caso es @+nombre-de-dominio ya que se establece la coneccion, la peticion que reenvia el buscador es almacenada en un archivo de texto  y bueno el codigo lo explica todo.... quice agregar una funcion para verificar si la direccion de correo es verdadera o no pero despues de que termine la funcion me percate que no es tan simple ya que casi todos los SMTP requieren autenticacion.

la verificacion del correo consiste en lo siguiente:

generamos la coneccion al servidor SMTP

 "HELO servidor.com",
 "MAIL FROM: <testing@servidor.com>",
 "RCPT TO: <$email>",
 "QUIT",

sin embargo esperamos una respuesta del tipo 220 y este nos regresa un error 530  <-- que indica que requiere autenticacion. lastima iba bien hasta que me di cuenta de ello.


Para que nos puede ayudar.... pues en si yo estaba pensando para un *.vbs que se enviara o sacar informacion como imagenes, docs, pdf etc....


slds.