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»]