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.
Files changed (274) hide show
  1. package/LICENSE.md +29 -0
  2. package/README.md +66 -16
  3. package/dist/index.d.ts +9 -0
  4. package/dist/index.js +220 -0
  5. package/dist/json/data.json +1 -0
  6. package/dist/types.d.ts +16 -0
  7. package/dist/types.js +3 -0
  8. package/package.json +36 -42
  9. package/apiserver/api/ext_result.js +0 -51
  10. package/apiserver/api/ext_tasks.js +0 -151
  11. package/apiserver/api/is_fakedomain.js +0 -39
  12. package/apiserver/api/is_fakeemail.js +0 -17
  13. package/apiserver/api/ping.js +0 -12
  14. package/apiserver/docs/README.md +0 -41
  15. package/apiserver/docs/babel.config.js +0 -3
  16. package/apiserver/docs/blog/2019-05-28-first-blog-post.md +0 -12
  17. package/apiserver/docs/blog/2019-05-29-long-blog-post.md +0 -44
  18. package/apiserver/docs/blog/2021-08-01-mdx-blog-post.mdx +0 -20
  19. package/apiserver/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg +0 -0
  20. package/apiserver/docs/blog/2021-08-26-welcome/index.md +0 -25
  21. package/apiserver/docs/blog/authors.yml +0 -17
  22. package/apiserver/docs/docs/intro.md +0 -16
  23. package/apiserver/docs/docs/nodejs/_category_.json +0 -4
  24. package/apiserver/docs/docs/nodejs/index.md +0 -30
  25. package/apiserver/docs/docs/restful/_category_.json +0 -4
  26. package/apiserver/docs/docs/restful/index.md +0 -59
  27. package/apiserver/docs/docusaurus.config.js +0 -118
  28. package/apiserver/docs/package.json +0 -37
  29. package/apiserver/docs/sidebars.js +0 -31
  30. package/apiserver/docs/src/components/HomepageFeatures/index.js +0 -64
  31. package/apiserver/docs/src/components/HomepageFeatures/styles.module.css +0 -11
  32. package/apiserver/docs/src/css/custom.css +0 -39
  33. package/apiserver/docs/src/pages/index.js +0 -45
  34. package/apiserver/docs/src/pages/index.module.css +0 -23
  35. package/apiserver/docs/src/pages/markdown-page.md +0 -7
  36. package/apiserver/docs/src/theme/IconArrow/index.js +0 -10
  37. package/apiserver/docs/static/.nojekyll +0 -0
  38. package/apiserver/docs/static/img/docusaurus.png +0 -0
  39. package/apiserver/docs/static/img/favicon.ico +0 -0
  40. package/apiserver/docs/static/img/logo.svg +0 -1
  41. package/apiserver/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
  42. package/apiserver/docs/static/img/tutorial/localeDropdown.png +0 -0
  43. package/apiserver/docs/static/img/undraw_docusaurus_mountain.svg +0 -171
  44. package/apiserver/docs/static/img/undraw_docusaurus_react.svg +0 -170
  45. package/apiserver/docs/static/img/undraw_docusaurus_tree.svg +0 -40
  46. package/apiserver/inc/middleware_client.js +0 -37
  47. package/apiserver/inc/middleware_logging.js +0 -17
  48. package/apiserver/inc/shared.js +0 -47
  49. package/apiserver/inc/worker_fakefilter.js +0 -53
  50. package/apiserver/index.js +0 -62
  51. package/apiserver/public/10minemail.com.js +0 -27
  52. package/apiserver/public/10minuteemails.com.js +0 -46
  53. package/apiserver/public/10minutemail.com.js +0 -29
  54. package/apiserver/public/crazymailing.com.js +0 -27
  55. package/apiserver/public/gettempmail.com.js +0 -39
  56. package/apiserver/public/img/dynamic/README.md +0 -0
  57. package/apiserver/public/img/test.html +0 -48
  58. package/apiserver/public/onetempmail.com.js +0 -35
  59. package/apiserver/public/shared.js +0 -54
  60. package/apiserver/public/temp-mail.org.js +0 -28
  61. package/apiserver/public/tempmail.com.tr.js +0 -36
  62. package/apiserver/public/tempmail.net.js +0 -28
  63. package/apiserver/public/tempmailid.com.js +0 -40
  64. package/apiserver/public/tempmailo.org.js +0 -36
  65. package/apiserver/public/throwawaymail.com.js +0 -27
  66. package/burner/README.md +0 -1
  67. package/burner/burner-check.js +0 -57
  68. package/burner/emails.txt +0 -57106
  69. package/chart-update.js +0 -261
  70. package/cleanup.js +0 -58
  71. package/config.js +0 -126
  72. package/demos/visitor0/index.js +0 -41
  73. package/demos/visitor0/renderedDOM.html +0 -8
  74. package/elements/demo.js +0 -78
  75. package/elements/renderedDOM.html +0 -6459
  76. package/elements/screenshots/afterclick.png +0 -0
  77. package/elements/screenshots/goto.png +0 -0
  78. package/events.js +0 -59
  79. package/fetch.js +0 -180
  80. package/models/events.js +0 -37
  81. package/models/harvested.js +0 -45
  82. package/models/harvested_clone.js +0 -44
  83. package/providers/10-minute-mail.com.js +0 -39
  84. package/providers/10-minuten-mail.de.js +0 -39
  85. package/providers/10mails.net.js +0 -41
  86. package/providers/10minut.com.pl.js +0 -39
  87. package/providers/10minut.xyz.js +0 -40
  88. package/providers/10minuteemails.com.js +0 -39
  89. package/providers/10minutemail.co.za.js +0 -39
  90. package/providers/10minutemail.com.js +0 -39
  91. package/providers/10minutemail.info.js +0 -38
  92. package/providers/10minutemail.net.js +0 -38
  93. package/providers/10minutemail.org.js +0 -38
  94. package/providers/10minutesemail.net.js +0 -36
  95. package/providers/10minutesmail.us.js +0 -39
  96. package/providers/1secmail.com.js +0 -39
  97. package/providers/20minutemail.com.js +0 -36
  98. package/providers/22.do.js +0 -25
  99. package/providers/24hour.email.js +0 -37
  100. package/providers/___emailondeck.com.js +0 -76
  101. package/providers/abandonmail.com.js +0 -39
  102. package/providers/airmailbox.website.js +0 -38
  103. package/providers/akmail.in.js +0 -37
  104. package/providers/altaddress.org.js +0 -50
  105. package/providers/altmails.com.js +0 -37
  106. package/providers/anonbox.net.js +0 -42
  107. package/providers/anonmails.de.js +0 -25
  108. package/providers/anonymmail.net.js +0 -47
  109. package/providers/another-temp-mail.com.js +0 -40
  110. package/providers/awgarstone.com.js +0 -15
  111. package/providers/brodilla.email.js +0 -45
  112. package/providers/byom.de.js +0 -42
  113. package/providers/chacuo.net.js +0 -38
  114. package/providers/cryptogmail.com.js +0 -40
  115. package/providers/default.tmail.thehp.in.js +0 -41
  116. package/providers/developermail.com.js +0 -39
  117. package/providers/dispemail.com.js +0 -38
  118. package/providers/disposableemail.co.js +0 -37
  119. package/providers/disposableemail.us.js +0 -37
  120. package/providers/disposablemail.com.js +0 -38
  121. package/providers/disposeamail.com.js +0 -43
  122. package/providers/dispostable.com.js +0 -39
  123. package/providers/dodsi.com.js +0 -38
  124. package/providers/dropmail.me.js +0 -37
  125. package/providers/easytrashmail.com.js +0 -33
  126. package/providers/edumail.icu.js +0 -36
  127. package/providers/email-fake.com.js +0 -35
  128. package/providers/emailfake.com.js +0 -35
  129. package/providers/emailnator.com.js +0 -37
  130. package/providers/etempmail.com.js +0 -36
  131. package/providers/etempmail.net.js +0 -37
  132. package/providers/eyepaste.com.js +0 -39
  133. package/providers/fakemail.io.js +0 -36
  134. package/providers/fakemail.net.js +0 -35
  135. package/providers/fakemailgenerator.com.js +0 -35
  136. package/providers/fakermail.com.js +0 -37
  137. package/providers/faxmail.co.js +0 -47
  138. package/providers/fex.plus.js +0 -38
  139. package/providers/findtempmail.com.js +0 -39
  140. package/providers/foxiomail.com.js +0 -42
  141. package/providers/fyii.de.js +0 -42
  142. package/providers/gecicimail.co.js +0 -14
  143. package/providers/gecicimail.com.tr.js +0 -15
  144. package/providers/generator.email.js +0 -37
  145. package/providers/getnada.cc.js +0 -37
  146. package/providers/getnada.com.js +0 -37
  147. package/providers/gmailcity.com.js +0 -37
  148. package/providers/gpa.lu.js +0 -37
  149. package/providers/guerrillamail.com.js +0 -38
  150. package/providers/harakirimail.com.js +0 -38
  151. package/providers/haribu.net.js +0 -39
  152. package/providers/hizli.email.js +0 -40
  153. package/providers/hottempmail.com.js +0 -52
  154. package/providers/instant-email.org.js +0 -39
  155. package/providers/instantemailaddress.com.js +0 -40
  156. package/providers/internxt.com.js +0 -47
  157. package/providers/jooko.info.js +0 -37
  158. package/providers/kopeechka.store.js +0 -43
  159. package/providers/kuku.lu.js +0 -37
  160. package/providers/linshi-email.com.js +0 -38
  161. package/providers/linshiyou.com.js +0 -25
  162. package/providers/linshiyouxiang.net.js +0 -36
  163. package/providers/lroid.com.js +0 -35
  164. package/providers/luxusmail.org.js +0 -39
  165. package/providers/mail-temp.com.js +0 -37
  166. package/providers/mail-tester.com.js +0 -37
  167. package/providers/mail.gen.tr.js +0 -14
  168. package/providers/mail.gw.js +0 -35
  169. package/providers/mail.td.js +0 -42
  170. package/providers/mail.tm.js +0 -35
  171. package/providers/mail1.js +0 -44
  172. package/providers/mail1a.de.js +0 -42
  173. package/providers/mail4qa.com.js +0 -37
  174. package/providers/mail7.io.js +0 -41
  175. package/providers/mailcatch.com.js +0 -38
  176. package/providers/maildim.com.js +0 -38
  177. package/providers/maildrop.cc.js +0 -38
  178. package/providers/mailinator.com.js +0 -27
  179. package/providers/mailnesia.com.js +0 -41
  180. package/providers/mailpoof.com.js +0 -71
  181. package/providers/mailsac.com.js +0 -27
  182. package/providers/mailswipe.net.js +0 -37
  183. package/providers/minimail.eu.org.js +0 -27
  184. package/providers/mintemail.com.js +0 -49
  185. package/providers/minuteinbox.com.js +0 -35
  186. package/providers/moakt.com.js +0 -37
  187. package/providers/mohmal.com.js +0 -39
  188. package/providers/muellmail.com.js +0 -40
  189. package/providers/mytemp.email.js +0 -35
  190. package/providers/mytrashmailer.com.js +0 -38
  191. package/providers/niepodam.pl.js +0 -53
  192. package/providers/nolog.email.js +0 -38
  193. package/providers/onetempmail.com.js +0 -37
  194. package/providers/open.js +0 -41
  195. package/providers/oxyemail.com.js +0 -38
  196. package/providers/phaantm.de.js +0 -42
  197. package/providers/poo.email.js +0 -27
  198. package/providers/sandvpn.com.js +0 -49
  199. package/providers/shitmail.me.js +0 -38
  200. package/providers/shitmail.org.js +0 -38
  201. package/providers/snapmail.cc.js +0 -42
  202. package/providers/spamdecoy.net.js +0 -38
  203. package/providers/spamgourmet.com.js +0 -29
  204. package/providers/spoofmail.de.js +0 -47
  205. package/providers/static.js +0 -32
  206. package/providers/t-mail.org.js +0 -42
  207. package/providers/temp-email.info.js +0 -39
  208. package/providers/temp-inbox.com.js +0 -38
  209. package/providers/temp-inbox.me.js +0 -47
  210. package/providers/temp-mail.io.js +0 -36
  211. package/providers/temp-mail.org.2.js +0 -60
  212. package/providers/temp-mail.org.js +0 -36
  213. package/providers/temp-mailbox.com.js +0 -35
  214. package/providers/temp-mails.com.js +0 -45
  215. package/providers/temp.cab.js +0 -39
  216. package/providers/tempail.com.js +0 -36
  217. package/providers/tempinbox.xyz.js +0 -38
  218. package/providers/tempmail.adguard.com.js +0 -31
  219. package/providers/tempmail.altmails.com.js +0 -37
  220. package/providers/tempmail.cn.js +0 -38
  221. package/providers/tempmail.co.js +0 -38
  222. package/providers/tempmail.dev.js +0 -35
  223. package/providers/tempmail.io.js +0 -38
  224. package/providers/tempmail.ninja.js +0 -35
  225. package/providers/tempmail.plus.js +0 -47
  226. package/providers/tempmail.quest.js +0 -45
  227. package/providers/tempmail.run.js +0 -37
  228. package/providers/tempmail.tel.js +0 -38
  229. package/providers/tempmailed.com.js +0 -43
  230. package/providers/tempmailo.com.js +0 -35
  231. package/providers/tempo-email.com.js +0 -38
  232. package/providers/tempo-mail.xyz.js +0 -40
  233. package/providers/temporary-email.com.js +0 -35
  234. package/providers/temporary-email.org.js +0 -36
  235. package/providers/temporary-mail.net.js +0 -42
  236. package/providers/temporarymail.com.js +0 -39
  237. package/providers/tempos.email.js +0 -38
  238. package/providers/tempr.email.js +0 -45
  239. package/providers/temprmail.com.js +0 -38
  240. package/providers/tenmail.org.js +0 -40
  241. package/providers/thnen.com.js +0 -25
  242. package/providers/throwaway.io.js +0 -39
  243. package/providers/tmail.gg.js +0 -36
  244. package/providers/tmail.mmomekong.com.js +0 -38
  245. package/providers/tmailor.com.js +0 -37
  246. package/providers/tmailweb.com.js +0 -39
  247. package/providers/trash-mail.com.js +0 -42
  248. package/providers/trashmail.com.js +0 -39
  249. package/providers/trashmail.de.js +0 -36
  250. package/providers/trashmail.live.js +0 -36
  251. package/providers/trashmail.org.js +0 -39
  252. package/providers/trashmail.ws.js +0 -42
  253. package/providers/trashmails.com.js +0 -38
  254. package/providers/tuamaeaquelaursa.com.js +0 -25
  255. package/providers/txen.de.js +0 -48
  256. package/providers/wegwerfemailadresse.com.js +0 -43
  257. package/providers/yopmail.com.js +0 -37
  258. package/providers/yopmail.fr.js +0 -37
  259. package/providers/yopmail.net.js +0 -37
  260. package/providers/yourmail.online.js +0 -39
  261. package/providers/youxiang.dev.js +0 -25
  262. package/release.sh +0 -26
  263. package/repo-update.js +0 -134
  264. package/shared.js +0 -736
  265. package/test/doRequest.js +0 -47
  266. package/test/is_domain_banned.js +0 -53
  267. package/test/is_fakedomain.js +0 -136
  268. package/test/is_fakeemail.js +0 -136
  269. package/test/psl.js +0 -58
  270. package/test/repo_json_v1.js +0 -30
  271. package/test/repo_json_v2.js +0 -41
  272. package/test1.js +0 -36
  273. package/update-repo.sh +0 -37
  274. 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
- }