{"id":462,"date":"2016-06-02T11:21:42","date_gmt":"2016-06-02T10:21:42","guid":{"rendered":"http:\/\/capri.dev\/blog\/?p=462"},"modified":"2022-11-05T11:14:13","modified_gmt":"2022-11-05T10:14:13","slug":"script-ruby-para-hacer-whois-programado-con-crontab","status":"publish","type":"post","link":"https:\/\/capri.dev\/blog\/script-ruby-para-hacer-whois-programado-con-crontab\/","title":{"rendered":"Script ruby para hacer whois programado con crontab"},"content":{"rendered":"<p>Hace poco quise contratar un dominio que un anterior propietario hab\u00eda dejado caducar. Desde que me di cuenta de que el dominio hab\u00eda caducado hasta que lo pude contratar pasaron unos 90 d\u00edas. Estuve pendiente durante los m\u00e1s de 70 d\u00edas que GoDaddy lo tuvo en estado de \u00abredemptionPeriod\u00bb (un estado que s\u00f3lo deber\u00eda durar 30 d\u00edas seg\u00fan la ICANN), y posteriormente pendiente durante el estado \u00abpendingDelete\u00bb, que en teor\u00eda deber\u00eda durar s\u00f3lo 5 d\u00edas, pero cuando ya llevaba 7 consultando el whois 3 \u00f3 4 veces al d\u00eda, decid\u00ed que prefer\u00eda que una m\u00e1quina hiciera el trabajo por mi, as\u00ed que me puse a fabricar un script con Ruby que hiciera el trabajo. <!--more--><\/p>\n<p>Lo primero era la operaci\u00f3n de whois en s\u00ed misma. Afortunadamente encontr\u00e9 una gem que hac\u00eda el trabajo:<\/p>\n<p><a href=\"https:\/\/rubygems.org\/gems\/whois\/versions\/3.6.5\" title=\"https:\/\/rubygems.org\/gems\/whois\/versions\/3.6.5\" target=\"_blank\" rel=\"noopener\">https:\/\/rubygems.org\/gems\/whois\/versions\/3.6.5<\/a><\/p>\n<p>As\u00ed que despu\u00e9s de instalarla en el sistema con<\/p>\n<pre class=\"prettyprint lang-bash\">gem install whois\n<\/pre>\n<p>Escrib\u00ed el siguiente script:<\/p>\n<pre class=\"prettyprint lang-ruby\">require 'whois'\nrequire 'net\/smtp' #para poder enviarme un correo\n\ndef enviar_correo(dominio)\n  mje = &lt;&lt;END_OF_MESSAGE\n  From: Whois Script &lt;remitente@dominio.com&gt;\n  To: Destinatario &lt;destinatario@dominio.com&gt;\n  Subject: Status de #{dominio}\n\n  El dominio #{dominio} ya esta disponible para registro!, CORRE!\n  END_OF_MESSAGE\n\n  smtp = Net::SMTP.new 'smtp.gmail.com', 587\n  smtp.enable_starttls\n  smtp.start(\"dominio.com\", \"cuenta@dominio.com\", \"contrase\u00f1a\", :login) do\n    smtp.send_message(mje, \"remitente@dominio.com\", \"destinatario@dominio.com\")\n  end\nend\n\ndef escribir_entrada_en(fichero, dominio, status)\n  fecha = Time.new\n  fichero.write(\"#{fecha}\\t#{dominio}\\t#{status}\\n\")\nend\n\ndominios_a_comprobar = [\"midominiodeseado.com\"] #por si queremos comprobar m\u00e1s de 1 dominio a la vez\nwhois_client = Whois::Client.new\nlog = File.new('whois-programado.log', 'a')\ndominios_a_comprobar.each do |dominio|\n  whois_record = whois_client.lookup(dominio)\n  enviar_correo(dominio) if whois_record.available?\n  escribir_entrada_en log, dominio, whois_record.status\nend\n<\/pre>\n<p>Y cre\u00e9 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\u00eda un correo:<\/p>\n<pre class=\"prettyprint lang-bash\">*\/20 * * * * \/usr\/local\/rvm\/wrappers\/ruby-1.9.3-p551\/ruby \/home\/scripts\/whois-programado.rb\n<\/pre>\n<p>Tres d\u00edas despu\u00e9s, a las 18:20 recib\u00eda un correo en mi tel\u00e9fono, a las 18:30 estaba registrando el dominio y a las 18:50 \u00a1era m\u00edo!. Tiempo que estuvo libre el dominio: 30 minutos. No habr\u00eda sido posible sin ese script, y lo que es peor, es posible que alguien m\u00e1s lo hubiera contratado antes que yo.<\/p>\n<p>El script no es nada del otro mundo y seguramente cualquiera dar\u00eda con \u00e9l, 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\u00f3n del registrador, a pesar de que dichos tiempos est\u00e1n perfectamente estipulados por la ICANN. GoDaddy es especialmente lenta a la hora de liberar dominios, sobre todo alargan el redemptionPeriod m\u00e1s all\u00e1 del doble de lo estipulado&#8230; si es que tienes suerte de que no decidan secuestrarlo y especular con \u00e9l, que tambi\u00e9n es una pr\u00e1ctica muy habitual de esta empresa (motivo por el que hace tiempo decid\u00ed nunca contratar nada con ellos, dicho sea de paso).<\/p>\n<p>En relaci\u00f3n a la gem whois he de decir que no es precisamente una maravilla, al menos la versi\u00f3n a d\u00eda de hoy (3.6.5), pues entre otras cosas no permite consultar el estado exacto en el que est\u00e1 el dominio, sino solamente si est\u00e1 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\u00eda absurdo). Seguramente fabricando un parser a medida se podr\u00eda conseguir, pero la verdad es que no quise dedicar m\u00e1s tiempo a esto. En cualquier caso, si alguien lo considera \u00fatil y quiere compartir el c\u00f3digo mejorado con parser espec\u00edfico para detectar estados, estar\u00eda muy bien, pues de esa manera se podr\u00eda programar la tarea 1 vez al d\u00eda 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\u00f3ico que se est\u00e9 con la posibilidad de que otro lo registre antes que nosotros).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace poco quise contratar un dominio que un anterior propietario hab\u00eda dejado caducar. Desde que me di cuenta de que el dominio hab\u00eda caducado hasta que lo pude contratar pasaron unos 90 d\u00edas. Estuve pendiente durante los m\u00e1s de 70 d\u00edas que GoDaddy lo tuvo en estado de \u00abredemptionPeriod\u00bb (un estado que s\u00f3lo deber\u00eda durar 30 d\u00edas seg\u00fan la ICANN), y posteriormente pendiente durante el estado \u00abpendingDelete\u00bb, que en teor\u00eda deber\u00eda durar s\u00f3lo 5 d\u00edas, pero cuando ya llevaba 7 consultando el whois 3 \u00f3 4 veces al d\u00eda, decid\u00ed que prefer\u00eda que una m\u00e1quina hiciera el trabajo por mi, as\u00ed que me puse a fabricar un script con Ruby que hiciera el trabajo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[192,216,104,190],"class_list":["post-462","post","type-post","status-publish","format-standard","hentry","category-tecnico","tag-cronjob","tag-ruby","tag-ruby-1-9-2","tag-scripts"],"_links":{"self":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts\/462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/comments?post=462"}],"version-history":[{"count":0,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/posts\/462\/revisions"}],"wp:attachment":[{"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/media?parent=462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/categories?post=462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/capri.dev\/blog\/wp-json\/wp\/v2\/tags?post=462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}