该项目是一个命令行工具和 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
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
下面给出一些常见用法示例,更多信息请参考所有选项列表。
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 -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 扩展。
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": {}
}
完整扫描器通过 Playwright 在 Chromium 中运行 Wappalyzer 扩展。Playwright 对 Chromium 扩展的支持是直接的,不需要 geckodriver 或 Selenium。