Script para encontrar dominios vacíos a lo bestia

Filed in Artículos TécnicosTags: , , , ,

Este fin de semana estaba un pelín aburrido, así que tras leer un tweet de Alfredo Artiles @aartiles decidí hacer y preparar un proyectito que tenía en mente desde hacía tiempo y que como tantos otros, estaba en el cajón de TODOs.

El proyecto, del que ya hablaré detalladamente más adelante, es un acortador de url como tantos otros, vamos un campo de juegos donde ir haciendo pruebas. La cuestión es que para que fuese bueno, cuanto más corto fuese el domino mejor1 y me puse a buscar uno, claro que entre 2 y 3 caracteres, sin tener nada pensado de antes y yendo uno a uno, puede ser una locura. Así que decidí una alternativa para tener un listado más detallado y de forma automática, y me marqué este pseudo-script2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
 
echo "Script para buscar todos los whois de los dominos";
 
$letras = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$dominios = array(
//    'be' => array("precio" =>'7,95', "registered" => "/Status:      registeredED/", "free" => "/Status:      FREE/", "invalid" => "/% Invalid pattern/"),
 'tv' => array("precio" =>'20,95', "registered" => "/Status: CLIENT-XFER-PROHIBITED/",  "free" => "/No match for/", "invalid" => "/Status: CLIENT-DELETE-PROHIBITED/"),
 'eu' => array("precio" =>'6,95', "registered" => "/Registrant:/",  "free" => "/Status:    AVAILABLE/", "invalid" => "/Invalid pattern/"),
//    'asia' => array("precio" =>'10,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'at' => array("precio" =>'16,95', "registered" => "/registrant:/",  "free" => "/% nothing found/", "invalid" => "/% nothing found/"),
 'bz' => array("precio" =>'16,95', "registered" => "/Status:OK/",  "free" => "/NOT FOUND/", "invalid" => "/Status:CLIENT DELETE PROHIBITED/"),
 'ca' => array("precio" =>'12,95', "registered" => "/Domain status:         EXIST/",  "free" => "/Domain status:         AVAIL/", "invalid" => "/Error code:/"),
 'cc' => array("precio" =>'16,95', "registered" => "/Registrant:/",  "free" => "/No match for /", "invalid" => "/XXXXXXXXXXXXXX/"),
//    'ch' => array("precio" =>'27,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'cn' => array("precio" =>'28,95', "registered" => "/Domain Name/",  "free" => "/no matching record/", "invalid" => "/Sorry,/"),
 'de' => array("precio" =>'7,95', "registered" => "/Domain: /",  "free" => "/not found in database/", "invalid" => "/XXXXXXXXXXXXX/"),
//    'dk' => array("precio" =>'12,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
//    'fr' => array("precio" =>'15,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
//    'it' => array("precio" =>'15,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'in' => array("precio" =>'12,95', "registered" => "/Domain ID:/",  "free" => "/NOT FOUND/", "invalid" => "/XXXXXXXXXXXXXXXX/"),
 'li' => array("precio" =>'24,95', "registered" => "/Domain name:/",  "free" => "/We do not have an entry/", "invalid" => "/XXXXXXXXXXXXXXXXXXXXXXXX/"),
/*    'me' => array("precio" =>'16,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'nl' => array("precio" =>'7,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'us' => array("precio" =>'9,95', "registered" => "//",  "free" => "//", "invalid" => "//"),
 'ws' => array("precio" =>'15,95', "registered" => "//",  "free" => "//", "invalid" => "//"
*/
);
 
$resultados = fopen ("./resultados_positivos.csv", "w+");
$excepciones = fopen ("./resultados_fallados.txt", "w+");
 
$listado = array();
 
print "Creamos el abecedario \n";
foreach ($letras as $letra1)
{
 $listado[] = $letra1;
 foreach ($letras as $letra2)
 {
 $listado[] = $letra1.$letra2;
 foreach ($letras as $letra3)
 $listado[] = $letra1.$letra2.$letra3;
 }
}
 
