このプロジェクトは、Wappalyzerブラウザ拡張機能とそのフィンガープリントを使用して技術を検出するコマンドラインツールおよびPythonライブラリです。公式オープンソースプロジェクトの終了後に登場した他のプロジェクトは、古いフィンガープリントを使用しており、動的Webアプリでの精度が不足しています。このプロジェクトは、Playwrightを介してChromiumで拡張機能を実行することで、これらの制限を回避します。

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
ライブラリとして使用するには、pip を隔離されたコンテナ(例:venv や docker)内でインストールしてください。通常のインストールのために --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出力フラグがファイルなしで使用されると、レポートはstdoutに書き込まれます。ステータス行、バナーテキスト、エラーはstderrに書き込まれます。
注: 正確性を重視する場合は'full'スキャンタイプ(デフォルト)を使用してください。'fast'および'balanced'はブラウザエミュレーションを使用しません。
-i: 入力URLまたはURLを含むファイル(1行に1つ)--scan-type: スキャンタイプ(デフォルト: 'full')
fast: 高速HTTPベースのスキャン(1リクエスト送信)balanced: より多くのリクエストを送信するHTTPベースのスキャンfull: wappalyzer拡張機能を使用した完全スキャン-w, --workers: 同時ワーカー数(デフォルト: 5; フルスキャンは最大3)-t, --timeout: フルスキャンでページロードを待機する最大秒数(デフォルト: 30)-oJ [file]: JSON出力ファイルパス。ファイルを省略または-に設定した場合はstdout-oC [file]: CSV出力ファイルパス。ファイルを省略または-に設定した場合はstdout-oH [file]: HTML出力ファイルパス。ファイルを省略または-に設定した場合はstdoutPythonライブラリは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を再起動せずに一度に1つの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()の方が短くなります。自身のスキャナーを作成し、1回のスキャンを実行して閉じます。
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()を使用することで、毎回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は必要ありません。
-c, --cookie