Add Appointment scheduling, Surveys categories. Add Calendly and Chili Piper detection. Add "dom" method to detect technologies using query selectors.

main
Elbert Alias 4 years ago
parent ea27dce1a3
commit 11ab46c8fd

@ -9,7 +9,6 @@ const {
setTechnologies, setTechnologies,
setCategories, setCategories,
analyze, analyze,
analyzeOneToMany,
analyzeManyToMany, analyzeManyToMany,
resolve, resolve,
} = Wappalyzer } = Wappalyzer
@ -395,6 +394,8 @@ class Site {
await sleep(1000) await sleep(1000)
// page.on('console', (message) => this.log(message.text()))
// Links // Links
const links = await this.promiseTimeout( const links = await this.promiseTimeout(
( (
@ -529,56 +530,60 @@ class Site {
: !!value : !!value
Object.keys(dom).forEach((selector) => { Object.keys(dom).forEach((selector) => {
const el = document.querySelector(selector) const nodes = document.querySelectorAll(selector)
if (!el) { if (!nodes.length) {
return return
} }
dom[selector].forEach(({ text, properties, attributes }) => { dom[selector].forEach(({ text, properties, attributes }) => {
if (text) { nodes.forEach((node) => {
const value = el.textContent.trim() if (text) {
const value = node.textContent.trim()
if (value) {
technologies.push({ if (value) {
name, technologies.push({
selector, name,
text: value, selector,
text: value,
})
}
}
if (properties) {
Object.keys(properties).forEach((property) => {
if (
Object.prototype.hasOwnProperty.call(node, property)
) {
const value = node[property]
if (typeof value !== 'undefined') {
technologies.push({
name,
selector,
property,
value: toScalar(value),
})
}
}
}) })
} }
}
if (properties) { if (attributes) {
Object.keys(properties).forEach((property) => { Object.keys(attributes).forEach((attribute) => {
if (Object.prototype.hasOwnProperty.call(el, property)) { if (node.hasAttribute(attribute)) {
const value = el[property] const value = node.getAttribute(attribute)
if (typeof value !== 'undefined') {
technologies.push({ technologies.push({
name, name,
selector, selector,
property, attribute,
value: toScalar(value), value: toScalar(value),
}) })
} }
} })
}) }
} })
if (attributes) {
Object.keys(attributes).forEach((attribute) => {
if (el.hasAttribute(attribute)) {
const value = el.getAttribute(attribute)
technologies.push({
name,
selector,
attribute,
value: toScalar(value),
})
}
})
}
}) })
}) })

@ -86,8 +86,10 @@
"categoryName65": { "message": "Balanceigs de càrrega" }, "categoryName65": { "message": "Balanceigs de càrrega" },
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility"}, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login"}, "categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority"}, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate program" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -86,8 +86,10 @@
"categoryName65": { "message": "Load Balancer" }, "categoryName65": { "message": "Load Balancer" },
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility"}, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login"}, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority"}, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -85,7 +85,9 @@
"categoryName66": { "message": "UI frameworks" }, "categoryName66": { "message": "UI frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -89,5 +89,7 @@
"categoryName68": { "message": "دسترسی" }, "categoryName68": { "message": "دسترسی" },
"categoryName69": { "message": "ورود به شبکه های اجتماعی" }, "categoryName69": { "message": "ورود به شبکه های اجتماعی" },
"categoryName70": { "message": "صادر کننده SSL/TLS" }, "categoryName70": { "message": "صادر کننده SSL/TLS" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -89,5 +89,7 @@
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authority" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate program" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -89,5 +89,7 @@
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authority" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate program" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -86,6 +86,8 @@
"categoryName67": { "message": "쿠키 동의" }, "categoryName67": { "message": "쿠키 동의" },
"categoryName68": { "message": "접근성" }, "categoryName68": { "message": "접근성" },
"categoryName69": { "message": "소셜 로그인" }, "categoryName69": { "message": "소셜 로그인" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -85,7 +85,9 @@
"categoryName66": { "message": "UI Фреймворк" }, "categoryName66": { "message": "UI Фреймворк" },
"categoryName67": { "message": "Соответствие cookie" }, "categoryName67": { "message": "Соответствие cookie" },
"categoryName68": { "message": "Доступность" }, "categoryName68": { "message": "Доступность" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs"},
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Каркаси" }, "categoryName66": { "message": "UI Каркаси" },
"categoryName67": { "message": "Відповідність файлам cookie" }, "categoryName67": { "message": "Відповідність файлам cookie" },
"categoryName68": { "message": "Доступність" }, "categoryName68": { "message": "Доступність" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -86,8 +86,10 @@
"categoryName65": { "message": "Load Balancer" }, "categoryName65": { "message": "Load Balancer" },
"categoryName66": { "message": "UI Frameworks" }, "categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility"}, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login"}, "categoryName69": { "message": "Social logins" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -88,6 +88,8 @@
"categoryName67": { "message": "Cookie compliance" }, "categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" }, "categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" }, "categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority" }, "categoryName70": { "message": "SSL/TLS certificate authorities" },
"categoryName71": { "message": "Affiliate program"} "categoryName71": { "message": "Affiliate programs" },
"categoryName72": { "message": "Appointment scheduling" },
"categoryName73": { "message": "Surveys" }
} }

@ -0,0 +1,4 @@
<svg width="2447" height="2447" viewBox="0 0 2447 2447" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2137.38 2446.66H313.938C171.216 2446.66 55 2330.45 55 2187.72V363.601C55 220.879 171.216 104.663 313.938 104.663H2137.38C2280.1 104.663 2396.32 220.879 2396.32 363.601V2187.04C2397 2330.45 2280.78 2446.66 2137.38 2446.66ZM313.938 248.064C250.053 248.064 198.402 299.716 198.402 363.601V2187.04C198.402 2250.93 250.053 2302.58 313.938 2302.58H2137.38C2201.27 2302.58 2252.92 2250.93 2252.92 2187.04V363.601C2252.92 299.716 2201.27 248.064 2137.38 248.064H313.938Z" fill="#676B74"/>
<path d="M1748.63 492.051C1718.05 492.051 1693.58 467.584 1693.58 437.001V55.0499C1693.58 24.4666 1718.05 0 1748.63 0C1779.22 0 1803.68 24.4666 1803.68 55.0499V436.322C1803.68 466.905 1779.22 492.051 1748.63 492.051ZM697.249 492.051C666.666 492.051 642.199 467.584 642.199 437.001V55.0499C642.199 24.4666 666.666 0 697.249 0C727.832 0 752.299 24.4666 752.299 55.0499V436.322C752.979 466.905 727.832 492.051 697.249 492.051ZM1291.92 1724.9C1063.57 1724.9 878.03 1539.36 878.03 1311C878.03 1082.65 1063.57 897.11 1291.92 897.11C1395.23 897.11 1493.77 935.169 1569.89 1004.49C1579.41 1012.65 1580.09 1027.6 1571.25 1036.43C1563.1 1045.95 1548.14 1046.63 1539.31 1037.79C1471.35 975.947 1383.67 941.965 1291.92 941.965C1088.72 941.965 923.565 1107.11 923.565 1310.32C923.565 1513.53 1088.72 1678.68 1291.92 1678.68C1383.67 1678.68 1471.35 1644.7 1539.31 1582.85C1548.82 1574.7 1563.1 1575.38 1571.25 1584.21C1579.41 1593.73 1578.73 1608 1569.89 1616.16C1493.77 1686.84 1395.23 1724.9 1291.92 1724.9Z" fill="#676B74"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,3 @@
<svg width="45" height="45" viewBox="0 0 45 45" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M32.223 9.144C32.223 9.144 34.12 8.813 35.543 9.144C35.543 9.144 37.639 7.487 37.679 1.975L39.142 0C39.142 0 41.435 4.89 38.826 10.043C38.826 10.043 40.723 11.34 41 12.128L40.728 13C37.9955 11.5537 35.0488 10.555 32 10.042L32.223 9.144ZM2 44.987C2.018 44.987 10.966 45.432 21 41.042C18.4972 39.8891 16.0908 38.5375 13.804 37C10.3114 40.2635 6.32828 42.9586 2 44.987H2ZM35 30.319C31.924 29.6965 28.9491 28.6509 26.16 27.212C24.24 29.975 21.79 32.86 18.73 35.367C18.73 35.367 21.932 32.03 24.85 26.502C24.0344 26.0342 23.2384 25.5331 22.464 25C20.7433 28.4534 18.5694 31.6617 16 34.54C18.5782 36.3038 21.3306 37.7983 24.214 39C28.2483 36.6986 31.8894 33.7681 35 30.319V30.319ZM29.419 14.54L32.576 15.316C32.576 15.316 31.286 19.548 28.24 24.756C31.3101 26.3676 34.6243 27.4635 38.05 28C40.483 24.7235 42.4829 21.1466 44 17.358C39.06 13.993 33.152 12.025 26.802 12C26.2398 15.4586 25.3002 18.8452 24 22.099C24.8213 22.7061 25.6705 23.2744 26.545 23.802C27.728 21.057 28.771 17.942 29.419 14.54Z" fill="#FF5722"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -154,6 +154,77 @@ const Content = {
script.setAttribute('src', chrome.extension.getURL('js/inject.js')) script.setAttribute('src', chrome.extension.getURL('js/inject.js'))
document.body.appendChild(script) document.body.appendChild(script)
// DOM
const dom = technologies
.filter(({ dom }) => dom)
.map(({ name, dom }) => ({ name, dom }))
.reduce((technologies, { name, dom }) => {
const toScalar = (value) =>
typeof value === 'string' || typeof value === 'number'
? value
: !!value
Object.keys(dom).forEach((selector) => {
const nodes = document.querySelectorAll(selector)
if (!nodes.length) {
return
}
dom[selector].forEach(({ text, properties, attributes }) => {
nodes.forEach((node) => {
if (text) {
const value = node.textContent.trim()
if (value) {
technologies.push({
name,
selector,
text: value,
})
}
}
if (properties) {
Object.keys(properties).forEach((property) => {
if (Object.prototype.hasOwnProperty.call(node, property)) {
const value = node[property]
if (typeof value !== 'undefined') {
technologies.push({
name,
selector,
property,
value: toScalar(value),
})
}
}
})
}
if (attributes) {
Object.keys(attributes).forEach((attribute) => {
if (node.hasAttribute(attribute)) {
const value = node.getAttribute(attribute)
technologies.push({
name,
selector,
attribute,
value: toScalar(value),
})
}
})
}
})
})
})
return technologies
}, [])
Content.driver('analyzeDom', [location.href, dom])
}, },
} }

