Skip to content

rix4uni/wappalyzergo

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

397 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Wappalyzergo

A high performance port of the Wappalyzer Technology Detection Library to Go. Inspired by Webanalyze.

Uses data from

Features

  • Very simple and easy to use, with clean codebase.
  • Normalized regexes + auto-updating database of wappalyzer fingerprints.
  • Optimized for performance: parsing HTML manually for best speed.

Using go install

go install -v github.com/projectdiscovery/wappalyzergo/cmd/update-fingerprints@latest

After this command wappalyzergo library source will be in your current go.mod.

Example

Usage Example:

1. Static Fingerprinting (High Speed, HTML & Headers only)

package main

import (
	"fmt"
	"io"
	"log"
	"net/http"

	wappalyzer "github.com/projectdiscovery/wappalyzergo"
)

func main() {
	resp, err := http.DefaultClient.Get("https://www.hackerone.com")
	if err != nil {
		log.Fatal(err)
	}
	data, _ := io.ReadAll(resp.Body) // Ignoring error for example

	wappalyzerClient, err := wappalyzer.New()
	fingerprints := wappalyzerClient.Fingerprint(resp.Header, data)
	fmt.Printf("%v\n", fingerprints)

	// Output: map[Acquia Cloud Platform:{} Amazon EC2:{} Apache:{} Cloudflare:{} Drupal:{} PHP:{} Percona:{} React:{} Varnish:{}]
}

2. Headless Fingerprinting (Highly Accurate, checks DOM + JS Globals)

If your target runs React, Next.js, or other front-end UI frameworks, standard HTTP requests will only retrieve an empty <div id="root">. Use FingerprintURL via Headless Chrome to capture real application fingerprints.

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/chromedp/chromedp"
	wappalyzer "github.com/projectdiscovery/wappalyzergo"
)

func main() {
	wappalyzerClient, err := wappalyzer.New()
	if err != nil {
		log.Fatal(err)
	}

	// 1. Create a headless browser context
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	ctx, cancelTimeout := context.WithTimeout(ctx, 15*time.Second)
	defer cancelTimeout()

	// 2. Fetch via headless Chrome to evaluate JS/DOM globals accurately
	headlessFingerprints, err := wappalyzerClient.FingerprintURL(ctx, "https://www.hackerone.com")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Dynamic Fingerprints: %v\n", headlessFingerprints)

	// 3. Map categories efficiently in memory without making 2nd browser request
	headlessFingerprintsWithCats := wappalyzerClient.EnrichWithCats(headlessFingerprints)
	fmt.Printf("Categories: %v\n", headlessFingerprintsWithCats)

	// Output: map[Acquia Cloud Platform:{} Amazon EC2:{} Apache:{} Cloudflare:{} Drupal:{} PHP:{} Percona:{} React:{} Varnish:{}]
}

About

A high performance go implementation of Wappalyzer Technology Detection Library

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Go 100.0%