
detectar tecnologías con una alternativa a wappalyzer
Este proyecto es una herramienta de línea de comandos y una biblioteca de Python que utiliza la extensión de navegador Wappalyzer y sus huellas digitales para detectar tecnologías. Otros proyectos que surgieron después de la interrupción del proyecto oficial de código abierto están utilizando huellas digitales desactualizadas y carecen de precisión en aplicaciones web dinámicas. Este proyecto sortea esas limitaciones ejecutando la extensión en Chromium a través de Playwright.

Después de instalar el paquete de Python, instala el navegador Chromium de Playwright:
python -m playwright install chromium
En contenedores Linux mínimos, también instala las dependencias del sistema de Chromium:
python -m playwright install-deps chromium
pipx install wappalyzer
pipx run --spec playwright playwright install chromium
Para usarlo como biblioteca, instálalo con pip dentro de un contenedor aislado, por ejemplo venv o docker. También puedes usar --break-system-packages para hacer una instalación 'normal' pero no se recomienda.
pip install wappalyzer
python -m playwright install chromium
git clone https://github.com/s0md3v/wappalyzer-next.git
cd wappalyzer-next
docker compose build
docker compose run --rm wappalyzer -i https://example.com
docker compose run --rm wappalyzer -i urls.txt -w 3 -oJ output.json
A continuación se muestran algunos ejemplos de uso comunes; consulta la lista de todas las opciones para obtener más información.
wappalyzer -i https://example.comwappalyzer -i urls.txt -w 3wappalyzer -i urls.txt -t 15wappalyzer -i https://example.com -c "sessionid=abc123; token=xyz789"wappalyzer -i https://example.com -oJ results.jsonwappalyzer -i https://example.com -oJCuando se usa una bandera de salida sin un archivo, el informe se escribe en stdout. Las líneas de estado, el texto del banner y los errores se escriben en stderr.
Nota: Para precisión usa el tipo de escaneo 'full' (por defecto). 'fast' y 'balanced' no usan emulación de navegador.
-i: URL de entrada o archivo que contiene URLs (una por línea)--scan-type: Tipo de escaneo (por defecto: 'full')
fast: Escaneo rápido basado en HTTP (envía 1 solicitud)balanced: Escaneo basado en HTTP con más solicitudesfull: Escaneo completo usando la extensión wappalyzer-w, --workers: Número de trabajadores concurrentes (por defecto: 5; los escaneos completos están limitados a 3)-t, --timeout: Segundos máximos de espera para la carga de una página en escaneos completos (por defecto: 30)-oJ [file]: Ruta del archivo de salida JSON, o stdout cuando se omite el archivo o se establece como --oC [file]: Ruta del archivo de salida CSV, o stdout cuando se omite el archivo o se establece como --oH [file]: Ruta del archivo de salida HTML, o stdout cuando se omite el archivo o se establece como La biblioteca de Python está disponible en pypi como wappalyzer y se puede importar con el mismo nombre.
Usa Wappalyzer cuando escanees más de una URL. El navegador se inicia una vez, se reutiliza y se cierra cuando el bloque with termina.
from wappalyzer import Wappalyzer
with Wappalyzer(workers=3, timeout=30) as scanner:
results = scanner.analyze_many([
'https://example.com',
'https://github.com',
'https://python.org',
])
for url, technologies in results.items():
print(url)
for name, data in technologies.items():
version = f" {data['version']}" if data['version'] else ""
print(f" {name}{version}")
El mismo escáner también puede escanear una URL a la vez sin volver a abrir Chromium:
from wappalyzer import Wappalyzer
with Wappalyzer(workers=3, timeout=30) as scanner:
github = scanner.analyze('https://github.com')
python = scanner.analyze('https://python.org')
Para una sola URL, analyze() es más corto. Crea su propio escáner, ejecuta un escaneo y lo cierra.
from wappalyzer import analyze
results = analyze(
url='https://example.com',
scan_type='full', # 'fast', 'balanced', or 'full'
cookie='sessionid=abc123',
timeout=30
)
No llames a la función analyze() de nivel superior en un bucle para trabajos grandes. Usa Wappalyzer.analyze_many() o Wappalyzer.analyze() en un escáner reutilizado para que Chromium y la extensión Wappalyzer no se recarguen para cada URL.
url (str): La URL a analizarscan_type (str, opcional): Tipo de escaneo a realizar
'fast': Escaneo rápido basado en HTTP'balanced': Escaneo basado en HTTP con más solicitudes'full': Escaneo completo que incluye ejecución de JavaScript (por defecto)workers (int, opcional): Número de workers del navegador a crear para escaneos completos (por defecto: 1)cookie (str, opcional): Cadena de encabezado de cookie para escaneos autenticadostimeout (int, opcional): Segundos máximos de espera para la carga de una página en escaneos completos (por defecto: 30)Devuelve un diccionario con la URL como clave y las tecnologías detectadas como valor:
{
"https://github.com": {
"Amazon S3": {
"version": "",
"confidence": 100,
"categories": ["CDN"],
"groups": ["Servers"]
},
"React Router": {
"version": "6",
"confidence": 100,
"categories": ["JavaScript frameworks"],
"groups": ["Web development"]
}
},
"https://example.com": {}
}
El escáner completo ejecuta la extensión Wappalyzer en Chromium a través de Playwright. El soporte de extensiones de Chromium en Playwright es directo y no requiere geckodriver ni Selenium.
--c, --cookie: Cadena de encabezado de cookie para escaneos autenticados