返回更新列表
新发布Aug 19, 2026

wappalyzer-next v2.0.2

使用 Wappalyzer 替代方案检测技术

分享

Wappalyzer Next

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

demo

安装

安装 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

作为库安装

要将其作为库使用,请在隔离的容器(如 venvdocker)中使用 pip 安装。你也可以使用 --break-system-packages 进行“常规”安装,但不推荐这样做。

pip install wappalyzer
python -m playwright install chromium

通过 Docker 安装

步骤
  1. 克隆仓库:
git clone https://github.com/s0md3v/wappalyzer-next.git
cd wappalyzer-next
  1. 使用 Docker Compose 构建并运行:
docker compose build
  1. 使用 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):要分析的 URL
  • scan_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。

分类