fakefilter 1.1.13 → 1.1.1581
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +29 -0
- package/README.md +66 -16
- package/dist/index.d.ts +9 -0
- package/dist/index.js +220 -0
- package/dist/json/data.json +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.js +3 -0
- package/package.json +36 -42
- package/apiserver/api/ext_result.js +0 -51
- package/apiserver/api/ext_tasks.js +0 -151
- package/apiserver/api/is_fakedomain.js +0 -39
- package/apiserver/api/is_fakeemail.js +0 -17
- package/apiserver/api/ping.js +0 -12
- package/apiserver/docs/README.md +0 -41
- package/apiserver/docs/babel.config.js +0 -3
- package/apiserver/docs/blog/2019-05-28-first-blog-post.md +0 -12
- package/apiserver/docs/blog/2019-05-29-long-blog-post.md +0 -44
- package/apiserver/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -20
- package/apiserver/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
- package/apiserver/docs/blog/2021-08-26-welcome/index.md +0 -25
- package/apiserver/docs/blog/authors.yml +0 -17
- package/apiserver/docs/docs/intro.md +0 -16
- package/apiserver/docs/docs/nodejs/_category_.json +0 -4
- package/apiserver/docs/docs/nodejs/index.md +0 -30
- package/apiserver/docs/docs/restful/_category_.json +0 -4
- package/apiserver/docs/docs/restful/index.md +0 -59
- package/apiserver/docs/docusaurus.config.js +0 -118
- package/apiserver/docs/package.json +0 -37
- package/apiserver/docs/sidebars.js +0 -31
- package/apiserver/docs/src/components/HomepageFeatures/index.js +0 -64
- package/apiserver/docs/src/components/HomepageFeatures/styles.module.css +0 -11
- package/apiserver/docs/src/css/custom.css +0 -39
- package/apiserver/docs/src/pages/index.js +0 -45
- package/apiserver/docs/src/pages/index.module.css +0 -23
- package/apiserver/docs/src/pages/markdown-page.md +0 -7
- package/apiserver/docs/src/theme/IconArrow/index.js +0 -10
- package/apiserver/docs/static/.nojekyll +0 -0
- package/apiserver/docs/static/img/docusaurus.png +0 -0
- package/apiserver/docs/static/img/favicon.ico +0 -0
- package/apiserver/docs/static/img/logo.svg +0 -1
- package/apiserver/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
- package/apiserver/docs/static/img/tutorial/localeDropdown.png +0 -0
- package/apiserver/docs/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/apiserver/docs/static/img/undraw_docusaurus_react.svg +0 -170
- package/apiserver/docs/static/img/undraw_docusaurus_tree.svg +0 -40
- package/apiserver/inc/middleware_client.js +0 -37
- package/apiserver/inc/middleware_logging.js +0 -17
- package/apiserver/inc/shared.js +0 -47
- package/apiserver/inc/worker_fakefilter.js +0 -53
- package/apiserver/index.js +0 -62
- package/apiserver/public/10minemail.com.js +0 -27
- package/apiserver/public/10minuteemails.com.js +0 -46
- package/apiserver/public/10minutemail.com.js +0 -29
- package/apiserver/public/crazymailing.com.js +0 -27
- package/apiserver/public/gettempmail.com.js +0 -39
- package/apiserver/public/img/dynamic/README.md +0 -0
- package/apiserver/public/img/test.html +0 -48
- package/apiserver/public/onetempmail.com.js +0 -35
- package/apiserver/public/shared.js +0 -54
- package/apiserver/public/temp-mail.org.js +0 -28
- package/apiserver/public/tempmail.com.tr.js +0 -36
- package/apiserver/public/tempmail.net.js +0 -28
- package/apiserver/public/tempmailid.com.js +0 -40
- package/apiserver/public/tempmailo.org.js +0 -36
- package/apiserver/public/throwawaymail.com.js +0 -27
- package/burner/README.md +0 -1
- package/burner/burner-check.js +0 -57
- package/burner/emails.txt +0 -57106
- package/chart-update.js +0 -261
- package/cleanup.js +0 -58
- package/config.js +0 -126
- package/demos/visitor0/index.js +0 -41
- package/demos/visitor0/renderedDOM.html +0 -8
- package/elements/demo.js +0 -78
- package/elements/renderedDOM.html +0 -6459
- package/elements/screenshots/afterclick.png +0 -0
- package/elements/screenshots/goto.png +0 -0
- package/events.js +0 -59
- package/fetch.js +0 -180
- package/models/events.js +0 -37
- package/models/harvested.js +0 -45
- package/models/harvested_clone.js +0 -44
- package/providers/10-minute-mail.com.js +0 -39
- package/providers/10-minuten-mail.de.js +0 -39
- package/providers/10mails.net.js +0 -41
- package/providers/10minut.com.pl.js +0 -39
- package/providers/10minut.xyz.js +0 -40
- package/providers/10minuteemails.com.js +0 -39
- package/providers/10minutemail.co.za.js +0 -39
- package/providers/10minutemail.com.js +0 -39
- package/providers/10minutemail.info.js +0 -38
- package/providers/10minutemail.net.js +0 -38
- package/providers/10minutemail.org.js +0 -38
- package/providers/10minutesemail.net.js +0 -36
- package/providers/10minutesmail.us.js +0 -39
- package/providers/1secmail.com.js +0 -39
- package/providers/20minutemail.com.js +0 -36
- package/providers/22.do.js +0 -25
- package/providers/24hour.email.js +0 -37
- package/providers/___emailondeck.com.js +0 -76
- package/providers/abandonmail.com.js +0 -39
- package/providers/airmailbox.website.js +0 -38
- package/providers/akmail.in.js +0 -37
- package/providers/altaddress.org.js +0 -50
- package/providers/altmails.com.js +0 -37
- package/providers/anonbox.net.js +0 -42
- package/providers/anonmails.de.js +0 -25
- package/providers/anonymmail.net.js +0 -47
- package/providers/another-temp-mail.com.js +0 -40
- package/providers/awgarstone.com.js +0 -15
- package/providers/brodilla.email.js +0 -45
- package/providers/byom.de.js +0 -42
- package/providers/chacuo.net.js +0 -38
- package/providers/cryptogmail.com.js +0 -40
- package/providers/default.tmail.thehp.in.js +0 -41
- package/providers/developermail.com.js +0 -39
- package/providers/dispemail.com.js +0 -38
- package/providers/disposableemail.co.js +0 -37
- package/providers/disposableemail.us.js +0 -37
- package/providers/disposablemail.com.js +0 -38
- package/providers/disposeamail.com.js +0 -43
- package/providers/dispostable.com.js +0 -39
- package/providers/dodsi.com.js +0 -38
- package/providers/dropmail.me.js +0 -37
- package/providers/easytrashmail.com.js +0 -33
- package/providers/edumail.icu.js +0 -36
- package/providers/email-fake.com.js +0 -35
- package/providers/emailfake.com.js +0 -35
- package/providers/emailnator.com.js +0 -37
- package/providers/etempmail.com.js +0 -36
- package/providers/etempmail.net.js +0 -37
- package/providers/eyepaste.com.js +0 -39
- package/providers/fakemail.io.js +0 -36
- package/providers/fakemail.net.js +0 -35
- package/providers/fakemailgenerator.com.js +0 -35
- package/providers/fakermail.com.js +0 -37
- package/providers/faxmail.co.js +0 -47
- package/providers/fex.plus.js +0 -38
- package/providers/findtempmail.com.js +0 -39
- package/providers/foxiomail.com.js +0 -42
- package/providers/fyii.de.js +0 -42
- package/providers/gecicimail.co.js +0 -14
- package/providers/gecicimail.com.tr.js +0 -15
- package/providers/generator.email.js +0 -37
- package/providers/getnada.cc.js +0 -37
- package/providers/getnada.com.js +0 -37
- package/providers/gmailcity.com.js +0 -37
- package/providers/gpa.lu.js +0 -37
- package/providers/guerrillamail.com.js +0 -38
- package/providers/harakirimail.com.js +0 -38
- package/providers/haribu.net.js +0 -39
- package/providers/hizli.email.js +0 -40
- package/providers/hottempmail.com.js +0 -52
- package/providers/instant-email.org.js +0 -39
- package/providers/instantemailaddress.com.js +0 -40
- package/providers/internxt.com.js +0 -47
- package/providers/jooko.info.js +0 -37
- package/providers/kopeechka.store.js +0 -43
- package/providers/kuku.lu.js +0 -37
- package/providers/linshi-email.com.js +0 -38
- package/providers/linshiyou.com.js +0 -25
- package/providers/linshiyouxiang.net.js +0 -36
- package/providers/lroid.com.js +0 -35
- package/providers/luxusmail.org.js +0 -39
- package/providers/mail-temp.com.js +0 -37
- package/providers/mail-tester.com.js +0 -37
- package/providers/mail.gen.tr.js +0 -14
- package/providers/mail.gw.js +0 -35
- package/providers/mail.td.js +0 -42
- package/providers/mail.tm.js +0 -35
- package/providers/mail1.js +0 -44
- package/providers/mail1a.de.js +0 -42
- package/providers/mail4qa.com.js +0 -37
- package/providers/mail7.io.js +0 -41
- package/providers/mailcatch.com.js +0 -38
- package/providers/maildim.com.js +0 -38
- package/providers/maildrop.cc.js +0 -38
- package/providers/mailinator.com.js +0 -27
- package/providers/mailnesia.com.js +0 -41
- package/providers/mailpoof.com.js +0 -71
- package/providers/mailsac.com.js +0 -27
- package/providers/mailswipe.net.js +0 -37
- package/providers/minimail.eu.org.js +0 -27
- package/providers/mintemail.com.js +0 -49
- package/providers/minuteinbox.com.js +0 -35
- package/providers/moakt.com.js +0 -37
- package/providers/mohmal.com.js +0 -39
- package/providers/muellmail.com.js +0 -40
- package/providers/mytemp.email.js +0 -35
- package/providers/mytrashmailer.com.js +0 -38
- package/providers/niepodam.pl.js +0 -53
- package/providers/nolog.email.js +0 -38
- package/providers/onetempmail.com.js +0 -37
- package/providers/open.js +0 -41
- package/providers/oxyemail.com.js +0 -38
- package/providers/phaantm.de.js +0 -42
- package/providers/poo.email.js +0 -27
- package/providers/sandvpn.com.js +0 -49
- package/providers/shitmail.me.js +0 -38
- package/providers/shitmail.org.js +0 -38
- package/providers/snapmail.cc.js +0 -42
- package/providers/spamdecoy.net.js +0 -38
- package/providers/spamgourmet.com.js +0 -29
- package/providers/spoofmail.de.js +0 -47
- package/providers/static.js +0 -32
- package/providers/t-mail.org.js +0 -42
- package/providers/temp-email.info.js +0 -39
- package/providers/temp-inbox.com.js +0 -38
- package/providers/temp-inbox.me.js +0 -47
- package/providers/temp-mail.io.js +0 -36
- package/providers/temp-mail.org.2.js +0 -60
- package/providers/temp-mail.org.js +0 -36
- package/providers/temp-mailbox.com.js +0 -35
- package/providers/temp-mails.com.js +0 -45
- package/providers/temp.cab.js +0 -39
- package/providers/tempail.com.js +0 -36
- package/providers/tempinbox.xyz.js +0 -38
- package/providers/tempmail.adguard.com.js +0 -31
- package/providers/tempmail.altmails.com.js +0 -37
- package/providers/tempmail.cn.js +0 -38
- package/providers/tempmail.co.js +0 -38
- package/providers/tempmail.dev.js +0 -35
- package/providers/tempmail.io.js +0 -38
- package/providers/tempmail.ninja.js +0 -35
- package/providers/tempmail.plus.js +0 -47
- package/providers/tempmail.quest.js +0 -45
- package/providers/tempmail.run.js +0 -37
- package/providers/tempmail.tel.js +0 -38
- package/providers/tempmailed.com.js +0 -43
- package/providers/tempmailo.com.js +0 -35
- package/providers/tempo-email.com.js +0 -38
- package/providers/tempo-mail.xyz.js +0 -40
- package/providers/temporary-email.com.js +0 -35
- package/providers/temporary-email.org.js +0 -36
- package/providers/temporary-mail.net.js +0 -42
- package/providers/temporarymail.com.js +0 -39
- package/providers/tempos.email.js +0 -38
- package/providers/tempr.email.js +0 -45
- package/providers/temprmail.com.js +0 -38
- package/providers/tenmail.org.js +0 -40
- package/providers/thnen.com.js +0 -25
- package/providers/throwaway.io.js +0 -39
- package/providers/tmail.gg.js +0 -36
- package/providers/tmail.mmomekong.com.js +0 -38
- package/providers/tmailor.com.js +0 -37
- package/providers/tmailweb.com.js +0 -39
- package/providers/trash-mail.com.js +0 -42
- package/providers/trashmail.com.js +0 -39
- package/providers/trashmail.de.js +0 -36
- package/providers/trashmail.live.js +0 -36
- package/providers/trashmail.org.js +0 -39
- package/providers/trashmail.ws.js +0 -42
- package/providers/trashmails.com.js +0 -38
- package/providers/tuamaeaquelaursa.com.js +0 -25
- package/providers/txen.de.js +0 -48
- package/providers/wegwerfemailadresse.com.js +0 -43
- package/providers/yopmail.com.js +0 -37
- package/providers/yopmail.fr.js +0 -37
- package/providers/yopmail.net.js +0 -37
- package/providers/yourmail.online.js +0 -39
- package/providers/youxiang.dev.js +0 -25
- package/release.sh +0 -26
- package/repo-update.js +0 -134
- package/shared.js +0 -736
- package/test/doRequest.js +0 -47
- package/test/is_domain_banned.js +0 -53
- package/test/is_fakedomain.js +0 -136
- package/test/is_fakeemail.js +0 -136
- package/test/psl.js +0 -58
- package/test/repo_json_v1.js +0 -30
- package/test/repo_json_v2.js +0 -41
- package/test1.js +0 -36
- package/update-repo.sh +0 -37
- package/vars.js +0 -16
package/shared.js
DELETED
|
@@ -1,736 +0,0 @@
|
|
|
1
|
-
const debug = require('debug')('_shared')
|
|
2
|
-
const punycode = require('punycode/')
|
|
3
|
-
const { Op } = require("sequelize")
|
|
4
|
-
const { parseDomain, ParseResultType } = require("parse-domain")
|
|
5
|
-
const argv = require('minimist')(process.argv.slice(2))
|
|
6
|
-
const chalk = require('chalk')
|
|
7
|
-
var dns = require('dns')
|
|
8
|
-
const vars = require('./vars')
|
|
9
|
-
const { wait, validEmail, isLocal, utcnow } = require('mybase');
|
|
10
|
-
const puppeteer = require('puppeteer-extra')
|
|
11
|
-
const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha')
|
|
12
|
-
var { randomUseragent, UseragentByFamily } = require('useragentsdata');
|
|
13
|
-
const { Sentry, config } = require('./config');
|
|
14
|
-
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
|
|
15
|
-
const { default: isEmail } = require("validator/lib/isEmail")
|
|
16
|
-
const UA = UseragentByFamily('chrome', 'Mac OS X').ua
|
|
17
|
-
const psl = require('psl')
|
|
18
|
-
const { hostnameFromEmailAddress } = require("./apiserver/inc/shared")
|
|
19
|
-
// console.log(chalk.bold(`Useragent:${UA}`))
|
|
20
|
-
|
|
21
|
-
function getDomainPart(hostname) {
|
|
22
|
-
const parseResult = parseDomain(hostname)
|
|
23
|
-
const domain = parseResult.domain + '.' + parseResult.topLevelDomains.join('.')
|
|
24
|
-
if (hostname !== domain) {
|
|
25
|
-
// console.log(chalk.red(`Is this a subdomain ? `),parseResult,domain,hostname)
|
|
26
|
-
// collect+=`${chalk.yellow(domain)} <> ${chalk.green(hostname)}\n`
|
|
27
|
-
// process.exit(0)
|
|
28
|
-
return domain
|
|
29
|
-
}
|
|
30
|
-
return hostname
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
async function initiateEmpty() {
|
|
35
|
-
return new Promise(async function (resolve, reject) {
|
|
36
|
-
return resolve(true)
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const promiseTimeout = function (ms, promise) {
|
|
41
|
-
// Create a promise that rejects in <ms> milliseconds
|
|
42
|
-
let timeout = new Promise((resolve, reject) => {
|
|
43
|
-
let id = setTimeout(() => {
|
|
44
|
-
clearTimeout(id);
|
|
45
|
-
reject('TIMEDOUT')
|
|
46
|
-
}, ms)
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
// Returns a race between our timeout and the passed in promise
|
|
50
|
-
return Promise.race([
|
|
51
|
-
promise,
|
|
52
|
-
timeout
|
|
53
|
-
])
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function launch(headless, url, waitTime = 3, CLICK_SELECTOR = false, captchaPlugin = false, waitUntil = 'load', socks5 = '') {
|
|
57
|
-
debug(`launching ${url}`)
|
|
58
|
-
return new Promise(async function (resolve, reject) {
|
|
59
|
-
try {
|
|
60
|
-
if (captchaPlugin) puppeteer.use(
|
|
61
|
-
RecaptchaPlugin({
|
|
62
|
-
provider: {
|
|
63
|
-
id: '2captcha',
|
|
64
|
-
token: config.captcha_resolver_api
|
|
65
|
-
},
|
|
66
|
-
visualFeedback: true // colorize reCAPTCHAs (violet = detected, green = solved)
|
|
67
|
-
})
|
|
68
|
-
)
|
|
69
|
-
puppeteer.use(StealthPlugin())
|
|
70
|
-
debug(`launching browser`)
|
|
71
|
-
|
|
72
|
-
const args = ['--no-sandbox']
|
|
73
|
-
if (argv.socks5 || socks5 !== '') {
|
|
74
|
-
argv.socks5 = argv.socks5 || socks5
|
|
75
|
-
debug(`using socks5 proxy ${argv.socks5}`)
|
|
76
|
-
args.push(`--proxy-server=socks5://${argv.socks5}`)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const browser = await puppeteer.launch({
|
|
80
|
-
args,
|
|
81
|
-
devtools: isLocal(), // This line opens the DevTools
|
|
82
|
-
// args: [
|
|
83
|
-
// // '--disable-features=IsolateOrigins,site-per-process',
|
|
84
|
-
// // '--flag-switches-begin --disable-site-isolation-trials --flag-switches-end',
|
|
85
|
-
// '--disable-web-security',
|
|
86
|
-
// '--no-sandbox'
|
|
87
|
-
// ],
|
|
88
|
-
defaultViewport: null,
|
|
89
|
-
headless: headless ? true : false
|
|
90
|
-
})
|
|
91
|
-
vars.browsers.push(browser)
|
|
92
|
-
debug(`opening new page`)
|
|
93
|
-
const page = await browser.newPage()
|
|
94
|
-
debug(`setting useragent`)
|
|
95
|
-
await page.setUserAgent(UA)
|
|
96
|
-
debug(`going to ${url} waituntil: ${waitUntil}`)
|
|
97
|
-
await page.goto(url, { waitUntil });
|
|
98
|
-
|
|
99
|
-
if (argv.ss) {
|
|
100
|
-
debug(`taking screenshot as goto.png`)
|
|
101
|
-
await page.screenshot({ path: 'screenshots/goto.png', fullPage: true })
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
debug(`waiting ${waitTime} seconds`)
|
|
105
|
-
await wait(waitTime)
|
|
106
|
-
debug(`waiting ended`)
|
|
107
|
-
if (CLICK_SELECTOR) {
|
|
108
|
-
debug(`clicking ${CLICK_SELECTOR}`)
|
|
109
|
-
// await page.waitForNavigation()
|
|
110
|
-
try {
|
|
111
|
-
// we use puppeeter click function
|
|
112
|
-
await page.click(CLICK_SELECTOR)
|
|
113
|
-
} catch (err3) {
|
|
114
|
-
// if it fails we click via javascript
|
|
115
|
-
await page.evaluate((CLICK_SELECTOR) => {
|
|
116
|
-
let btn = document.querySelector(CLICK_SELECTOR)
|
|
117
|
-
if (btn) {
|
|
118
|
-
btn.click()
|
|
119
|
-
return true
|
|
120
|
-
}
|
|
121
|
-
return false
|
|
122
|
-
}, CLICK_SELECTOR)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// await page.waitForNavigation()
|
|
126
|
-
await wait(waitTime)
|
|
127
|
-
|
|
128
|
-
}
|
|
129
|
-
if (argv.ss) {
|
|
130
|
-
debug(`taking screenshot as afterclick.png`)
|
|
131
|
-
await page.screenshot({ path: 'screenshots/afterclick.png', fullPage: true })
|
|
132
|
-
}
|
|
133
|
-
debug(`finished launching`)
|
|
134
|
-
return resolve({ page, browser })
|
|
135
|
-
} catch (err) {
|
|
136
|
-
console.log(err)
|
|
137
|
-
console.log(`Browser handels:${vars.browsers.length} UA:${UA}`)
|
|
138
|
-
Sentry.captureException(err)
|
|
139
|
-
resolve(false)
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function resolveMx(host) {
|
|
145
|
-
return new Promise((resolve, reject) => {
|
|
146
|
-
dns.resolveMx(host, (err, addresses) => {
|
|
147
|
-
if (err) return resolve(false)
|
|
148
|
-
resolve(addresses)
|
|
149
|
-
})
|
|
150
|
-
})
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
async function emailBy_querySelector_innerText(page, Selector, raw = false) {
|
|
155
|
-
debug(`emailBy_querySelector_innerText '${Selector}'`)
|
|
156
|
-
if (!page) return false
|
|
157
|
-
let got = await page.evaluate((Selector) => {
|
|
158
|
-
let response = []
|
|
159
|
-
for (let item of document.querySelectorAll(Selector))
|
|
160
|
-
response.push(item.innerText)
|
|
161
|
-
return response
|
|
162
|
-
}, Selector)
|
|
163
|
-
debug(`got ${got}`)
|
|
164
|
-
// await page.screenshot({path: 'screenshots/after.png', fullPage: true})
|
|
165
|
-
if (raw) return got
|
|
166
|
-
// console.log(got)
|
|
167
|
-
for (let item of got)
|
|
168
|
-
if (validEmail(item.trim())) return item.toLowerCase().trim()
|
|
169
|
-
return false
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
async function clickto_element_withText(page, element, text) {
|
|
173
|
-
debug(`clickto_element_withText ${element} ${text}`)
|
|
174
|
-
if (argv.ss) await page.screenshot({ path: 'screenshots/clickto_element_withText.png', fullPage: true })
|
|
175
|
-
const got = await page.evaluate((element, text) => {
|
|
176
|
-
const spanElement = Array.from(document.querySelectorAll(element))
|
|
177
|
-
.find(span => span.textContent.trim() === text);
|
|
178
|
-
|
|
179
|
-
if (spanElement) spanElement.click()
|
|
180
|
-
return spanElement
|
|
181
|
-
}, element, text)
|
|
182
|
-
debug(`clickto_element_withText ${got}`)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
async function emailBy_querySelector_innerHTML(page, Selector, raw = false) {
|
|
186
|
-
debug(`emailBy_querySelector_innerHTML '${Selector}'`)
|
|
187
|
-
if (!page) return false
|
|
188
|
-
let got = await page.evaluate((Selector) => {
|
|
189
|
-
let response = []
|
|
190
|
-
for (let item of document.querySelectorAll(Selector))
|
|
191
|
-
response.push(item.innerHTML)
|
|
192
|
-
return response
|
|
193
|
-
}, Selector)
|
|
194
|
-
// await page.screenshot({path: 'screenshots/after.png', fullPage: true})
|
|
195
|
-
if (raw) return got
|
|
196
|
-
// console.log(got)
|
|
197
|
-
for (let item of got)
|
|
198
|
-
if (validEmail(item.trim())) return item.toLowerCase().trim()
|
|
199
|
-
return false
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
async function emailBy_querySelector_placeholder(page, Selector, raw = false) {
|
|
204
|
-
if (!page) return false
|
|
205
|
-
let got = await page.evaluate((Selector) => {
|
|
206
|
-
let response = []
|
|
207
|
-
for (let item of document.querySelectorAll(Selector))
|
|
208
|
-
response.push(item.placeholder)
|
|
209
|
-
return response
|
|
210
|
-
}, Selector)
|
|
211
|
-
if (raw) return got
|
|
212
|
-
for (let item of got)
|
|
213
|
-
if (validEmail(item.trim())) return item.toLowerCase().trim()
|
|
214
|
-
return false
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
async function emailBy_querySelector_value(page, Selector, raw = false) {
|
|
218
|
-
debug(`emailBy_querySelector_value '${Selector}'`)
|
|
219
|
-
if (!page) return false
|
|
220
|
-
let got = await page.evaluate((Selector) => {
|
|
221
|
-
let response = []
|
|
222
|
-
for (let item of document.querySelectorAll(Selector))
|
|
223
|
-
response.push(item.value)
|
|
224
|
-
return response
|
|
225
|
-
}, Selector)
|
|
226
|
-
debug(`got '${got}'`)
|
|
227
|
-
if (raw) return got
|
|
228
|
-
for (let item of got)
|
|
229
|
-
if (item && validEmail(item.trim())) return item.toLowerCase().trim()
|
|
230
|
-
return false
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
async function emailBy_id_value(page, tagId) {
|
|
234
|
-
debug(`emailBy_id_value ${tagId} ${page}`)
|
|
235
|
-
if (!page) {
|
|
236
|
-
debug(`no page found`)
|
|
237
|
-
return false
|
|
238
|
-
}
|
|
239
|
-
debug(`page.evaluate '${tagId}'`)
|
|
240
|
-
let got = await page.evaluate((tagId) => {
|
|
241
|
-
return document.getElementById(tagId)?.value
|
|
242
|
-
}, tagId)
|
|
243
|
-
debug(`got ${got}`)
|
|
244
|
-
if (validEmail(got?.trim())) return got.toLowerCase().trim()
|
|
245
|
-
return false
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
async function email_recursive_search(page, selector) {
|
|
249
|
-
if (!page) return false
|
|
250
|
-
let emails = await page.evaluate((selector) => {
|
|
251
|
-
function findAllEmails(element, regex, emails = []) {
|
|
252
|
-
// Check the current element
|
|
253
|
-
if (regex.test(element.innerText)) {
|
|
254
|
-
if (!emails.includes(element.innerText)) emails.push(element.innerText);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// Recursively search in each child
|
|
258
|
-
for (let child of element.children) {
|
|
259
|
-
findAllEmails(child, regex, emails);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return emails;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
let emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
|
|
266
|
-
// https://stackoverflow.com/questions/46155/how-can-i-validate-an-email-address-in-javascript
|
|
267
|
-
let emails = []
|
|
268
|
-
for (let item of document.querySelectorAll(selector)) {
|
|
269
|
-
findAllEmails(item, emailRegex, emails);
|
|
270
|
-
}
|
|
271
|
-
return emails
|
|
272
|
-
}, selector)
|
|
273
|
-
emails = emails.filter(e => validEmail(e))
|
|
274
|
-
return emails
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
async function emailBy_id_innerText(page, tagId, raw = false) {
|
|
279
|
-
if (!page) return false
|
|
280
|
-
let got = await page.evaluate((tagId) => {
|
|
281
|
-
console.log(`>`, tagId)
|
|
282
|
-
return document.getElementById(tagId).innerText
|
|
283
|
-
}, tagId)
|
|
284
|
-
// console.log(`emailBy_id_innerText`,got)
|
|
285
|
-
if (raw) return got
|
|
286
|
-
if (validEmail(got.trim())) return got.toLowerCase().trim()
|
|
287
|
-
return false
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
function findByIdValue(headless, url, tagId, waitTime = 3) {
|
|
292
|
-
async function pull(page, theid) {
|
|
293
|
-
|
|
294
|
-
let got = await page.evaluate((theid) => {
|
|
295
|
-
|
|
296
|
-
return document.getElementById(theid).value
|
|
297
|
-
}, tagId)
|
|
298
|
-
|
|
299
|
-
if (validEmail(got.trim())) return got.trim()
|
|
300
|
-
|
|
301
|
-
return false
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
return new Promise(async function (resolve, reject) {
|
|
305
|
-
try {
|
|
306
|
-
let { page, browser } = await launch(headless, url, waitTime)
|
|
307
|
-
let emailAddr = await pull(page, tagId)
|
|
308
|
-
await browser.close()
|
|
309
|
-
if (emailAddr) return resolve({
|
|
310
|
-
email: emailAddr,
|
|
311
|
-
url,
|
|
312
|
-
t: Date.now()
|
|
313
|
-
})
|
|
314
|
-
return resolve(null)
|
|
315
|
-
} catch (err) {
|
|
316
|
-
console.log(err)
|
|
317
|
-
Sentry.captureException(err)
|
|
318
|
-
resolve(false)
|
|
319
|
-
}
|
|
320
|
-
})
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
function emailFrom_combobox_selector(page, Selector, replaceRX = false, raw = false) {
|
|
324
|
-
debug(`emailFrom_combobox_selector ${Selector}`)
|
|
325
|
-
return new Promise(async function (resolve, reject) {
|
|
326
|
-
if (!page) return resolve(false)
|
|
327
|
-
let got = await page.evaluate((Selector) => {
|
|
328
|
-
let response = []
|
|
329
|
-
// console.log(`>>`,Selector)
|
|
330
|
-
// console.log(document.querySelectorAll(Selector))
|
|
331
|
-
for (let option of document.querySelectorAll(Selector)[0].children) {
|
|
332
|
-
let txt = option.innerText.toLowerCase().trim()
|
|
333
|
-
if (txt.search(/^@/) == 0) response.push(`any` + txt); else
|
|
334
|
-
response.push(`any@` + txt)
|
|
335
|
-
console.log(`option`, option, response)
|
|
336
|
-
}
|
|
337
|
-
return response
|
|
338
|
-
}, Selector)
|
|
339
|
-
debug(`got ${got}`)
|
|
340
|
-
// if (raw) return got
|
|
341
|
-
let email = []
|
|
342
|
-
for (let item of got) {
|
|
343
|
-
if (replaceRX) item = item.replace(replaceRX, '').toLowerCase().trim()
|
|
344
|
-
if (item && validEmail(item.toLowerCase().trim())) email.push(item.toLowerCase().trim())
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (email.length > 0) return resolve(email)
|
|
348
|
-
return resolve(false)
|
|
349
|
-
})
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
function emailFrom_combobox_id(page, elementID, replaceRX = false) {
|
|
353
|
-
return new Promise(async function (resolve, reject) {
|
|
354
|
-
if (!page) return resolve(false) // in case page could not be loaded
|
|
355
|
-
let got = await page.evaluate((elementID) => {
|
|
356
|
-
// console.log(`emailendID`, elementID)
|
|
357
|
-
|
|
358
|
-
let response = []
|
|
359
|
-
for (let option of document.getElementById(elementID).children) {
|
|
360
|
-
// console.log(`option`,option)
|
|
361
|
-
let txt = option.innerText.toLowerCase().trim()
|
|
362
|
-
if (txt.search(/^@/) == 0) response.push(`any` + txt); else
|
|
363
|
-
response.push(`any@` + txt)
|
|
364
|
-
}
|
|
365
|
-
return response
|
|
366
|
-
}, elementID)
|
|
367
|
-
// console.log(got)
|
|
368
|
-
let email = []
|
|
369
|
-
for (let item of got) {
|
|
370
|
-
if (validEmail(item)) {
|
|
371
|
-
email.push(item)
|
|
372
|
-
continue
|
|
373
|
-
}
|
|
374
|
-
if (replaceRX) item = item.replace(replaceRX, '').toLowerCase().trim()
|
|
375
|
-
if (item && validEmail(item.toLowerCase().trim())) email.push(item.toLowerCase().trim())
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
if (email.length > 0) return resolve(email)
|
|
379
|
-
return resolve(false)
|
|
380
|
-
})
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
function email_from_raw(rawArray) {
|
|
386
|
-
let email = []
|
|
387
|
-
if (Array.isArray(rawArray))
|
|
388
|
-
for (let i of rawArray) {
|
|
389
|
-
i = i.trim()
|
|
390
|
-
if (validEmail(`any@${i}`) && !email.includes(`any@${i}`)) email.push(`any@${i}`);
|
|
391
|
-
else
|
|
392
|
-
if (validEmail(`any${i}`) && !email.includes(`any${i}`)) email.push(`any${i}`);
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
if (email.length > 0) return email
|
|
396
|
-
return null
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
function pullEventsByProvider(providerName, daysago = 60) {
|
|
402
|
-
return new Promise(async function (resolve, reject) {
|
|
403
|
-
let since = Date.now() - daysago * 24 * 60 * 60 * 1000
|
|
404
|
-
try {
|
|
405
|
-
let rows = await vars.models.Events.findAll({
|
|
406
|
-
// attributes:['provider'],
|
|
407
|
-
where: { t: { [Op.gt]: since }, provider: providerName },
|
|
408
|
-
raw: true
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
return resolve(rows)
|
|
412
|
-
} catch (err) {
|
|
413
|
-
console.log(err)
|
|
414
|
-
if (logger) logger.error(err)
|
|
415
|
-
Sentry.captureException(err)
|
|
416
|
-
}
|
|
417
|
-
return resolve(false)
|
|
418
|
-
})
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
function pullEventsProviders(logger, daysago = 60) {
|
|
423
|
-
return new Promise(async function (resolve, reject) {
|
|
424
|
-
let since = Date.now() - daysago * 24 * 60 * 60 * 1000
|
|
425
|
-
try {
|
|
426
|
-
let rows = await vars.models.Events.findAll({
|
|
427
|
-
attributes: ['provider'],
|
|
428
|
-
where: { t: { [Op.gt]: since } },
|
|
429
|
-
raw: true
|
|
430
|
-
})
|
|
431
|
-
let providers = []
|
|
432
|
-
rows.map(r => !providers.includes(r.provider) && providers.push(r.provider))
|
|
433
|
-
|
|
434
|
-
return resolve(providers.sort())
|
|
435
|
-
} catch (err) {
|
|
436
|
-
console.log(err)
|
|
437
|
-
if (logger) logger.error(err)
|
|
438
|
-
Sentry.captureException(err)
|
|
439
|
-
}
|
|
440
|
-
return resolve(false)
|
|
441
|
-
})
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
function pullDomains(days = 600, logger) {
|
|
446
|
-
return new Promise(async function (resolve, reject) {
|
|
447
|
-
let yearago = Date.now() - days * 24 * 60 * 60 * 1000
|
|
448
|
-
try {
|
|
449
|
-
let rows = await vars.models.Harvested.findAll({
|
|
450
|
-
where: { t: { [Op.gt]: yearago } },
|
|
451
|
-
order: [["t", "DESC"]],
|
|
452
|
-
raw: true
|
|
453
|
-
})
|
|
454
|
-
|
|
455
|
-
return resolve(rows)
|
|
456
|
-
} catch (err) {
|
|
457
|
-
console.log(err)
|
|
458
|
-
if (logger) logger.error(err)
|
|
459
|
-
Sentry.captureException(err)
|
|
460
|
-
}
|
|
461
|
-
return resolve(false)
|
|
462
|
-
})
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
function getProviderDetails(name) {
|
|
466
|
-
for (let provider of vars.providers) {
|
|
467
|
-
if (provider.name === name) return provider
|
|
468
|
-
}
|
|
469
|
-
return null
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
function combineDomains(rows, obfuscateTime = true, expiration_days = 2 * 365) {
|
|
473
|
-
let profile = {
|
|
474
|
-
punycode: 0,
|
|
475
|
-
domainparse: 0,
|
|
476
|
-
progressbar: 0,
|
|
477
|
-
whitelistcheck: 0,
|
|
478
|
-
emailvalidation: 0,
|
|
479
|
-
total: 0
|
|
480
|
-
}
|
|
481
|
-
let domainparse_cache = {
|
|
482
|
-
|
|
483
|
-
}
|
|
484
|
-
return new Promise(async function (resolve, reject) {
|
|
485
|
-
let result = {} // provider/domain
|
|
486
|
-
const progress = require('progressbar').create().step('combining')
|
|
487
|
-
progress.setTotal(rows.length)
|
|
488
|
-
const started = Date.now()
|
|
489
|
-
let cnt = 0
|
|
490
|
-
for (let row of rows) {
|
|
491
|
-
// if (row.domain!=='maitrimony.com') continue
|
|
492
|
-
cnt++
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
// detect IDN domains
|
|
496
|
-
let time0 = Date.now()
|
|
497
|
-
let pc = punycode.toASCII(row.domain)
|
|
498
|
-
if (pc !== row.domain) {
|
|
499
|
-
console.log(`IDN Domain found: ${row.domain} provider: ${row.provider}`)
|
|
500
|
-
row.unicodeDomain = row.domain
|
|
501
|
-
row.domain = pc
|
|
502
|
-
}
|
|
503
|
-
profile.punycode += Date.now() - time0
|
|
504
|
-
|
|
505
|
-
time0 = Date.now()
|
|
506
|
-
if (Math.random() * 500 < 1) {
|
|
507
|
-
await wait(1 / 10000)
|
|
508
|
-
progress.setTick(cnt)
|
|
509
|
-
// if (cnt>100000) break
|
|
510
|
-
}
|
|
511
|
-
profile.progressbar += Date.now() - time0
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
// parse domains with psl
|
|
515
|
-
time0 = Date.now()
|
|
516
|
-
let hostname = row.domain.toLowerCase()
|
|
517
|
-
let domainparse
|
|
518
|
-
// parse domains with psl
|
|
519
|
-
if (domainparse_cache.hasOwnProperty(hostname)) {
|
|
520
|
-
domainparse = domainparse_cache[hostname]
|
|
521
|
-
} else {
|
|
522
|
-
domainparse = psl.parse(hostname)
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
if (!domainparse || !domainparse?.domain) {
|
|
526
|
-
console.log(`Not parseable hostname : ${hostname} - detected id: ${row.id} - provider: ${row.provider} - ${chalk.red('deleting')}`)
|
|
527
|
-
try { await vars.models.Harvested.destroy({ where: { id: row.id } }) } catch (_) { } // DELETE
|
|
528
|
-
continue
|
|
529
|
-
}
|
|
530
|
-
domainparse_cache[hostname] = domainparse
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
// lets take the domain of the hostname
|
|
535
|
-
let domain = domainparse.domain
|
|
536
|
-
// let domain_pc = punycode.toASCII(domain)
|
|
537
|
-
profile.domainparse += Date.now() - time0
|
|
538
|
-
|
|
539
|
-
// not listed tld found, not listed tlds are made up ones
|
|
540
|
-
if (!domainparse.listed) {
|
|
541
|
-
console.log(`Not listed TLD: ${domain} - detected id: ${row.id} - provider: ${row.provider} `)
|
|
542
|
-
// what to do with those
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
// ignore whitelisted domains
|
|
548
|
-
time0 = Date.now()
|
|
549
|
-
if (vars.config.ignore_domains.includes(domain)) {
|
|
550
|
-
try { await vars.models.Harvested.destroy({ where: { id: row.id } }) } catch (_) { } // DELETE
|
|
551
|
-
console.log(chalk.red(`Ignoring whitelisted domain:${domain} at row: ${row.id} provider:${row.provider} - DELETED`))
|
|
552
|
-
continue
|
|
553
|
-
}
|
|
554
|
-
profile.whitelistcheck += Date.now() - time0
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
// make sure email address is valid by validator library
|
|
558
|
-
time0 = Date.now()
|
|
559
|
-
if (!isEmail(`any@${domain}`)) {
|
|
560
|
-
try { await vars.models.Harvested.destroy({ where: { id: row.id } }) } catch (_) { } // DELETE
|
|
561
|
-
console.log(`Invalid domain: ${domain} - detected id: ${row.id} - DELETED`)
|
|
562
|
-
continue
|
|
563
|
-
}
|
|
564
|
-
profile.emailvalidation += Date.now() - time0
|
|
565
|
-
|
|
566
|
-
// create the provider
|
|
567
|
-
if (!result.hasOwnProperty(row.provider)) result[row.provider] = {}
|
|
568
|
-
|
|
569
|
-
// create the domain inside provider
|
|
570
|
-
if (!result[row.provider].hasOwnProperty(domain))
|
|
571
|
-
result[row.provider][domain] = {
|
|
572
|
-
// domain level firstseen & lastseen
|
|
573
|
-
firstseen: 5645821813648,
|
|
574
|
-
lastseen: 0,
|
|
575
|
-
|
|
576
|
-
hosts: {
|
|
577
|
-
[hostname]: {
|
|
578
|
-
firstseen: 5645821813648,
|
|
579
|
-
lastseen: 0,
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
else {
|
|
584
|
-
if (!result[row.provider][domain].hosts.hasOwnProperty(hostname))
|
|
585
|
-
result[row.provider][domain].hosts[hostname] = {
|
|
586
|
-
firstseen: 5645821813648,
|
|
587
|
-
lastseen: 0,
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
if (row.unicodeDomain)
|
|
592
|
-
result[row.provider][domain].unicodeDomain = punycode.toUnicode(domain)
|
|
593
|
-
|
|
594
|
-
let t = obfuscateTime ? obfuscatedTime(row.t) : row.t
|
|
595
|
-
|
|
596
|
-
// firstseen of domain
|
|
597
|
-
if (t < result[row.provider][domain].firstseen) result[row.provider][domain].firstseen = t
|
|
598
|
-
// lastseen update of domain
|
|
599
|
-
if (t > result[row.provider][domain].lastseen) result[row.provider][domain].lastseen = t
|
|
600
|
-
|
|
601
|
-
// firstseen of hostname
|
|
602
|
-
if (t < result[row.provider][domain].hosts[hostname].firstseen) result[row.provider][domain].hosts[hostname].firstseen = t
|
|
603
|
-
|
|
604
|
-
// lastseen update of hostname
|
|
605
|
-
if (t > result[row.provider][domain].hosts[hostname].lastseen) result[row.provider][domain].hosts[hostname].lastseen = t
|
|
606
|
-
}
|
|
607
|
-
profile.total = Date.now() - started
|
|
608
|
-
console.log(profile)
|
|
609
|
-
|
|
610
|
-
// routine to detect and remove expired domains from the results
|
|
611
|
-
// based on lastseen property
|
|
612
|
-
let expiredDomains = {
|
|
613
|
-
|
|
614
|
-
}
|
|
615
|
-
if (expiration_days > 0) {
|
|
616
|
-
for (let provider of Object.keys(result)) {
|
|
617
|
-
let inner = result[provider]
|
|
618
|
-
for (let domain of Object.keys(inner)) {
|
|
619
|
-
let inner2 = inner[domain]
|
|
620
|
-
if (!inner2?.lastseen || !inner2?.firstseen) {
|
|
621
|
-
console.log(chalk.red(`📌 domain without lastseen or firstseen: ${domain} - provider: ${provider}`))
|
|
622
|
-
continue
|
|
623
|
-
}
|
|
624
|
-
// we check domain level expiration
|
|
625
|
-
// for now expiration implementation rudimentary
|
|
626
|
-
let lastseenDaysAgo = Math.round((utcnow() - inner2.lastseen) / 60 / 60 / 24)
|
|
627
|
-
if (lastseenDaysAgo > expiration_days) {
|
|
628
|
-
if (!expiredDomains.hasOwnProperty(domain)) expiredDomains[domain] = {}
|
|
629
|
-
if (!expiredDomains[domain].hasOwnProperty(provider)) expiredDomains[domain][provider] = {
|
|
630
|
-
firstseen: inner2.firstseen,
|
|
631
|
-
lastseen: inner2.lastseen,
|
|
632
|
-
}
|
|
633
|
-
result[provider][domain].expired = true
|
|
634
|
-
|
|
635
|
-
// console.log(`expired domain: ${chalk.yellow(domain)} @ ${chalk.blue(provider)} - firstseen: ${new Date(inner2.firstseen * 1000).toISOString()} - lastseen: ${new Date(inner2.lastseen * 1000).toISOString()} (${lastseenDaysAgo} days ago)`)
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
progress.finish()
|
|
643
|
-
console.log(`✅ finished ${rows.length} rows, took ${(Math.floor(Date.now() - started) / 1000)} seconds`)
|
|
644
|
-
console.log(`✅ expired domains: ${Object.keys(expiredDomains).length}`)
|
|
645
|
-
return resolve([result, expiredDomains])
|
|
646
|
-
})
|
|
647
|
-
}
|
|
648
|
-
|
|
649
|
-
function obfuscatedTime(dt) {
|
|
650
|
-
return Math.round(dt / 10000000) * 10000
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
function domainFromEmail(email) {
|
|
654
|
-
let domPart = email.split(/@/)[1]
|
|
655
|
-
return domPart
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
function eventsOfProvider(providerName, days = 7) {
|
|
660
|
-
const { Op } = require("sequelize")
|
|
661
|
-
return new Promise(async function (resolve, reject) {
|
|
662
|
-
try {
|
|
663
|
-
let got = await vars.models.Events.findAll({
|
|
664
|
-
where: {
|
|
665
|
-
provider: providerName,
|
|
666
|
-
createdAt: {
|
|
667
|
-
[Op.gt]: new Date(new Date() - days * 24 * 60 * 60 * 1000)
|
|
668
|
-
}
|
|
669
|
-
}, raw: true
|
|
670
|
-
})
|
|
671
|
-
return resolve(got)
|
|
672
|
-
} catch (err) {
|
|
673
|
-
console.log(err)
|
|
674
|
-
Sentry.captureException(err)
|
|
675
|
-
return resolve(false)
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
})
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
function is_domain_banned(hostname_or_email, current_filter = {}) {
|
|
682
|
-
// determins if the main domain of this hostname is banned
|
|
683
|
-
let hostname
|
|
684
|
-
// lets parse the hostname from email address
|
|
685
|
-
if (hostname_or_email && typeof hostname_or_email === 'string' && hostname_or_email.search(/^.*@.+$/) === 0)
|
|
686
|
-
hostname = hostnameFromEmailAddress(hostname_or_email);
|
|
687
|
-
else hostname = hostname_or_email
|
|
688
|
-
|
|
689
|
-
// lets work with the hostname
|
|
690
|
-
if (hostname && typeof hostname === 'string') {
|
|
691
|
-
hostname = hostname.toLowerCase().trim()
|
|
692
|
-
let domainparse = psl.parse(hostname)
|
|
693
|
-
if (domainparse && typeof domainparse.domain === 'string' && domainparse.domain.length > 0) {
|
|
694
|
-
return current_filter.hasOwnProperty(domainparse.domain) ? current_filter[domainparse.domain] : false
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
return null
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
module.exports = {
|
|
702
|
-
findByIdValue,
|
|
703
|
-
initiateEmpty,
|
|
704
|
-
launch,
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
emailBy_id_innerText,
|
|
708
|
-
emailBy_id_value,
|
|
709
|
-
|
|
710
|
-
emailBy_querySelector_innerHTML,
|
|
711
|
-
emailBy_querySelector_innerText,
|
|
712
|
-
emailBy_querySelector_placeholder,
|
|
713
|
-
emailBy_querySelector_value,
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
emailFrom_combobox_id,
|
|
717
|
-
emailFrom_combobox_selector,
|
|
718
|
-
|
|
719
|
-
email_from_raw,
|
|
720
|
-
|
|
721
|
-
resolveMx,
|
|
722
|
-
promiseTimeout,
|
|
723
|
-
getDomainPart,
|
|
724
|
-
|
|
725
|
-
combineDomains,
|
|
726
|
-
getProviderDetails,
|
|
727
|
-
pullDomains,
|
|
728
|
-
pullEventsProviders,
|
|
729
|
-
pullEventsByProvider,
|
|
730
|
-
obfuscatedTime,
|
|
731
|
-
domainFromEmail,
|
|
732
|
-
eventsOfProvider,
|
|
733
|
-
is_domain_banned,
|
|
734
|
-
email_recursive_search,
|
|
735
|
-
clickto_element_withText
|
|
736
|
-
}
|