Script ruby para hacer whois programado con crontab

Hace poco quise contratar un dominio que un anterior propietario había dejado caducar. Desde que me di cuenta de que el dominio había caducado hasta que lo pude contratar pasaron unos 90 días. Estuve pendiente durante los más de 70 días que GoDaddy lo tuvo en estado de «redemptionPeriod» (un estado que sólo debería durar 30 días según la ICANN), y posteriormente pendiente durante el estado «pendingDelete», que en teoría debería durar sólo 5 días, pero cuando ya llevaba 7 consultando el whois 3 ó 4 veces al día, decidí que prefería que una máquina hiciera el trabajo por mi, así que me puse a fabricar un script con Ruby que hiciera el trabajo.

Lo primero era la operación de whois en sí misma. Afortunadamente encontré una gem que hacía el trabajo:

https://rubygems.org/gems/whois/versions/3.6.5

Así que después de instalarla en el sistema con

gem install whois

Escribí el siguiente script:

require 'whois'
require 'net/smtp' #para poder enviarme un correo

def enviar_correo(dominio)
  mje = <<END_OF_MESSAGE
  From: Whois Script <remitente@dominio.com>
  To: Destinatario <destinatario@dominio.com>
  Subject: Status de #{dominio}

  El dominio #{dominio} ya esta disponible para registro!, CORRE!
  END_OF_MESSAGE

  smtp = Net::SMTP.new 'smtp.gmail.com', 587
  smtp.enable_starttls
  smtp.start("dominio.com", "cuenta@dominio.com", "contraseña", :login) do
    smtp.send_message(mje, "remitente@dominio.com", "destinatario@dominio.com")
  end
end

def escribir_entrada_en(fichero, dominio, status)
  fecha = Time.new
  fichero.write("#{fecha}\t#{dominio}\t#{status}\n")
end

dominios_a_comprobar = ["midominiodeseado.com"] #por si queremos comprobar más de 1 dominio a la vez
whois_client = Whois::Client.new
log = File.new('whois-programado.log', 'a')
dominios_a_comprobar.each do |dominio|
  whois_record = whois_client.lookup(dominio)
  enviar_correo(dominio) if whois_record.available?
  escribir_entrada_en log, dominio, whois_record.status
end

Y creé una tarea cron que se ejecutara cada 20 minutos en uno de los VPSs que tengo contratados, de modo que en cuanto el dominio estuviera disponible para registro, me mandaría un correo:

*/20 * * * * /usr/local/rvm/wrappers/ruby-1.9.3-p551/ruby /home/scripts/whois-programado.rb

Tres días después, a las 18:20 recibía un correo en mi teléfono, a las 18:30 estaba registrando el dominio y a las 18:50 ¡era mío!. Tiempo que estuvo libre el dominio: 30 minutos. No habría sido posible sin ese script, y lo que es peor, es posible que alguien más lo hubiera contratado antes que yo.

El script no es nada del otro mundo y seguramente cualquiera daría con él, pero he decidido publicarlo porque es bastante pesado tener que estar pendiente de este tipo de cosas, sobre todo debido a que el tiempo que hay que esperar desde que el dominio caduca hasta que pasa a estar libre es muy variable en función del registrador, a pesar de que dichos tiempos están perfectamente estipulados por la ICANN. GoDaddy es especialmente lenta a la hora de liberar dominios, sobre todo alargan el redemptionPeriod más allá del doble de lo estipulado… si es que tienes suerte de que no decidan secuestrarlo y especular con él, que también es una práctica muy habitual de esta empresa (motivo por el que hace tiempo decidí nunca contratar nada con ellos, dicho sea de paso).

En relación a la gem whois he de decir que no es precisamente una maravilla, al menos la versión a día de hoy (3.6.5), pues entre otras cosas no permite consultar el estado exacto en el que está el dominio, sino solamente si está libre o no (al menos el parser por defecto no lo hace), motivo por el cual no conviene ejecutar este script en redemptionPeriod u otro estado que no sea pendingDelete (al menos no con la frecuencia de 20 minutos porque sería absurdo). Seguramente fabricando un parser a medida se podría conseguir, pero la verdad es que no quise dedicar más tiempo a esto. En cualquier caso, si alguien lo considera útil y quiere compartir el código mejorado con parser específico para detectar estados, estaría muy bien, pues de esa manera se podría programar la tarea 1 vez al día durante el estado redemptionPeriod, que mandara un mail cuando cambiara a pendingDelete y en ese momento reprogramar la tarea para que haga la consulta cada 20 minutos (o menos, eso ya depende de lo paranóico que se esté con la posibilidad de que otro lo registre antes que nosotros).

Share this post

Related post

There are no comment yet.

{ Piensa / Think }

"This is a waste of life. [...] the entire educational system in the modern day is nothing more than a cookie cutter processing plant that prepares humans for mostly predefined occupational roles. This element of human life has become so traditionally ingrained, that many falsely consider the nature of ‘having a job’ some form of human instinct. Even parents will ask their kids “What do you want to be when you grow up?” as though there was only one thing. This is disturbing and a violation of human potential." - The Zeitgeist Movement


"He aprendido que hay cosas que pueden ser comprendidas pero que nunca podrán ser explicadas con palabras sin desvirtuar su grandeza" - Andrés Pascual


"You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete." - Buckminster Fuller


"... I am the master of my fate. I am the captain of my soul." - William Ernest Henley