From 11ab46c8fd033a2805879f532dc65627150fc374 Mon Sep 17 00:00:00 2001
From: Elbert Alias <77259+AliasIO@users.noreply.github.com>
Date: Wed, 7 Oct 2020 09:51:38 +1100
Subject: [PATCH] Add Appointment scheduling, Surveys categories. Add Calendly
and Chili Piper detection. Add "dom" method to detect technologies using
query selectors.
---
src/drivers/npm/driver.js | 77 ++++++++++---------
.../webextension/_locales/ca/messages.json | 10 ++-
.../webextension/_locales/de/messages.json | 10 ++-
.../webextension/_locales/el/messages.json | 8 +-
.../webextension/_locales/en/messages.json | 8 +-
.../webextension/_locales/es/messages.json | 8 +-
.../webextension/_locales/fa/messages.json | 4 +-
.../webextension/_locales/fr/messages.json | 8 +-
.../webextension/_locales/gl_ES/messages.json | 8 +-
.../webextension/_locales/gr/messages.json | 8 +-
.../webextension/_locales/id/messages.json | 8 +-
.../webextension/_locales/it/messages.json | 4 +-
.../webextension/_locales/ja/messages.json | 4 +-
.../webextension/_locales/ko/messages.json | 6 +-
.../webextension/_locales/pl/messages.json | 8 +-
.../webextension/_locales/pt/messages.json | 8 +-
.../webextension/_locales/pt_BR/messages.json | 8 +-
.../webextension/_locales/ro/messages.json | 8 +-
.../webextension/_locales/ru/messages.json | 8 +-
.../webextension/_locales/sk/messages.json | 8 +-
.../webextension/_locales/tr/messages.json | 8 +-
.../webextension/_locales/uk/messages.json | 8 +-
.../webextension/_locales/uz/messages.json | 10 ++-
.../webextension/_locales/zh_TW/messages.json | 6 +-
.../webextension/images/icons/Calendly.svg | 4 +
.../webextension/images/icons/Chili Piper.svg | 3 +
src/drivers/webextension/js/content.js | 71 +++++++++++++++++
src/drivers/webextension/js/driver.js | 47 ++++++++++-
src/technologies.json | 58 +++++++++++++-
29 files changed, 328 insertions(+), 106 deletions(-)
create mode 100644 src/drivers/webextension/images/icons/Calendly.svg
create mode 100644 src/drivers/webextension/images/icons/Chili Piper.svg
diff --git a/src/drivers/npm/driver.js b/src/drivers/npm/driver.js
index d304830d5..474e7d3d0 100644
--- a/src/drivers/npm/driver.js
+++ b/src/drivers/npm/driver.js
@@ -9,7 +9,6 @@ const {
setTechnologies,
setCategories,
analyze,
- analyzeOneToMany,
analyzeManyToMany,
resolve,
} = Wappalyzer
@@ -395,6 +394,8 @@ class Site {
await sleep(1000)
+ // page.on('console', (message) => this.log(message.text()))
+
// Links
const links = await this.promiseTimeout(
(
@@ -529,56 +530,60 @@ class Site {
: !!value
Object.keys(dom).forEach((selector) => {
- const el = document.querySelector(selector)
+ const nodes = document.querySelectorAll(selector)
- if (!el) {
+ if (!nodes.length) {
return
}
dom[selector].forEach(({ text, properties, attributes }) => {
- if (text) {
- const value = el.textContent.trim()
-
- if (value) {
- technologies.push({
- name,
- selector,
- text: value,
+ 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 (properties) {
- Object.keys(properties).forEach((property) => {
- if (Object.prototype.hasOwnProperty.call(el, property)) {
- const value = el[property]
+ if (attributes) {
+ Object.keys(attributes).forEach((attribute) => {
+ if (node.hasAttribute(attribute)) {
+ const value = node.getAttribute(attribute)
- if (typeof value !== 'undefined') {
technologies.push({
name,
selector,
- property,
+ attribute,
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),
- })
- }
- })
- }
+ })
+ }
+ })
})
})
diff --git a/src/drivers/webextension/_locales/ca/messages.json b/src/drivers/webextension/_locales/ca/messages.json
index 6a773dbcd..75c2eb11c 100644
--- a/src/drivers/webextension/_locales/ca/messages.json
+++ b/src/drivers/webextension/_locales/ca/messages.json
@@ -86,8 +86,10 @@
"categoryName65": { "message": "Balanceigs de càrrega" },
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
- "categoryName68": { "message": "Accessibility"},
- "categoryName69": { "message": "Social login"},
- "categoryName70": { "message": "SSL/TLS certificate authority"},
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName68": { "message": "Accessibility" },
+ "categoryName69": { "message": "Social login" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate program" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/de/messages.json b/src/drivers/webextension/_locales/de/messages.json
index ad12dcb5c..1a028cdfa 100644
--- a/src/drivers/webextension/_locales/de/messages.json
+++ b/src/drivers/webextension/_locales/de/messages.json
@@ -86,8 +86,10 @@
"categoryName65": { "message": "Load Balancer" },
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
- "categoryName68": { "message": "Accessibility"},
- "categoryName69": { "message": "Social login"},
- "categoryName70": { "message": "SSL/TLS certificate authority"},
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName68": { "message": "Accessibility" },
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json
index b85696b09..69863928b 100644
--- a/src/drivers/webextension/_locales/el/messages.json
+++ b/src/drivers/webextension/_locales/el/messages.json
@@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json
index 329ea3439..a032a8d63 100644
--- a/src/drivers/webextension/_locales/en/messages.json
+++ b/src/drivers/webextension/_locales/en/messages.json
@@ -85,7 +85,9 @@
"categoryName66": { "message": "UI frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json
index acd0a51a4..a090c7910 100644
--- a/src/drivers/webextension/_locales/es/messages.json
+++ b/src/drivers/webextension/_locales/es/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/fa/messages.json b/src/drivers/webextension/_locales/fa/messages.json
index 66a9108d6..6c6ef9af4 100644
--- a/src/drivers/webextension/_locales/fa/messages.json
+++ b/src/drivers/webextension/_locales/fa/messages.json
@@ -89,5 +89,7 @@
"categoryName68": { "message": "دسترسی" },
"categoryName69": { "message": "ورود به شبکه های اجتماعی" },
"categoryName70": { "message": "صادر کننده SSL/TLS" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json
index dcd25e86b..53f382b0b 100644
--- a/src/drivers/webextension/_locales/fr/messages.json
+++ b/src/drivers/webextension/_locales/fr/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/gl_ES/messages.json b/src/drivers/webextension/_locales/gl_ES/messages.json
index cb599c477..cc553bfff 100644
--- a/src/drivers/webextension/_locales/gl_ES/messages.json
+++ b/src/drivers/webextension/_locales/gl_ES/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json
index 7fcd40740..6369393c0 100644
--- a/src/drivers/webextension/_locales/gr/messages.json
+++ b/src/drivers/webextension/_locales/gr/messages.json
@@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/id/messages.json b/src/drivers/webextension/_locales/id/messages.json
index a154d4074..52e1d0b2d 100644
--- a/src/drivers/webextension/_locales/id/messages.json
+++ b/src/drivers/webextension/_locales/id/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json
index 150a85fc5..336c48a57 100644
--- a/src/drivers/webextension/_locales/it/messages.json
+++ b/src/drivers/webextension/_locales/it/messages.json
@@ -89,5 +89,7 @@
"categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName71": { "message": "Affiliate program" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/ja/messages.json b/src/drivers/webextension/_locales/ja/messages.json
index 7cce9190c..3e7003934 100644
--- a/src/drivers/webextension/_locales/ja/messages.json
+++ b/src/drivers/webextension/_locales/ja/messages.json
@@ -89,5 +89,7 @@
"categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" },
"categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName71": { "message": "Affiliate program" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/ko/messages.json b/src/drivers/webextension/_locales/ko/messages.json
index 199a4b996..7fa8a263b 100644
--- a/src/drivers/webextension/_locales/ko/messages.json
+++ b/src/drivers/webextension/_locales/ko/messages.json
@@ -86,6 +86,8 @@
"categoryName67": { "message": "쿠키 동의" },
"categoryName68": { "message": "접근성" },
"categoryName69": { "message": "소셜 로그인" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json
index 0195b2b0a..b95230358 100644
--- a/src/drivers/webextension/_locales/pl/messages.json
+++ b/src/drivers/webextension/_locales/pl/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/pt/messages.json b/src/drivers/webextension/_locales/pt/messages.json
index 5cb77d9b2..f7009ce9b 100644
--- a/src/drivers/webextension/_locales/pt/messages.json
+++ b/src/drivers/webextension/_locales/pt/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/pt_BR/messages.json b/src/drivers/webextension/_locales/pt_BR/messages.json
index 741c0bf4a..2d1afb895 100644
--- a/src/drivers/webextension/_locales/pt_BR/messages.json
+++ b/src/drivers/webextension/_locales/pt_BR/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json
index 117097d1b..e76d77bf9 100644
--- a/src/drivers/webextension/_locales/ro/messages.json
+++ b/src/drivers/webextension/_locales/ro/messages.json
@@ -83,7 +83,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/ru/messages.json b/src/drivers/webextension/_locales/ru/messages.json
index 70e340022..6fc5d2300 100644
--- a/src/drivers/webextension/_locales/ru/messages.json
+++ b/src/drivers/webextension/_locales/ru/messages.json
@@ -85,7 +85,9 @@
"categoryName66": { "message": "UI Фреймворк" },
"categoryName67": { "message": "Соответствие cookie" },
"categoryName68": { "message": "Доступность" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/sk/messages.json b/src/drivers/webextension/_locales/sk/messages.json
index eb80872bf..589bb07ae 100644
--- a/src/drivers/webextension/_locales/sk/messages.json
+++ b/src/drivers/webextension/_locales/sk/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/tr/messages.json b/src/drivers/webextension/_locales/tr/messages.json
index d2fcd6f25..754f27447 100644
--- a/src/drivers/webextension/_locales/tr/messages.json
+++ b/src/drivers/webextension/_locales/tr/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs"},
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/uk/messages.json b/src/drivers/webextension/_locales/uk/messages.json
index 227e361ad..b05a909c2 100644
--- a/src/drivers/webextension/_locales/uk/messages.json
+++ b/src/drivers/webextension/_locales/uk/messages.json
@@ -87,7 +87,9 @@
"categoryName66": { "message": "UI Каркаси" },
"categoryName67": { "message": "Відповідність файлам cookie" },
"categoryName68": { "message": "Доступність" },
- "categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/uz/messages.json b/src/drivers/webextension/_locales/uz/messages.json
index 2dece6787..3b6ef8a91 100644
--- a/src/drivers/webextension/_locales/uz/messages.json
+++ b/src/drivers/webextension/_locales/uz/messages.json
@@ -86,8 +86,10 @@
"categoryName65": { "message": "Load Balancer" },
"categoryName66": { "message": "UI Frameworks" },
"categoryName67": { "message": "Cookie compliance" },
- "categoryName68": { "message": "Accessibility"},
- "categoryName69": { "message": "Social login"},
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName68": { "message": "Accessibility" },
+ "categoryName69": { "message": "Social logins" },
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/_locales/zh_TW/messages.json b/src/drivers/webextension/_locales/zh_TW/messages.json
index a43a4271f..574586f3b 100644
--- a/src/drivers/webextension/_locales/zh_TW/messages.json
+++ b/src/drivers/webextension/_locales/zh_TW/messages.json
@@ -88,6 +88,8 @@
"categoryName67": { "message": "Cookie compliance" },
"categoryName68": { "message": "Accessibility" },
"categoryName69": { "message": "Social login" },
- "categoryName70": { "message": "SSL/TLS certificate authority" },
- "categoryName71": { "message": "Affiliate program"}
+ "categoryName70": { "message": "SSL/TLS certificate authorities" },
+ "categoryName71": { "message": "Affiliate programs" },
+ "categoryName72": { "message": "Appointment scheduling" },
+ "categoryName73": { "message": "Surveys" }
}
diff --git a/src/drivers/webextension/images/icons/Calendly.svg b/src/drivers/webextension/images/icons/Calendly.svg
new file mode 100644
index 000000000..dd82e5edd
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Calendly.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/drivers/webextension/images/icons/Chili Piper.svg b/src/drivers/webextension/images/icons/Chili Piper.svg
new file mode 100644
index 000000000..dbdf8a15f
--- /dev/null
+++ b/src/drivers/webextension/images/icons/Chili Piper.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js
index eef2ad298..e6ccb4c96 100644
--- a/src/drivers/webextension/js/content.js
+++ b/src/drivers/webextension/js/content.js
@@ -154,6 +154,77 @@ const Content = {
script.setAttribute('src', chrome.extension.getURL('js/inject.js'))
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])
},
}
diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js
index 063488131..c9f895f0d 100644
--- a/src/drivers/webextension/js/driver.js
+++ b/src/drivers/webextension/js/driver.js
@@ -151,8 +151,8 @@ const Driver = {
* @param {String} url
* @param {Array} js
*/
- async analyzeJs(url, js) {
- await Driver.onDetect(
+ analyzeJs(url, js) {
+ return Driver.onDetect(
url,
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
* @param {Object} message
diff --git a/src/technologies.json b/src/technologies.json
index 43073583c..eaa97a4d5 100644
--- a/src/technologies.json
+++ b/src/technologies.json
@@ -199,7 +199,7 @@
},
"52": {
"name": "Live chat",
- "priority": 8
+ "priority": 9
},
"53": {
"name": "CRM",
@@ -271,11 +271,19 @@
},
"70": {
"name": "SSL/TLS certificate authorities",
- "priority": 6
+ "priority": 9
},
"71": {
"name": "Affiliate programs",
- "priority": 6
+ "priority": 9
+ },
+ "72": {
+ "name": "Appointment scheduling",
+ "priority": 9
+ },
+ "73": {
+ "name": "Surveys",
+ "priority": 9
}
},
"technologies": {
@@ -295,6 +303,28 @@
"scripts": "1c-bitrix",
"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": {
"cats": [
71,
@@ -308,6 +338,26 @@
"description": "Rewardful is a way for SaaS companies to setup affiliate and referral programs with Stripe.",
"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": {
"cats": [
1,
@@ -10734,7 +10784,7 @@
12
],
"dom": {
- "#root": {
+ "body > div": {
"properties": {
"_reactRootContainer": ""
}