A high performance go implementation of Wappalyzer Technology Detection Library
A high performance go implementation of Wappalyzer Technology Detection Library
A high performance port of the Wappalyzer Technology Detection Library to Go. Inspired by Webanalyze.
Uses data from
go install -v github.com/projectdiscovery/wappalyzergo/cmd/update-fingerprints@latestAfter this command wappalyzergo library source will be in your current go.mod.
Usage Example:
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:{}]
}Fingerprint still uses only the response headers and body. Use
FingerprintWithRuntime to also check JavaScript properties, the rendered DOM,
and script content. The optional headless adapter works with a Rod page that
the caller has already loaded. The caller remains responsible for launching,
navigating, and closing the browser.
collector := headless.New(page)
fingerprints, err := wappalyzerClient.FingerprintWithRuntime(
ctx, resp.Header, data,
wappalyzer.RuntimeOptions{
Collector: collector,
Timeout: 10 * time.Second,
},
)If runtime collection returns an error, the result still includes passive
matches and any matches found before the failure. Other browser integrations
can implement wappalyzer.RuntimeCollector without importing the Rod adapter.
No open issues yet, or sync has not completed.