Encontrar Dominios Expirados en Python

Dídac Anton es un apasionado del SEO, la programación y el emprendimiento. A pesar de tener solo 16 años, disfruta del reto de crear cosas útiles con Python. Se le puede encontrar en Twitter como @seo_torch (imprescindible seguir). Comparte con vosotros este código de Python en su primera versión, que busca dominios expirados y que sigue mejorando día a día.

# Script hecho por Dídac Anton (@seo_torch), si tienes cualquier duda o problema, contáctame en Twitter 👇🏽
# https://twitter.com/seo_torch
# Si crees que este script aporta valor a la comunidad SEO, considera hacer RT a
# https://twitter.com/seo_torch/status/1607808513442721792?s=20&t=FZ4Bi2wRFaxZflpN3vmhGA
 
# Únete a https://t.me/expirados para que te notifiquemos cada 5 horas con un nuevo expirado!!
 
# 
# 
# 1. Queda prohibida la comercialización de este script hecho PARA uso personal
# 2. Suerte buscando expirados 🔍
# 
# 
 
import dns.resolver # pip install dnspython
import itertools
import io
import requests # pip install requests
import json
from datetime import datetime
from colorama import Fore as f # pip install colorama
 
 
lista_nombres = ["ventilador", "ventiladores", "comprar ventiladores"] # Añade más palabras usando el mismo formato
lista_gTLDs = ["es", "com", "org", "net", "top", "info"] # Puedes añadir o quitar los que quieras
 
 
def combinaciones(input_name, input_tld):
    urls = []
    combinaciones = itertools.product(input_name, input_tld)
    for c in combinaciones:
        urls.append((f"{(c[0]).replace(' ', '')}.{c[1]}"))
    return urls
 
 
def formatear_fecha(fecha_str):
    fecha = datetime.strptime(fecha_str, "%Y%m%d%H%M%S")
    return fecha.strftime("%d/%m/%Y %H:%M:%S")
 
 
def check_archive(url, count):
    req = requests.get(
        f'https://archive.org/wayback/available?url={url}').json()["archived_snapshots"]
    try:
        latestCrawl = req["closest"]
        if (latestCrawl["timestamp"] and latestCrawl["url"]):
            print(f.MAGENTA+str(count+1)+" | "+f.WHITE+"EXPIRED: "+f.GREEN+url.strip()+" | " +
                  formatear_fecha(str(latestCrawl["timestamp"]))+" | "+latestCrawl["url"]+f.WHITE)
    except KeyError as e:
        print(f.MAGENTA+str(count+1)+" | "+f.WHITE +
              "AVAILABLE: "+f.YELLOW+url.strip()+f.WHITE)
        pass
        return
 
 
def clear_url(url):
    url = url.replace('http://', '', 1).replace('https://', '', 1)
    url = url.replace('www.', '', 1)
    url = url.split('/')[0]
    url = url.split('?')[0]
    return url.strip()
 
 
for count, url in enumerate(combinaciones(lista_nombres, lista_gTLDs)):
    url = clear_url(url)
    try:
        dns.resolver.resolve(url)
        print(f.MAGENTA+str(count+1)+" | "+f.WHITE +
              "TAKEN: "+f.RED+url.strip()+f.WHITE)
    except dns.resolver.NXDOMAIN:
        check_archive(url, count)
        pass
    except Exception as e:
        print(f.MAGENTA+str(count+1)+" | "+f.WHITE +"ERROR: "+f.BLUE+url.strip()+f.WHITE)
        print(e)
        pass

Una breve descripción de cómo funciona

En el script, hay una función para generar dominios: Específicas unas keywords (por ej. «ventilador») y unos TLD (com, es) y genera todas las combinaciones posibles, en este caso serían solo dos: ventilador.com, ventilador.es. Puedes poner tantos TLD y keywords como quieras. Seguidamente, por cada URL generada, revisa los nameservers.

Si no da ningún error, significa que el dominio está alojado en algún servidor, por lo que no está expirado. Ahora ya tenemos filtrados los dominios que están siendo alojados en algún servidor y los que no tienen ningún nameserver asignado.

Ahora nos centraremos en el grupo que no tiene ningún nameserver asignado, por cada URL usaremos la función check_archive(), que ejecutará una petición a la API de archive.org para ver si hay algún registro de ese dominio. Esta función nos conseguirá la URL del último rastreo de archive.org y la fecha de este.

  • Los dominios con nameservers se considerarán registrados: Marcados en rojo
  • Los dominios sin nameservers que no tienen registro en archive se considerarán disponibles: Marcados en naranja
  • Los dominios sin nameservers que tengan registros en archive se considerarán expirados: Marcados en verde
  • Los dominios que causen un error al hacer la petición DNS son dominios que no están siendo alojados en ningún sitio, pero que no se encuentran disponibles: Marcados en Azul

Un ejemplo práctico

INPUT:
lista_nombres = [«setas», «seta», «comprarsetas»]
lista_gTLDs = [«es», «com», «org», «net», «top», «info»]

Conclusión: CONCLUSIÓN: Hemos encontrado dos dominios relacionados con la palabra setas que fueron usados antes, vemos que setas.info fue rastreado hace apenas dos meses en web.archive, así que pinchamos en el enlace (http://web.archive.org/web/20220815090158/http://setas.info/). He rastreado hasta 2016 (http://web.archive.org/web/20161006013340/http://setas.info/) y veo que no hay nada interesante, pero me he fijado en el otro dominio: comprarsetas.org y he visto que en 2011 (http://web.archive.org/web/20110814090003/http://www.comprarsetas.org/) tenían hecha una mini-web de venta de setas en Madrid.

Deja un comentario