@ -151,8 +151,8 @@ const Driver = {
* @param {String} url * @param {String} url
* @param {Array} js * @param {Array} js
*/ */
async analyzeJs(url, js) { analyzeJs(url, js) {
await Driver.onDetect( return Driver.onDetect(
url, url,
Array.prototype.concat.apply( Array.prototype.concat.apply(
[], [],
@ -167,6 +167,49 @@ const Driver = {
) )
}, },
/**
* Analyse DOM nodes
* @param {String} url
* @param {Array} dom
*/
analyzeDom(url, dom) {
return Driver.onDetect(
url,
Array.prototype.concat.apply(
[],
dom.map(({ name, selector, text, property, attribute, value }) => {
const technology = Wappalyzer.technologies.find(
({ name: _name }) => name === _name
)
if (text) {
return analyzeManyToMany(technology, 'dom.text', {
[selector]: [text],
})
}
if (property) {
return analyzeManyToMany(technology, `dom.properties.${property}`, {
[selector]: [value],
})
}
if (attribute) {
return analyzeManyToMany(
technology,
`dom.attributes.${attribute}`,
{
[selector]: [value],
}
)
}
return []
})
)
)
},
/** /**
* Enable scripts to call Driver functions through messaging * Enable scripts to call Driver functions through messaging
* @param {Object} message * @param {Object} message

@ -199,7 +199,7 @@
}, },
"52": { "52": {
"name": "Live chat", "name": "Live chat",
"priority": 8 "priority": 9
}, },
"53": { "53": {
"name": "CRM", "name": "CRM",
@ -271,11 +271,19 @@
}, },
"70": { "70": {
"name": "SSL/TLS certificate authorities", "name": "SSL/TLS certificate authorities",
"priority": 6 "priority": 9
}, },
"71": { "71": {
"name": "Affiliate programs", "name": "Affiliate programs",
"priority": 6 "priority": 9
},
"72": {
"name": "Appointment scheduling",
"priority": 9
},
"73": {
"name": "Surveys",
"priority": 9
} }
}, },
"technologies": { "technologies": {
@ -295,6 +303,28 @@
"scripts": "1c-bitrix", "scripts": "1c-bitrix",
"website": "http://www.1c-bitrix.ru" "website": "http://www.1c-bitrix.ru"
}, },
"Calendly": {
"cats": [
72,
61
],
"js": { "Calendly": "" },
"script": "https://assets\\.calendly\\.com/assets/external/widget\\.js",
"icon": "Calendly.svg",
"description": "Calendly is an app for scheduling appointments, meetings, and events.",
"website": "https://calendly.com/"
},
"Chili Piper": {
"cats": [
72,
61
],
"js": { "ChiliPiper": "" },
"script": "js\\.chilipiper\\.com/marketing\\.js",
"icon": "Chili Piper.svg",
"description": "Chili Piper is a suite of automated scheduling tools that help revenue teams convert leads.",
"website": "https://www.chilipiper.com/"
},
"Rewardful": { "Rewardful": {
"cats": [ "cats": [
71, 71,
@ -308,6 +338,26 @@
"description": "Rewardful is a way for SaaS companies to setup affiliate and referral programs with Stripe.", "description": "Rewardful is a way for SaaS companies to setup affiliate and referral programs with Stripe.",
"website": "https://www.getrewardful.com/" "website": "https://www.getrewardful.com/"
}, },
"Amazon Associates Program": {
"cats": [
71
],
"dom": {
"a[href*='amzn.to']": {
"attributes": {
"href": "^https?://amzn.to"
}
},
"a[href*='amazon.com']": {
"attributes": {
"href": "^https?://amazon.com.+&tag="
}
}
},
"icon": "Amazon.svg",
"description": "The Amazon Associates Program helps content creators, publishers and bloggers monetize their traffic.",
"website": "https://affiliate-program.amazon.com.au/"
},
"3dCart": { "3dCart": {
"cats": [ "cats": [
1, 1,
@ -10734,7 +10784,7 @@
12 12
], ],
"dom": { "dom": {
"#root": { "body > div": {
"properties": { "properties": {
"_reactRootContainer": "" "_reactRootContainer": ""
} }