/** * Bookmarklet driver */ /** global: wappalyzer */ /** global: XMLHttpRequest */ (function() { wappalyzer.driver.document = document; const container = document.getElementById('wappalyzer-container'); const url = wappalyzer.parseUrl(top.location.href); const hasOwn = Object.prototype.hasOwnProperty; /** * Log messages to console */ wappalyzer.driver.log = (message, source, type) => { console.log('[wappalyzer ' + type + ']', '[' + source + ']', message); }; function getPageContent() { wappalyzer.log('func: getPageContent', 'driver'); var env = []; for ( let i in window ) { env.push(i); } var scripts = Array.prototype.slice .apply(document.scripts) .filter(s => s.src) .map(s => s.src); wappalyzer.analyze(url, { html: document.documentElement.innerHTML, env: env, scripts: scripts }); } function getResponseHeaders() { wappalyzer.log('func: getResponseHeaders', 'driver'); var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onreadystatechange = () => { if ( xhr.readyState === 4 && xhr.status ) { var headers = xhr.getAllResponseHeaders().split("\n"); if ( headers.length > 0 && headers[0] != '' ) { wappalyzer.log('responseHeaders: ' + xhr.getAllResponseHeaders(), 'driver'); var responseHeaders = {}; headers.forEach(line => { var name, value; if ( line ) { name = line.substring(0, line.indexOf(': ')); value = line.substring(line.indexOf(': ') + 2, line.length - 1); if ( !responseHeaders[name.toLowerCase()] ){ responseHeaders[name.toLowerCase()] = [] } responseHeaders[name.toLowerCase()].push(value); } }); wappalyzer.analyze(url, { headers: responseHeaders }); } } } xhr.send(); } /** * Display apps */ wappalyzer.driver.displayApps = detected => { wappalyzer.log('func: diplayApps', 'driver'); var first = true; var app; var category; var html; html = '' + 'Close' + '' + '
'; if ( detected != null && Object.keys(detected).length ) { for ( app in detected ) { if ( !hasOwn.call(detected, app) ) { continue; } var version = detected[app].version, confidence = detected[app].confidence; html += '
' + '' + '' + ' ' + app + '' + ( version ? ' ' + version : '' ) + ( confidence < 100 ? ' (' + confidence + '% sure)' : '' ) + ''; for ( let i in wappalyzer.apps[app].cats ) { if ( !hasOwn.call(wappalyzer.apps[app].cats, i) ) { continue; } category = wappalyzer.categories[wappalyzer.apps[app].cats[i]].name; html += '' + category + ''; } html += '
'; first = false; } } else { html += '
No applications detected
'; } html += '
'; container.innerHTML = html; }, /** * Open a tab */ function openTab(args) { open(args.url); } function slugify(string) { return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, ''); } getPageContent(); getResponseHeaders(); })();