print "Empezamos la busqueda \n";
foreach ($listado as $nombre)
{
 sleep(10);
 print "Cambiamos de nombre del abecedario. El nuevo nombre es {$nombre}. \n";
 
 foreach ($dominios as $dominio => $values)
 {
 sleep(5);
 print "Empezamos la busqueda de {$nombre}.{$dominio}\n";
 $whois = shell_exec("whois {$nombre}.{$dominio}");
 
 foreach ($values as $keyStatus => $mach)
 {
 if ($keyStatus == "precio") continue;
 if (preg_match($mach, $whois))
 {
 //Escribes y borras el $whois;
 fwrite ($resultados, "\"{$nombre}.{$dominio}\", \"{$keyStatus}\", \"{$values[precio]}\", \"{$dominio}\" ;\n");
 $whois = "";
 break;
 }
 }
 //Error si $whois no está en blanco.
 if (!empty($whois))
 {
 $tmp = "Hubo un error para el dominio {$nombre}.{$dominio}\n";
 fwrite ($excepciones, "{$tmp}\n{$whois}\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
 }
 }
}
 
fclose ($resultados);
fclose ($excepciones);
http://storage.alquesada.com/whois/
print "\n";
?>

Como veréis el script es muy sencillito, lo único que hace es crear una tabla de combinaciones con las letras del abecedario y para cada palabra creada así se pone a recorrer los distintos dominios buscando coincidencias sobre si está libre, está ocupado o da un error conocido el comando “whois“. Si lo consigue clasificar lo añade aun archivo CSV, sino guarda toda la información del whois en un archivo de excepciones para mirarlo después a mano.

El script es muy facilón y no me he molestado demasiado en las expresiones regulares, la forma de hacerlo era tan fácil como lanzar varios “whois” para cada tipo de dominio y ver que devolvía cada uno, coger la frase más significativa y meterla en la expresión regular, sin tratarla ni nada3.

Detalles:

  • Debido a las restricciones de los distintos servidores whois he metido en el script varios “sleep” para que no se quejen mucho. El problema es que esto retrasa enormemente los tiempos (en 24 horas no había llegado a los dominios “eb”). Aquí podéis jugar con los tiempos para acortar el proceso (sobretodo con el segundo “sleep“) a vuestro gusto.4
  • El script debido a lo que consume y tarda deberíais lanzarlo en linea de comandos. Si lo lanzáis a través de Apache parará al rato y no acabará.
  • Está demás decir que podéis jugar a comentar y descmentar los tipos de dominio que queráis, podéis añadir nuevos, cambiar las expresiones regulares por algo más fuerte… Libre albedrío!
  • Bueno, a los señorXs Windowseros, decirles que según creo recordar el comando “whois” no está por defecto. Ahí tendréis que ajustar parametros o descargarlo de donde sea.
  • Los precios que indico ahí son los precios para registros en DonDominio.com. Ni es mejor, ni peor que otras compañías, simplemente es la que yo uso.
  • El archivo de resultados positivos es un CVS. Es decir, lo podéis abrir con cualquier “spreadsheet” ya sea Excel, OOspreadsheet o el que tengáis. También lo podéis subir a bbdd y usarlo desde ahí.
  • OJO, esto no es la panacea y da falsos positivos, habría quizás que cambiar el orden en el array de dominios y poner “invalid” antes que “free” para recortar ciertos casos de falsos positivos, pero aun así no es seguro 100%5.

Y por último.

El archivo php lo podéis descargar de aquí:

http://storage.alquesada.com/whois/whois_script.txt

Y el archivo con los dominios hasta “eaw.tv” lo tenéis aquí:

http://storage.alquesada.com/whois/resultados_positivos.csv

Nota: no busquéis el dominio baq.be que es el que me he quedado yo al final ;-)

  1. Así que de toda mi lista de dominios no me valia ninguno
  2. Ya que yo no lo considero ni Scrpit
  3. Algo burdo, lo reconozco, pero a la vez rápido
  4. Yo no lo hice porque ya encontré el dominio y no lo necesitaba más
  5. Para estar hecho en media hora, no está mal

Feedback

Comments

2 Responses to “Script para encontrar dominios vacíos a lo bestia”
  1. JMChia dice:

    Hola Angel, hace tiempo hice algo parecido para checkear dominios y de paso guardaba la información del propietario.
    El problema me vino cuando ya era mucha información la que tenia que cargar el script. Al hacer un foreach te va copiando las variables y reserva memoria de nuevo, intenté pasandole el valor por referencia (foreach $variable as &$referencia) e incluso probé hacerle el unset al final del bucle para que fuera liberando, pero siempre quedaba algo residual que iba llenando cada vez más y más.
    Luego probé con un for recorriendo el array pero me daba también problemas, ya que las peticiones las hacia con curl y de manera asíncrona (iba pidiendo primero todos los datos con un bucle y luego con otro los iba recogiendo).

    No se si habrás tenido experiencias parecidas, pero es algo que todavía no he conseguido resolver, he mirado y remirado en foros más técnicos y no he encontrado solución. Quizá este demasiado acostumbrado a C que te deja la memoria mas “limpia” o utilice mal PHP.

  2. alquesada dice:

    Hola JMChia!

    Pues eso habría que mirar a fondo el código. Yo si ves el código vuelco toda la información sobre archivos, para tenerla siempre.

    La principal diferencia es que el script no he podido plantearlo asíncrono ya que muchos sites solo te posibilitan un número de intentos whois por hora con lo que al final o ponía delays o no iba a ningún lado. Con lo cual la memoria en todo el proceso no sufre, pero el proceso se hace eteeerno ;-)

    El tema de limpiar memoria con PHP también depende de la configuración del sistema.. PHP al estar pensado para servidores webs intenta siempre utilizar el mínimo posible y en la configuración siempre pone los topes muy estrictos. Si es para hacer algo en tu equipo alguna vez y no en un servidor de producción puedes probar a ampliar la memoria máxima de PHP, los tiempos y ver si así cuela…

    Yo para pasar datos de adscritos a cierto partido político tuve mi equipo medio muerto precisamente procesando gran cantidad de datos sobre PHP, pero soportó el tirón y proceso perfectamente…

    Otra cosa que puedes hacer es “partir” el script en scripts más pequeños y un “meta scrip” que vaya llamando uno a uno a los demás. Con esto conseguirás mantener la memoria en limites aceptables.

Trackbacks

  1. Bitacoras.com
  2. Tweets that mention Script para encontrar dominios vacíos a lo bestia | Aprendiendo a emprender -- Topsy.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Oenology Archives
Click to view / hide

Oenology Categories
Click to view / hide

Oenology Post Formats
Click to view / hide

 
octubre 2009
L M X J V S D
« sep   nov »
 1234
567891011
12131415161718
19202122232425
262728293031  
Positions by Seo-Watcher