
wappalyzer-next v2.0.2
detectar tecnologías con una alternativa a wappalyzer
Wappalyzer Next
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.

Instalación
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
Instalar como herramienta de línea de comandos
pipx install wappalyzer
pipx run --spec playwright playwright install chromium
Instalar como biblioteca
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
Instalar con Docker
Pasos
- Clona el repositorio:
git clone https://github.com/s0md3v/wappalyzer-next.git
cd wappalyzer-next
- Construye y ejecuta con Docker Compose:
docker compose build
- Para escanear URLs usando el contenedor Docker:
- Escanear una sola URL:
docker compose run --rm wappalyzer -i https://example.com
- Escanear múltiples URLs desde un archivo:
docker compose run --rm wappalyzer -i urls.txt -w 3 -oJ output.json
Para Usuarios
A continuación se muestran algunos ejemplos de uso comunes; consulta la lista de todas las opciones para obtener más información.
- Escanear una sola URL:
wappalyzer -i https://example.com - Escanear múltiples URLs desde un archivo:
wappalyzer -i urls.txt -w 3 - Establecer tiempo de espera de carga de página para escaneos completos:
wappalyzer -i urls.txt -t 15 - Escanear con autenticación:
wappalyzer -i https://example.com -c "sessionid=abc123; token=xyz789" - Exportar resultados a JSON:
wappalyzer -i https://example.com -oJ results.json - Exportar JSON a stdout:
wappalyzer -i https://example.com -oJ
Cuando 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.
Opciones
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--c, --cookie: Cadena de encabezado de cookie para escaneos autenticados
Para Desarrolladores
La biblioteca de Python está disponible en pypi como wappalyzer y se puede importar con el mismo nombre.
Usando la Biblioteca
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.
Parámetros de la Función analyze()
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)
Valor de Retorno
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": {}
}
Preguntas Frecuentes
¿Por qué Chromium y Playwright?
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.
¿Cuál es la diferencia entre los tipos de escaneo 'fast', 'balanced' y 'full'?
- fast: Envía una única solicitud HTTP a la URL. No usa la extensión.
- balanced: Envía solicitudes HTTP adicionales a archivos .js, /robots.txt y realiza consultas DNS. No usa la extensión.
- full: Usa la extensión oficial de Wappalyzer para escanear la URL en un navegador sin cabeza (headless).