
wappalyzer-next v2.0.2
使用 Wappalyzer 替代方案检测技术
Wappalyzer Next
该项目是一个命令行工具和 Python 库,利用 Wappalyzer 浏览器扩展及其指纹来检测技术。在官方开源项目停止维护后出现的其他项目使用了过时的指纹,并且对动态 Web 应用的检测准确性不足。本项目通过在 Chromium 中运行该扩展(通过 Playwright)来绕过这些限制。

安装
安装 Python 包后,安装 Playwright 的 Chromium 浏览器:
python -m playwright install chromium
在最小化的 Linux 容器中,还需安装 Chromium 的系统依赖:
python -m playwright install-deps chromium
作为命令行工具安装
pipx install wappalyzer
pipx run --spec playwright playwright install chromium
作为库安装
要将其作为库使用,请在隔离的容器(如 venv 或 docker)中使用 pip 安装。你也可以使用 --break-system-packages 进行“常规”安装,但不推荐这样做。
pip install wappalyzer
python -m playwright install chromium
通过 Docker 安装
步骤
- 克隆仓库:
git clone https://github.com/s0md3v/wappalyzer-next.git
cd wappalyzer-next
- 使用 Docker Compose 构建并运行:
docker compose build
- 使用 Docker 容器扫描 URL:
- 扫描单个 URL:
docker compose run --rm wappalyzer -i https://example.com
- 从文件扫描多个 URL:
docker compose run --rm wappalyzer -i urls.txt -w 3 -oJ output.json
面向用户
下面给出一些常见用法示例,更多信息请参考所有选项列表。
- 扫描单个 URL:
wappalyzer -i https://example.com - 从文件扫描多个 URL:
wappalyzer -i urls.txt -w 3 - 设置完整扫描的页面加载超时时间:
wappalyzer -i urls.txt -t 15 - 带认证的扫描:
wappalyzer -i https://example.com -c "sessionid=abc123; token=xyz789" - 将结果导出为 JSON:
wappalyzer -i https://example.com -oJ results.json - 将 JSON 输出到标准输出:
wappalyzer -i https://example.com -oJ
当输出标志未指定文件时,报告将写入标准输出。状态行、横幅文本和错误写入标准错误输出。
选项
注意:为了准确性,请使用“full”扫描类型(默认)。“fast”和“balanced”不使用浏览器模拟。
-i:输入的 URL 或包含 URL(每行一个)的文件--scan-type:扫描类型(默认:'full')fast:快速的基于 HTTP 的扫描(发送 1 个请求)balanced:基于 HTTP 的扫描,发送更多请求full:使用 wappalyzer 扩展的完整扫描
-w, --workers:并发工作进程数(默认:5;完整扫描上限为 3)-t, --timeout:完整扫描中等待页面加载的最大秒数(默认:30)-oJ [file]:JSON 输出文件路径,当省略文件或设置为-时输出到标准输出-oC [file]:CSV 输出文件路径,当省略文件或设置为-时输出到标准输出-oH [file]:HTML 输出文件路径,当省略文件或设置为-时输出到标准输出-c, --cookie:用于认证扫描的 Cookie 头字符串
面向开发者
Python 库在 PyPI 上名为 wappalyzer,并且可以用相同的名称导入。
使用库
当扫描多个 URL 时,使用 Wappalyzer。浏览器启动一次,重复使用,并在退出 with 块时关闭。
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}")
同一个扫描器也可以在不重新打开 Chromium 的情况下一次扫描一个 URL:
from wappalyzer import Wappalyzer
with Wappalyzer(workers=3, timeout=30) as scanner:
github = scanner.analyze('https://github.com')
python = scanner.analyze('https://python.org')
对于单个 URL,analyze() 更简洁。它创建自己的扫描器,运行一次扫描,然后关闭它。
from wappalyzer import analyze
results = analyze(
url='https://example.com',
scan_type='full', # 'fast', 'balanced', or 'full'
cookie='sessionid=abc123',
timeout=30
)
对于大型任务,不要在循环中调用顶层的 analyze() 函数。应使用 Wappalyzer.analyze_many() 或重复使用扫描器的 Wappalyzer.analyze(),以避免为每个 URL 重新加载 Chromium 和 Wappalyzer 扩展。
analyze() 函数参数
url(str):要分析的 URLscan_type(str, 可选):要执行的扫描类型'fast':快速的基于 HTTP 的扫描'balanced':基于 HTTP 的扫描,发送更多请求'full':包含 JavaScript 执行的完整扫描(默认)
workers(int, 可选):完整扫描中要创建的浏览器工作进程数(默认:1)cookie(str, 可选):用于认证扫描的 Cookie 头字符串timeout(int, 可选):完整扫描中等待页面加载的最大秒数(默认:30)
返回值
返回一个字典,以 URL 为键,检测到的技术为值:
{
"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": {}
}
常见问题
为什么选择 Chromium 和 Playwright?
完整扫描器通过 Playwright 在 Chromium 中运行 Wappalyzer 扩展。Playwright 对 Chromium 扩展的支持是直接的,不需要 geckodriver 或 Selenium。
“fast”、“balanced”和“full”扫描类型有什么区别?
- fast:向 URL 发送单个 HTTP 请求。不使用扩展。
- balanced:向 .js 文件、/robots.txt 发送额外的 HTTP 请求,并执行 DNS 查询。不使用扩展。
- full:使用官方的 Wappalyzer 扩展在无头浏览器中扫描 URL。