Merge branch 'master' into snipcart-detection

main
Dries Cruyskens 4 years ago
commit 9497c2a75b

@ -97,6 +97,19 @@
}
]
},
"robots": {
"oneOf": [
{
"type": "array",
"items": {
"$ref": "#/definitions/non-empty-non-blank-string"
}
},
{
"$ref": "#/definitions/non-empty-non-blank-string"
}
]
},
"excludes": {
"oneOf": [
{

@ -317,6 +317,28 @@
"script": "[^a-z]adnegah.*\\.js$",
"website": "https://Adnegah.net"
},
"Adobe Analytics": {
"cats": [
10,
61
],
"js": {
"s_c_il.0._c": "s_c",
"s_c_il.1._c": "s_c",
"s_c_il.2._c": "s_c",
"s_c_il.3._c": "s_c",
"s_c_il.4._c": "s_c",
"s_c_il.5._c": "s_c",
"s_c_il.0.constructor.name": "AppMeasurement",
"s_c_il.1.constructor.name": "AppMeasurement",
"s_c_il.2.constructor.name": "AppMeasurement",
"s_c_il.3.constructor.name": "AppMeasurement",
"s_c_il.4.constructor.name": "AppMeasurement",
"s_c_il.5.constructor.name": "AppMeasurement"
},
"icon": "Adobe Analytics.svg",
"website": "https://www.adobe.com/analytics/adobe-analytics.html"
},
"Adobe ColdFusion": {
"cats": [
18
@ -362,8 +384,24 @@
"/etc/clientlibs/",
"/etc\\.clientlibs/"
],
"icon": "Adobe.svg",
"website": "https://www.adobe.com/marketing/experience-manager.html"
},
"Adobe Experience Platform Identity Service": {
"cats": [
61
],
"js": {
"s_c_il.0._c": "Visitor",
"s_c_il.1._c": "Visitor",
"s_c_il.2._c": "Visitor",
"s_c_il.3._c": "Visitor",
"s_c_il.4._c": "Visitor",
"s_c_il.5._c": "Visitor"
},
"icon": "Adobe.svg",
"website": "https://docs.adobe.com/content/help/en/id-service/using/home.html"
},
"Adobe GoLive": {
"cats": [
20
@ -394,6 +432,18 @@
"script": "(?:wh(?:utils|ver|proxy|lang|topic|msg)|ehlpdhtm)\\.js",
"website": "http://adobe.com/products/robohelp.html"
},
"Adobe Target": {
"cats": [
32,
61
],
"js": {
"adobe.target": "",
"adobe.target.VERSION": "^(.+)$\\;version:\\1"
},
"icon": "Adobe.svg",
"website": "https://www.adobe.com/marketing/target.html"
},
"AdonisJS": {
"cats": [
18
@ -1025,7 +1075,10 @@
10
],
"icon": "AppDynamics.png",
"script": "adrum\\.js|adrum\\.([0-9].*)\\.js\\;version:\\1",
"js": {
"ADRUM.conf.agentVer": "^(.+)$\\;version:\\1"
},
"script": "adrum",
"website": "https://appdynamics.com"
},
"AppNexus": {
@ -4787,7 +4840,6 @@
},
"Google Analytics Enhanced eCommerce": {
"cats": [
6,
10
],
"icon": "Google Analytics.svg",
@ -6017,6 +6069,16 @@
"implies": "Java",
"website": "http://www.eclipse.org/jetty"
},
"Jibres": {
"cats": [
6
],
"headers": {
"X-Powered-By": "Jibres"
},
"icon": "Jibres.svg",
"website": "https://jibres.com"
},
"Jimdo": {
"cats": [
1
@ -8818,7 +8880,8 @@
],
"headers": {
"Server": "^Pantheon",
"x-pantheon-styx-hostname": ""
"x-pantheon-styx-hostname": "",
"x-styx-req-id": ""
},
"icon": "pantheon.svg",
"implies": [
@ -10838,20 +10901,6 @@
"script": "sitemeter\\.com/js/counter\\.js\\?site=",
"website": "http://www.sitemeter.com"
},
"SiteCatalyst": {
"cats": [
10
],
"icon": "SiteCatalyst.png",
"js": {
"s_INST": "",
"s_account": "",
"s_code": "",
"s_objectID": ""
},
"script": "/s[_-]code.*\\.js",
"website": "http://www.adobe.com/solutions/digital-marketing.html"
},
"SiteEdit": {
"cats": [
1
@ -10988,13 +11037,46 @@
},
"website": "http://www.seneca.nl/pub/Smartsite/Smartsite-Smartsite-iXperion"
},
"Smartstore": {
"Smartstore biz": {
"cats": [
6
],
"icon": "Smartstore.png",
"icon": "Smartstore.biz.png",
"script": "smjslib\\.js",
"website": "http://smartstore.com"
}
,
"Smartstore.NET": {
"cats": [
1,
6
],
"cookies": {
"SMARTSTORE.VISITOR": ""
},
"html": "<!--Powered by SmartStore\\.NET - https://www\\.smartstore\\.com-->",
"icon": "smartstore.png",
"implies": "Microsoft ASP.NET",
"meta": {
"generator": "^SmartStore.NET (.+)$\\;version:\\1"
},
"website": "https://www.smartstore.com"
},
"Smartstore": {
"cats": [
1,
6
],
"cookies": {
"SMARTSTORE.VISITOR": ""
},
"html": "<!--Powered by Smartstore - https://www\\.smartstore\\.com-->",
"icon": "Smartstore.png",
"implies": "Microsoft ASP.NET",
"meta": {
"generator": "^Smartstore (.+)$\\;version:\\1"
},
"website": "https://www.smartstore.com"
},
"Snap": {
"cats": [

@ -31,6 +31,7 @@ wappalyzer <url> [options]
-m, --max-urls=... Exit when num URLs have been analysed
-w, --max-wait=... Wait no more than ms milliseconds for page resources to load
-P, --pretty Pretty-print JSON output
-p, --probe Perform a deeper scan by requesting common files
-r, --recursive Follow links on pages (crawler)
-a, --user-agent=... Set the user agent string
```
@ -59,6 +60,7 @@ const options = {
maxUrls: 10,
maxWait: 5000,
recursive: true,
probe: true,
userAgent: 'Wappalyzer',
htmlMaxCols: 2000,
htmlMaxRows: 2000,
@ -117,3 +119,16 @@ const urls = ['https://www.wappalyzer.com', 'https://www.example.com']
await wappalyzer.destroy()
})()
```
### Events
Listen to events with `site.on(eventName, callback)`. Use the `page` parameter to access the Puppeteer page instance ([reference](https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#class-page)).
| Event | Parameters | Description |
|-------------|--------------------------------|------------------------------------------|
| `log` | `message`, `source` | Debug messages |
| `error` | `message`, `source` | Error messages |
| `request` | `page`, `request` | Emitted at the start of a request |
| `response` | `page`, `request` | Emitted upon receiving a server response |
| `goto` | `page`, `url`, `html`, `cookies`, `scripts`, `meta`, `js`, `language` `links` | Emitted after a page has been analysed |
| `analyze` | `urls`, `technologies`, `meta` | Emitted when the site has been analysed |

@ -1,7 +1,8 @@
const { URL } = require('url')
const fs = require('fs')
const path = require('path')
const LanguageDetect = require('languagedetect')
const http = require('http')
const https = require('https')
const Wappalyzer = require('./wappalyzer')
const {
@ -19,7 +20,8 @@ let chromiumArgs = [
'--no-sandbox',
'--headless',
'--disable-gpu',
'--ignore-certificate-errors'
'--ignore-certificate-errors',
'--disable-web-security'
]
let chromiumBin = CHROMIUM_BIN
@ -34,10 +36,6 @@ if (AWS_LAMBDA_FUNCTION_NAME) {
puppeteer = require('puppeteer')
}
const languageDetect = new LanguageDetect()
languageDetect.setLanguageType('iso2')
const extensions = /^([^.]+$|\.(asp|aspx|cgi|htm|html|jsp|php)$)/
const { apps: technologies, categories } = JSON.parse(
@ -64,6 +62,32 @@ function analyzeJs(js) {
)
}
function get(url) {
if (['http:', 'https:'].includes(url.protocol)) {
const { get } = url.protocol === 'http:' ? http : https
return new Promise((resolve, reject) =>
get(url.href, (response) => {
if (response.statusCode >= 400) {
return reject(
new Error(`${response.statusCode} ${response.statusMessage}`)
)
}
response.setEncoding('utf8')
let body = ''
response.on('data', (data) => (body += data))
response.on('error', (error) => reject(new Error(error.message)))
response.on('end', () => resolve(body))
})
)
} else {
throw new Error(`Invalid protocol: ${url.protocol}`)
}
}
class Driver {
constructor(options = {}) {
this.options = {
@ -74,16 +98,16 @@ class Driver {
htmlMaxRows: 3000,
maxDepth: 3,
maxUrls: 10,
maxWait: 5000,
maxWait: 30000,
recursive: false,
probe: false,
...options
}
this.options.debug = Boolean(+this.options.debug)
this.options.recursive = Boolean(+this.options.recursive)
this.options.delay = this.options.recursive
? parseInt(this.options.delay, 10)
: 0
this.options.probe = Boolean(+this.options.probe)
this.options.delay = parseInt(this.options.delay, 10)
this.options.maxDepth = parseInt(this.options.maxDepth, 10)
this.options.maxUrls = parseInt(this.options.maxUrls, 10)
this.options.maxWait = parseInt(this.options.maxWait, 10)
@ -161,7 +185,6 @@ class Site {
this.analyzedUrls = {}
this.detections = []
this.language = ''
this.listeners = {}
@ -191,7 +214,9 @@ class Site {
emit(event, params) {
if (this.listeners[event]) {
this.listeners[event].forEach((listener) => listener(params))
return Promise.all(
this.listeners[event].map((listener) => listener(params))
)
}
}
@ -230,15 +255,13 @@ class Site {
await page.setRequestInterception(true)
page.on('console', (msg) => console.log('PAGE LOG:', msg._text))
page.on('dialog', (dialog) => dialog.dismiss())
page.on('error', (error) => this.error(error))
let responseReceived = false
page.on('request', (request) => {
page.on('request', async (request) => {
try {
if (
(responseReceived && request.isNavigationRequest()) ||
@ -252,6 +275,8 @@ class Site {
...this.options.headers
}
await this.emit('request', { page, request })
request.continue({ headers })
}
} catch (error) {
@ -259,7 +284,7 @@ class Site {
}
})
page.on('response', (response) => {
page.on('response', async (response) => {
try {
if (response.url() === url.href) {
this.analyzedUrls[url.href] = {
@ -288,6 +313,8 @@ class Site {
responseReceived = true
this.onDetect(analyze({ headers }))
await this.emit('response', { page, response })
}
}
} catch (error) {
@ -440,34 +467,6 @@ class Site {
throw new Error('No response from server')
}
if (!this.language) {
this.language = await Promise.race([
this.timeout(),
(
await page.evaluateHandle(
() =>
document.documentElement.getAttribute('lang') ||
document.documentElement.getAttribute('xml:lang')
)
).jsonValue()
])
}
if (!this.language) {
try {
const [attrs] = languageDetect.detect(
html.replace(/<\/?[^>]+(>|$)/gs, ' '),
1
)
if (attrs) {
;[this.language] = attrs
}
} catch (error) {
this.error(error)
}
}
this.onDetect(analyzeJs(js))
this.onDetect(
@ -503,12 +502,21 @@ class Site {
[]
)
await this.emit('goto', {
page,
url,
html,
cookies,
scripts,
meta,
js,
links: reducedLinks
})
await page.close()
this.log('Page closed')
this.emit('goto', url)
return reducedLinks
} catch (error) {
this.error(error)
@ -517,7 +525,13 @@ class Site {
async analyze(url = this.originalUrl, index = 1, depth = 1) {
try {
if (this.recursive) {
await sleep(this.options.delay * index)
}
if (this.options.probe) {
await this.probe(url)
}
const links = await this.goto(url)
@ -533,7 +547,7 @@ class Site {
this.error(error)
}
return {
const results = {
urls: this.analyzedUrls,
technologies: resolve(this.detections).map(
({
@ -559,9 +573,32 @@ class Site {
name
}))
})
),
meta: {
language: this.language
)
}
await this.emit('analyze', results)
return results
}
async probe(url) {
const files = {
robots: '/robots.txt'
}
for (const file of Object.keys(files)) {
const path = files[file]
try {
await sleep(this.options.delay)
const body = await get(new URL(path, url.href))
this.log(`get ${path}: ok`)
this.onDetect(analyze({ [file]: body }))
} catch (error) {
this.error(`get ${path}: ${error.message || error}`)
}
}
}
@ -580,7 +617,7 @@ class Site {
await this.batch(links, depth, batch + 1)
}
onDetect(detections = [], language) {
onDetect(detections = []) {
this.detections = this.detections.concat(detections)
this.detections.filter(

@ -13,7 +13,7 @@
"software"
],
"homepage": "https://www.wappalyzer.com",
"version": "6.2.4",
"version": "6.2.6",
"author": "Wappalyzer",
"license": "MIT",
"repository": {
@ -35,7 +35,6 @@
"wappalyzer": "./cli.js"
},
"dependencies": {
"languagedetect": "^2.0.0",
"puppeteer": "^2.0.0"
}
}

@ -0,0 +1,89 @@
{
"github": { "message": "GitHub에서 Wappalyzer를 포크하세요!" },
"twitter": { "message": "Twitter에서 Wappalyzer 팔로우" },
"website": { "message": "wappalyzer.com으로 가기" },
"options": { "message": "설정" },
"optionsSave": { "message": "설정 저장" },
"optionsSaved": { "message": "저장됨" },
"optionUpgradeMessage": { "message": "업그레이드에 대해 알리기" },
"optionDynamicIcon": { "message": "Wappalyzer 로고 대신 식별된 기술 아이콘을 사용" },
"optionTracking": { "message": "익명으로 wappalyzer.com에 식별된 기술 정보 전송" },
"optionThemeMode": { "message": "다크 모드 호환 활성화" },
"optionBadge": { "message": "아이콘에 식별된 기술 갯수 표시" },
"disableOnDomain": { "message": "이 웹 사이트에서 끄기" },
"clearCache": { "message": "캐시된 식별 정보 지우기" },
"nothingToDo": { "message": "여기에는 할 일이 없네요." },
"noAppsDetected": { "message": "식별된 기술이 없습니다." },
"categoryPin": { "message": "항상 아이콘 보이기" },
"termsAccept": { "message": "수락" },
"termsContent": { "message": "이 확장 기능은 사이트의 도메인과 식별된 기술을 포함한 익명 정보를 <a href='https://www.wappalyzer.com'>wappalyzer.com</a>에 전송합니다. 이 기능은 설정에서 비활성화 할 수 있습니다." },
"privacyPolicy": { "message": "개인정보처리방침" },
"createAlert": { "message": "이 웹 사이트에 대한 알림 받기" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "포럼 소프트웨어" },
"categoryName3": { "message": "데이터베이스 관리 도구" },
"categoryName4": { "message": "문서 도구" },
"categoryName5": { "message": "위젯" },
"categoryName6": { "message": "전자상거래" },
"categoryName7": { "message": "사진 갤러리" },
"categoryName8": { "message": "위키" },
"categoryName9": { "message": "호스팅 패널" },
"categoryName10": { "message": "분석" },
"categoryName11": { "message": "블로그" },
"categoryName12": { "message": "JavaScript 프레임워크" },
"categoryName13": { "message": "이슈 트래커" },
"categoryName14": { "message": "비디오 플레이어" },
"categoryName15": { "message": "댓글 시스템" },
"categoryName16": { "message": "보안" },
"categoryName17": { "message": "폰트 스크립트" },
"categoryName18": { "message": "웹 프레임워크" },
"categoryName19": { "message": "기타" },
"categoryName20": { "message": "에디터" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "웹 서버" },
"categoryName23": { "message": "캐싱" },
"categoryName24": { "message": "텍스트 에디터" },
"categoryName25": { "message": "JavaScript 그래픽" },
"categoryName26": { "message": "모바일 프레임워크" },
"categoryName27": { "message": "프로그래밍 언어" },
"categoryName28": { "message": "운영체제" },
"categoryName29": { "message": "검색 엔진" },
"categoryName30": { "message": "웹 메일" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "마케팅 자동화" },
"categoryName33": { "message": "웹 서버 확장" },
"categoryName34": { "message": "데이터베이스" },
"categoryName35": { "message": "지도" },
"categoryName36": { "message": "광고" },
"categoryName37": { "message": "네트워크 서비스" },
"categoryName38": { "message": "미디어 서버" },
"categoryName39": { "message": "웹캠" },
"categoryName40": { "message": "프린터" },
"categoryName41": { "message": "결제 처리" },
"categoryName42": { "message": "Tag managers" },
"categoryName44": { "message": "CI" },
"categoryName46": { "message": "원격 접속" },
"categoryName47": { "message": "개발" },
"categoryName48": { "message": "네트워크 스토리지" },
"categoryName49": { "message": "피드 리더" },
"categoryName50": { "message": "DMS" },
"categoryName51": { "message": "사이트 제작 도구" },
"categoryName52": { "message": "실시간 채팅" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "회계" },
"categoryName56": { "message": "가상화폐 채굴기" },
"categoryName57": { "message": "정적 사이트 생성기" },
"categoryName58": { "message": "사용자 유도" },
"categoryName59": { "message": "JavaScript 라이브러리" },
"categoryName60": { "message": "컨테이너" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "리버스 프록시" },
"categoryName65": { "message": "로드 밸런서" },
"categoryName66": { "message": "UI 프레임워크" },
"categoryName67": { "message": "쿠키 동의" },
"categoryName68": { "message": "접근성"},
"categoryName69": { "message": "소셜 로그인"}
}

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 21.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Brush" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 240 235" style="enable-background:new 0 0 240 235;" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
.st1{fill:#E2D8FF;}
.st2{fill-rule:evenodd;clip-rule:evenodd;fill:#9F7FFF;}
</style>
<radialGradient id="SVGID_1_" cx="97.7105" cy="81.6193" r="143.7928" gradientTransform="matrix(1.0909 0 0 1.093 -10.9091 -10.9302)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#33284E"/>
<stop offset="0.7669" style="stop-color:#130732"/>
</radialGradient>
<rect x="0" class="st0" width="240" height="235"/>
<path class="st1" d="M97,118h-9.5v62.4c2.9,1.5,6.4,2.7,9.5,3.8V118z M114.5,114v73.6c1.3,0.1,3.3,0.7,4.6,0.7c1.7,0,3.2,0,4.9-0.1 V114H114.5z M169,166.2c3.4-3.6,6.9-7.9,9.5-12.1v-47.6H169V166.2z M64.9,122l21.9-25.3l20.8,7.8l44.5-31.9l22.4,21.2l11.3-9 l-1.7-3.7l-9.4,7.9l-22.1-20.6l-45.2,32.3l-21-8.1l-23.4,26.4l-14.6,3.4v3.4L64.9,122z M69.5,137H60v18.4c2.6,4,6.1,7.8,9.5,11.2 V137z M151.5,95H142v88.9c3.1-1.1,6.6-2.4,9.5-4V95z"/>
<path class="st2" d="M16.8,117c0,57,46.2,103.2,103.2,103.2S223.2,174,223.2,117S177,13.8,120,13.8S16.8,60,16.8,117z M27.4,117 c0-51.2,41.5-92.7,92.6-92.7s92.6,41.5,92.6,92.7s-41.5,92.7-92.6,92.7S27.4,168.2,27.4,117z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 206.4 206.4" height="206.4" width="206.4"><defs><radialGradient id="c" cx="97.711" cy="105.704" r="143.793" gradientTransform="matrix(1.0909 0 0 1.093 -10.91 -37.256)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4b3d31"/><stop offset=".767" stop-color="#241405"/></radialGradient><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath></defs><g transform="translate(-16.8 -13.8)"><defs><ellipse ry="99.7" rx="96.8" cy="116" cx="120.2" id="a"/></defs><path clip-path="url(#b)" class="st0" clip-rule="evenodd" fill="url(#c)" fill-rule="evenodd" d="M0 0h240v235H0z"/></g><path d="M0 103.2c0 57 46.2 103.2 103.2 103.2s103.2-46.2 103.2-103.2S160.2 0 103.2 0 0 46.2 0 103.2zm10.6 0c0-51.2 41.5-92.7 92.6-92.7 51.1 0 92.6 41.5 92.6 92.7s-41.5 92.7-92.6 92.7c-51.1 0-92.6-41.5-92.6-92.7z" class="st1" clip-rule="evenodd" fill="#ff7618" fill-rule="evenodd"/><path d="M103.2 41.9c7.6 0 14.2 4.4 17.4 10.8-1.7 1-3.3 2.3-4.8 3.7-3.4 3.4-7.8 5.2-12.6 5.2-4.7 0-9.2-1.8-12.6-5.2-1.5-1.5-3.1-2.7-4.8-3.7 3.2-6.4 9.8-10.8 17.4-10.8zm19.2 17.2c.1.7.1 1.4.1 2.1 0 12.4 10.1 22.6 22.6 22.6.7 0 1.4 0 2.1.1-.6.8-1.2 1.5-1.8 2.2-4.6 4.6-7.1 10.6-7.1 17.1 0 6.4 2.5 12.5 7.1 17.1.7.7 1.3 1.4 1.8 2.2-.7.1-1.4.1-2.1.1-12.4 0-22.6 10.1-22.6 22.6 0 .7 0 1.4-.1 2.1-.8-.6-1.5-1.2-2.2-1.9-4.6-4.6-10.6-7.1-17.1-7.1-6.5 0-12.5 2.5-17.1 7.1-.7.7-1.4 1.3-2.2 1.9-.1-.7-.1-1.4-.1-2.1 0-12.4-10.1-22.6-22.6-22.6-.7 0-1.4 0-2.1-.1.6-.8 1.2-1.5 1.8-2.2 4.6-4.6 7.1-10.6 7.1-17.1 0-6.4-2.5-12.5-7.1-17.1-.7-.7-1.3-1.4-1.8-2.2.7-.1 1.4-.1 2.1-.1 12.4 0 22.6-10.1 22.6-22.6 0-.7 0-1.4.1-2.1.8.6 1.5 1.2 2.2 1.9 4.6 4.6 10.6 7.1 17.1 7.1 6.5 0 12.5-2.5 17.1-7.1.8-.7 1.5-1.3 2.2-1.9zm31.3 26.7c6.4 3.2 10.8 9.8 10.8 17.4 0 7.6-4.4 14.2-10.8 17.4-1-1.7-2.3-3.3-3.7-4.8-3.4-3.4-5.2-7.8-5.2-12.6s1.8-9.2 5.2-12.6c1.4-1.4 2.6-3 3.7-4.8zm-33.1 67.9c-3.2 6.4-9.8 10.8-17.4 10.8-7.6 0-14.2-4.4-17.4-10.8 1.7-1 3.4-2.3 4.8-3.7 3.4-3.4 7.8-5.2 12.6-5.2 4.7 0 9.2 1.8 12.6 5.2 1.4 1.4 3 2.6 4.8 3.7zm-67.9-33.1c-6.4-3.2-10.8-9.8-10.8-17.4 0-7.6 4.4-14.2 10.8-17.4 1 1.7 2.3 3.3 3.7 4.8 3.4 3.4 5.2 7.8 5.2 12.6s-1.9 9.2-5.2 12.6c-1.4 1.4-2.6 3-3.7 4.8zm50.5 47.1c8.9 0 16.5-5.1 20.2-12.6 2.9 1.2 6.1 1.9 9.4 1.9 6.5 0 12.5-2.5 17.1-7.1 4.6-4.6 7.1-10.6 7.1-17.1 0-3.3-.7-6.5-1.9-9.4 7.4-3.7 12.6-11.4 12.6-20.2 0-8.8-5.1-16.5-12.6-20.2 1.2-2.9 1.9-6.1 1.9-9.4 0-6.4-2.5-12.5-7.1-17.1-4.6-4.6-10.6-7.1-17.1-7.1-3.3 0-6.5.7-9.4 1.9-3.7-7.4-11.4-12.7-20.2-12.7-8.9 0-16.5 5.2-20.2 12.7-2.9-1.2-6.1-1.9-9.4-1.9-6.5 0-12.5 2.5-17.1 7.1-4.6 4.6-7.1 10.6-7.1 17.1 0 3.3.6 6.5 1.9 9.4-7.4 3.7-12.6 11.4-12.6 20.2 0 8.8 5.1 16.5 12.6 20.2-1.2 2.9-1.9 6.1-1.9 9.4 0 6.4 2.5 12.5 7.1 17.1 4.6 4.6 10.6 7.1 17.1 7.1 3.3 0 6.5-.7 9.4-1.9 3.7 7.4 11.3 12.6 20.2 12.6zm22.2-18.7c.2-1.3.3-2.5.3-3.9 0-10.7 8.7-19.4 19.4-19.4 1.3 0 2.6-.1 3.9-.3 1.1 2.3 1.6 4.8 1.6 7.4 0 4.7-1.9 9.2-5.2 12.6-3.4 3.4-7.8 5.2-12.6 5.2-2.6 0-5.1-.6-7.4-1.6zM149 81c-1.3-.2-2.6-.3-3.9-.3-10.7 0-19.4-8.7-19.4-19.4 0-1.3-.1-2.6-.3-3.9 2.3-1.1 4.8-1.6 7.4-1.6 4.8 0 9.2 1.8 12.6 5.2 3.3 3.4 5.2 7.8 5.2 12.6 0 2.6-.5 5.1-1.6 7.4zM81 57.4c-.2 1.3-.3 2.6-.3 3.9 0 10.7-8.7 19.4-19.4 19.4-1.3 0-2.6.1-3.9.3-1.1-2.3-1.6-4.8-1.6-7.4 0-4.7 1.9-9.2 5.2-12.6 3.4-3.4 7.8-5.2 12.6-5.2 2.6 0 5.1.6 7.4 1.6zm-23.6 68c1.3.2 2.5.3 3.9.3 10.7 0 19.4 8.7 19.4 19.4 0 1.3.1 2.6.3 3.9-2.3 1.1-4.8 1.6-7.4 1.6-4.8 0-9.2-1.8-12.6-5.2-3.4-3.4-5.2-7.8-5.2-12.6 0-2.6.5-5.1 1.6-7.4z" class="st2" clip-rule="evenodd" fill="#ffe0cb" fill-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 30 26" style="enable-background:new 0 0 30 26;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FA0F00;}
</style>
<g>
<polygon class="st0" points="19,0 30,0 30,26 "/>
<polygon class="st0" points="11.1,0 0,0 0,26 "/>
<polygon class="st0" points="15,9.6 22.1,26 17.5,26 15.4,20.8 10.2,20.8 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 592 B

@ -0,0 +1 @@
<svg id="Jibres-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1500 1500"><defs><style>.cls-1{fill:#c80a5a;}.cls-2{fill:#fff;}</style></defs><title>Jibres-Logo-icon-zero</title><circle id="Circle" class="cls-1" cx="750" cy="750" r="750"/><path id="Shape" class="cls-2" d="M1159.78,488.89v400h-800v-400h-100v400a100,100,0,0,0,100,100h800a100,100,0,0,0,100-100v-400Z"/></svg>

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -13,7 +13,7 @@
"software"
],
"homepage": "https://www.wappalyzer.com",
"version": "6.2.4",
"version": "6.2.6",
"author": "Wappalyzer",
"license": "MIT",
"repository": {

@ -180,7 +180,7 @@ const Wappalyzer = {
* Initialize analyzation.
* @param {*} param0
*/
analyze({ url, html, meta, headers, cookies, scripts }) {
analyze({ url, html, robots, meta, headers, cookies, scripts }) {
const oo = Wappalyzer.analyzeOneToOne
const om = Wappalyzer.analyzeOneToMany
const mm = Wappalyzer.analyzeManyToMany
@ -193,6 +193,7 @@ const Wappalyzer = {
flatten([
oo(technology, 'url', url),
oo(technology, 'html', html),
oo(technology, 'robots', robots),
om(technology, 'scripts', scripts),
mm(technology, 'cookies', cookies),
mm(technology, 'meta', meta),
@ -219,6 +220,7 @@ const Wappalyzer = {
cats,
url,
html,
robots,
meta,
headers,
cookies,
@ -239,6 +241,7 @@ const Wappalyzer = {
headers: transform(headers),
cookies: transform(cookies),
html: transform(html),
robots: transform(robots),
meta: transform(meta),
scripts: transform(script),
js: transform(js, true),

Loading…
Cancel
Save