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": "" }