Baq.be – “mi” nueva generación de acortadores de url.
Oct/094
Bueno, hoy toca presentar mi último “campo de cultivo“: Baq.Be
Aunque, en principio, viendo el estado actual del site1, más que hablaros de que es Baq.Be os voy a hablar de porque lo estoy empezando a desarrollar2 y a donde quiero llegar con él.
El por qué lo estoy desarrollando es fácil de explicar. Porque me da la gana.
Hace ya un tiempo que la mayoría de los desarrollos que me llegan me los piden sobre Drupal y claro, ahí lo de analizar, desarrollar y pensar, pues como que no. Más bien se juega a colocar y configurar cosas para que esté como al cliente le gusta. Así que decidí no enquilosarme y me puse con uno de los tantos proyecto/pruebas que tengo pendientes.
La idea de Baq.Be es desarrollar un site para acortar URLs como tantos otros que hay en el mercado. Desarrollar un portal con un API abierta para que cualquier desarrollador pueda usar Baq.Be como pasarela para acortar URLs, como tantos otros. Llenarlo de estadísticas, enlazarlo con Twitter y Facebook, permitir guardar perfiles de visitantes, como tantos otros. Subir imágenes y archivos, comprobar estadísticas de los mísmos, o modificarlos si es necesario. Si, como tantos otros.
Entonces que aporta Baq.Be frente al resto de sites que ya hacen esto? Que tiene de nuevo? Pues poca cosa, la verdad. Más bien nada nuevo para la red.
Por eso, como ya avisaba antes, lo hago porque quiero, porque así pruebo un montón de cosas que tenía en el tintero y que si no es por cosas como estas no voy a usar nunca y porque así desconecto un poco de los gestores prefabricados, vuelvo con mis librerías y las refino un poco más.
Y sobretodo, porque me gusta trastear!
Así que nada, si queréis tener una cuenta de acceso a la versión “Alfa -1” de Baq.Be e ir comprobando las novedades poco a poco, solo tenéis que mandar un correito a hola EN baq.be DOT com y os daré user/pass tan rápido como pueda.
- Después abandonar muchos proyectos por falta de tiempo para completarlos lo suficiente como para sacar algo 100% funcional, he decidido con Baq.Be, cambiar las formas y sacarlo nada más tener lo básico y así obligarme a ir actualizandolo y subiendo los cambios para que la gente los vea, pueda conseguir un mayor feedback y motivación para acabarlo del todo. ↩
- Actualmente lleva menos de 15 horas de desarrollo, creo que lo más justo es decir “empezando a desarrollar” ↩
Script para encontrar dominios vacíos a lo bestia
Oct/094
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
![]()