· 6 years ago · Oct 26, 2019, 02:02 AM
1//#region Global Variables
2const readln = process.stdout;
3const { promisify } = require('util');
4const fs = require('fs');
5const readFile = promisify(fs.readFile);
6const open = promisify(fs.open);
7const stat = promisify(fs.stat);
8const mkdir = promisify(fs.mkdir);
9const path = require('path');
10const { XMLHttpRequest } = require('xmlhttprequest');
11const puppeteer = require('puppeteer');
12const devices = require('puppeteer/DeviceDescriptors');
13const iPhonex = devices['iPhone X'];
14const isPkg = typeof process.pkg !== 'undefined';
15
16let chromiumPath = (isPkg ?
17 puppeteer.executablePath().replace(
18 process.platform!='win32' ? /^.*?\/node_modules\/puppeteer\/\.local-chromium/ : /^.*?\\node_modules\\puppeteer\\\.local-chromium/,
19 path.join(path.dirname(process.execPath), 'chromium')
20 ) :
21 puppeteer.executablePath()
22);
23
24const siteData = {
25 appName: 'dofus',
26 app: 'https://www.dofus.com/fr/mmorpg/jouer',
27 appHome: 'https://www.dofus.com/fr',
28 appLogout: 'https://account.ankama.com/sso?action=logout&from=https%3A%2F%2Fwww.dofus.com%2Ffr',
29 username: '#userlogin',
30 password: '#user_password',
31 verify_pass: '#user_password_confirm',
32 email: '#user_mail',
33 birthDay: '#ak_field_1',
34 birthMonth: '#ak_field_2',
35 birthYear: '#ak_field_3',
36 newletterCheck: 'body > div.ak-mobile-menu-scroller > div.container.ak-main-container > div > div:nth-child(1) > div > div > div > div.ak-inner-block > div > div.col-md-8 > div > form > fieldset > div > div > div > div:nth-child(8) > div > div > label',
37 submit: '#submit_field',
38 siteKey: '6LfbFRsUAAAAACrqF5w4oOiGVxOsjSUjIHHvglJx'
39};
40
41const defaultData = {
42 inputFileName: 'proxy.txt',
43 outputFileName: 'accounts.txt',
44 dirs: {
45 captureDir: 'capture',
46 logDir: 'log',
47 outDir: 'out'
48 },
49 proxyAllowedCountries: [
50 'BD','BE','BJ','MM','BO','CM','CA','CY','FR','GB','IQ','JP','PG','PY','PR','PE','SV','SD','PS','LK'
51 ]
52};
53
54const stdClrs = {
55 Reset: "\x1b[0m",
56 Bright: "\x1b[1m",
57 Dim: "\x1b[2m",
58 Underscore: "\x1b[4m",
59 Blink: "\x1b[5m",
60 Reverse: "\x1b[7m",
61 Hidden: "\x1b[8m",
62 FgBlack: "\x1b[30m",
63 FgRed: "\x1b[31m",
64 FgGreen: "\x1b[32m",
65 FgYellow: "\x1b[33m",
66 FgBlue: "\x1b[34m",
67 FgMagenta: "\x1b[35m",
68 FgCyan: "\x1b[36m",
69 FgWhite: "\x1b[37m",
70 BgBlack: "\x1b[40m",
71 BgRed: "\x1b[41m",
72 BgGreen: "\x1b[42m",
73 BgYellow: "\x1b[43m",
74 BgBlue: "\x1b[44m",
75 BgMagenta: "\x1b[45m",
76 BgCyan: "\x1b[46m",
77 BgWhite: "\x1b[47m"
78};
79
80const ipValidityUrl = 'https://hidemyna.me/api/geoip.php?out=js&htmlentities';
81const antiCaptchaKey = 'a85724ce2be28d2d63d85f8411ae14d2'; //Anti-captcha key
82const createTaskUrl = 'https://api.anti-captcha.com/createTask';
83const getTaskResultUrl = 'https://api.anti-captcha.com/getTaskResult';
84const mailDomain = '@mail.dampen59.io'; //remplacez par votre domaine mail
85const getMailListUrl = 'https://mailsac.com/api/addresses/*@mail.dampen59.io/messages?_mailsacKey=5C4iisaSHz7igvqQFwGtR9w'; //mettre ici domaine mail & clé api mail
86
87// Filtering and detecting arguments
88const arguments = process.argv;
89let skipNext = false;
90let inputFile, outputFile,
91 useProxy = true,
92 useEmulation = false;
93
94arguments.forEach((arg, key) => {
95 if(key < 1 || skipNext){
96 skipNext = false;
97 return;
98 }
99 if(arg[0] === '-'){
100 skipNext = true;
101 switch (arg[1]) {
102 case 'i':
103 inputFile = arguments[key+1];
104 break;
105
106 case 'o':
107 outputFile = arguments[key+1];
108 break;
109
110 case '-':
111 switch (arg.substring(2)) {
112 case 'use-proxy':
113 useProxy = true;
114 break;
115
116 case 'no-proxy':
117 useProxy = false;
118 break;
119
120 case 'use-emulation':
121 useEmulation = true;
122 break;
123
124 case 'no-emulation':
125 useEmulation = false;
126 break;
127
128 default:
129 break;
130 }
131 break;
132
133 default:
134 skipNext = false;
135 console.error('Unknown argument Encountered');
136 break;
137 }
138 }
139});
140
141if(!inputFile) {
142 inputFile = defaultData.inputFileName;
143}
144if(!outputFile) {
145 outputFile = defaultData.dirs.outDir+'/'+defaultData.outputFileName;
146}
147
148//#endregion
149
150//#region Helper Functions
151
152const delay = (seconds) => new Promise((resolves) => {
153 setTimeout(resolves, seconds*1000);
154});
155
156const tempId = () => {
157 const getRandomString = () => Math.random().toString(36).substr(2, 9);
158 let isNumber = (temp, key) => !isNaN(temp.charAt(key));
159
160 let tempStr = getRandomString();
161 let firstChar = isNumber(tempStr, 0);
162 let numCount = 0;
163 while(firstChar || numCount==0) {
164 numCount = 0;
165 tempStr = getRandomString();
166 firstChar = isNumber(tempStr, 0);
167 for (let i = 0; i < tempStr.length; i++) {
168 if(isNumber(tempStr, i)){
169 numCount++;
170 }
171 }
172 }
173
174 let firstLtr = tempStr.charAt(0);
175 return tempStr.replace(firstLtr, firstLtr.toUpperCase());
176}
177
178const getRnd = function(min, max) {
179 return Math.floor(Math.random() * (max - min + 1)) + min;
180}
181
182const getFrenchMonth = function(month) {
183 const months = {
184 "1": "Janvier",
185 "2": "Fevrier",
186 "3": "Mars",
187 "4": "Avril",
188 "5": "Mai",
189 "6": "Juin",
190 "7": "Juillet",
191 "8": "Aout",
192 "9": "Septembre",
193 "10": "Octobre",
194 "11": "Novembre",
195 "12": "Decembre",
196 };
197
198 return months[`${month}`];
199}
200
201var _loadTick = 0;
202var _msg = "";
203const waiting = (msg, t) => {
204 _msg = msg;
205 return setInterval(() => {
206 readln.clearLine();
207 readln.cursorTo(0);
208 _loadTick = (_loadTick + 1) % 4;
209
210 var dots = new Array(_loadTick + 1).join(".");
211 readln.write(msg + dots);
212 }, t);
213}
214
215const stopWaiting = (timer, status) => {
216 clearInterval(timer);
217 loadTick = 0;
218 readln.clearLine();
219 readln.cursorTo(0);
220 readln.write(_msg + "... "+ status + stdClrs.Reset+ "\n");
221}
222
223const keypress = async () => {
224 process.stdin.setRawMode(true)
225 return new Promise(resolve => process.stdin.once('data', () => {
226 process.stdin.setRawMode(false)
227 resolve()
228 }));
229}
230
231const getTwoDigitString = (no) => ("0" + no.toString()).slice(-2);
232
233var getDateTime = () => {
234 let date = new Date();
235 return "["+getTwoDigitString(date.getDate())+"-"+getTwoDigitString(date.getMonth())+"-"+getTwoDigitString(date.getFullYear())+" "+getTwoDigitString(date.getHours())+":"+getTwoDigitString(date.getMinutes())+":"+getTwoDigitString(date.getSeconds())+"]";
236}
237
238//#endregion
239
240//#region Utility Functions
241//#region File Control Functions
242
243const checkDir = async (dir, callback) => new Promise(async (resolve, reject) => {
244 await stat(dir, function(err, stats) {
245 if(!err) return;
246 if (err && err.errno === -4058) {
247 mkdir(dir);
248 } else {
249 callback(err)
250 }
251 });
252});
253
254const readInputFile = (fileName) => new Promise(async (resolve, reject) => {
255 console.log('\x1b[36m%s\x1b[0m', 'Createur de compte - Petros#6392');
256
257 try {
258 readFile(fileName, 'utf-8', (err, content) => {
259 if(err) {
260 return reject(err);
261 }
262
263 var proxyList = [];
264 content.split('\n').forEach((line, key) => {
265 let proxy = line.trim().split(':');
266
267 if(proxy == '' || proxy[0].split('.').length < 4) {
268 // console.error('Invalid type of IP address Detected: ', proxy);
269 return;
270 }
271
272 let tempObj = {};
273 tempObj["_id"] = key;
274 tempObj["ip"] = proxy[0];
275 tempObj["port"] = proxy[1];
276
277 proxyList.push(tempObj);
278 });
279
280 if(proxyList.length == 0) {
281 console.log('No Proxy IPs found in the given file.\nTerminating application...');
282 return reject({ errorId: 1, msg: 'No IP found' });
283 }
284
285 console.log(`${proxyList.length} proxy IPs found`);
286 return resolve(proxyList);
287 });
288 } catch (err) {
289 console.log(`Error occured when reading \'${fileName}\'': `, err);
290 return reject({ errorId: -1, error: err });
291 }
292});
293
294const writeOutputFile = (fileName, data) => new Promise(async (resolve, reject) => {
295 open(fileName, 'a', (err, fd) => {
296 if (err) throw err;
297 fs.appendFile(fd, data, 'utf8', (err) => {
298 fs.close(fd, (err) => {
299 if (err) throw err;
300 });
301 if (err) throw err;
302 resolve({ status: 'success' });
303 });
304 });
305});
306
307const LOG = async (log) => {
308 await writeOutputFile('log/LOG.txt', `${getDateTime()} ${log}\n`);
309}
310
311//#endregion
312//#region Browser Control functions
313
314// Initialize browser window for proxy details
315const initBrowser = (proxy) => new Promise(async (resolve, reject) => {
316 try {
317 let browser = await puppeteer.launch({
318 executablePath: chromiumPath,
319 // headless: false,
320 // slowMo: 100,
321 args: (useProxy)?[ `--proxy-server=${proxy.ip}:${proxy.port}` ]:[]
322 });
323
324 resolve(browser);
325 } catch (error) {
326 console.log('Error in initBrowser: ', error);
327 // reject(error);
328 }
329});
330
331// Close pre-opened browser window
332const closeBrowser = (browser) => new Promise(async (resolve, reject) => {
333 try {
334 await browser.close();
335 return resolve({ status: 'success' });
336 } catch (error) {
337 console.log('Error in closeBrowser: ', error);
338 reject(error);
339 }
340});
341
342//#endregion
343//#region Network Requests
344
345const creatAntiCaptchaTask = () => new Promise(async (resolve, reject) => {
346 let http = new XMLHttpRequest();
347
348 http.onload = function(e) {
349 if(http.readyState === 4) {
350 let taskData = JSON.parse(http.responseText);
351 if(taskData.errorId !== 0)
352 reject(taskData);
353 resolve(taskData);
354 } else console.log('Error in response Data \'anti-captcha task creation\'');
355 }
356
357 try {
358 http.open("POST", createTaskUrl, true);
359 http.responseType = "json";
360 http.send(JSON.stringify({
361 "clientKey": `${antiCaptchaKey}`,
362 "task":
363 {
364 "type":"NoCaptchaTaskProxyless",
365 "websiteURL":"https:\/\/www.dofus.com\/fr\/mmorpg\/jouer",
366 "websiteKey": `${siteData.siteKey}`
367 },
368 "softId":0,
369 "languagePool":"en"
370 }));
371 } catch(err) {
372 console.log('Error in anti-captcha request', err);
373 reject(err);
374 }
375});
376
377const getAntiCaptchaResponseKey = (taskId) => new Promise(async (resolve, reject) => {
378 let http = new XMLHttpRequest();
379
380 http.onload = async function(e) {
381 let response = JSON.parse(http.responseText);
382
383 if(response.status === "processing") {
384 setTimeout(() => {
385 return resolve(getAntiCaptchaResponseKey(taskId));
386 }, 2000);
387 } else {
388 if(response.errorId !== 0) return reject(response);
389 return resolve(response);
390 }
391 }
392
393 try {
394 http.open("POST", getTaskResultUrl, true);
395 http.responseType = "json";
396 http.send(JSON.stringify({
397 clientKey: `${antiCaptchaKey}`,
398 taskId: `${taskId}`
399 }));
400 } catch (error) {
401 console.log('Error in anti-captcha responseKey request', error);
402 return reject(error);
403 }
404});
405
406const getValidationLink = (username) => new Promise(async (resolve, reject) => {
407 let http = new XMLHttpRequest();
408
409 http.onload = function(e) {
410 let mails = JSON.parse(http.responseText);
411
412 let mailCount = 0;
413 mails.forEach((mail) => {
414 if(mail.originalInbox == username + mailDomain){
415 mailCount++;
416 mail.links.forEach((link) => {
417 if(link.substr(8,13) == 'www.dofus.com'){
418 return resolve(link);
419 }
420 });
421 }
422 });
423
424 if(mailCount == 0){
425 setTimeout(() => {
426 return resolve(getValidationLink(username));
427 }, 2000);
428 }
429 }
430
431 http.open("GET", getMailListUrl, true);
432 http.responseType = "json";
433 http.send();
434});
435
436const getAllMails = () => new Promise(async (resolve, reject) => {
437 let http = new XMLHttpRequest();
438 let mailList = [];
439
440 http.onload = () => {
441 let mails = JSON.parse(http.responseText);
442
443 mails.forEach((mail) => {
444 mailList.push(mail);
445 })
446
447 return resolve(mailList);
448 }
449 http.open("GET", getMailListUrl, true);
450 http.responseType = "json";
451 http.send();
452});
453
454const getMail = (mailId) => new Promise(async (resolve) => {
455 let http = new XMLHttpRequest();
456
457 http.onload = () => {
458 if(http.readyState === 4){
459 let msg = JSON.parse(http.responseText);
460 // console.log(mailId, msg);
461 return resolve(msg);
462 }
463 }
464 http.open("GET", `https://mailsac.com/api/addresses/*@email.dampen59.io/messages/${mailId}/?_mailsacKey=5C4iisaSHz7igvqQFwGtR9w`);//mettre domaine mail & clé api mail
465 http.send();
466});
467
468const deleteMail = (mailId) => new Promise(async (resolve) => {
469 let http = new XMLHttpRequest();
470
471 http.onload = () => {
472 if(http.readyState === 4){
473 let msg = JSON.parse(http.responseText);
474 // console.log(mailId, msg);
475 return resolve(msg);
476 }
477 }
478 http.open("DELETE", `https://mailsac.com/api/addresses/*@email.dampen59.io/messages/${mailId}/?_mailsacKey=5C4iisaSHz7igvqQFwGtR9w`);//mettre domaine mail & clé api mail
479 http.send();
480})
481
482//#endregion
483//#endregion
484
485//#region Task Handling Functions
486
487const handleProxyFile = async () => {
488 // TODO
489}
490
491const handleAntiCaptcha = async () => {
492 await LOG('Creating Anti-Captcha Task');
493 let task;
494 try {
495 task = await creatAntiCaptchaTask();
496 await LOG(`Anti-Captcha Task created: ${JSON.stringify(task)}`);
497 } catch (error) {
498 await LOG(`An error occured: ${error}`);
499 return false;
500 }
501
502 await LOG('Requesting Anti-Captcha response key')
503 let response = null;
504 try {
505 response = await getAntiCaptchaResponseKey(task.taskId);
506 await LOG(`Anti-Captcha response key recieved: ${JSON.stringify(response)}`);
507
508 response = response.solution.gRecaptchaResponse;
509 } catch (error) {
510 await LOG(`An error occured: ${error}`);
511 return false;
512 }
513
514 return response;
515}
516
517const handleFormSubmission = async (dataIn) => {
518 let browser, status;
519 if(useProxy) {
520 await LOG('Using Proxy for browser');
521 console.log(`Using proxy ${dataIn.proxy.ip}:${dataIn.proxy.port}`);
522
523 browser = await initBrowser(dataIn.proxy);
524 await LOG('Initializing Browser');
525
526 let page = await browser.newPage();
527
528 //#region Proxy Validity Check
529
530 let proxyValidity = waiting("Checking proxy Validity", 800);
531 try {
532 await LOG('Trying to validate IP using an API');
533 await page.goto(ipValidityUrl, { waitUntil: "load" });
534 } catch (err) {
535 await LOG('Error occured during loading IP validation API');
536 await page.close();
537 await closeBrowser(browser);
538 stopWaiting(proxyValidity, (stdClrs.FgRed + "ERROR"));
539
540 return {
541 errorId: 3,
542 msg: 'Unknown Proxy Error',
543 error: err
544 };
545 }
546 await LOG('IP validation URL loaded');
547
548 let proxyInfo = await page.evaluate(() => {
549 let div = document.querySelector('body > pre'),
550 jsonObject = JSON.parse(div.innerText),
551 key = Object.keys(jsonObject);
552
553 return jsonObject[key];
554 })
555 await LOG(`Proxy infomarmation recorded: ${proxyInfo}`);
556
557 await LOG('Checking for validity of IP');
558 let isValid = defaultData.proxyAllowedCountries.find((element) => {
559 return (proxyInfo[0] == element)
560 }) == proxyInfo[0];
561
562 if(!isValid) {
563 await LOG('IP is not from a valid country');
564 await page.close();
565 await closeBrowser(browser);
566 stopWaiting(proxyValidity, (proxyInfo[0]+stdClrs.FgMagenta + " INVALID"));
567
568 return {
569 errorId: 2,
570 msg: 'Proxy IP location is not valid'
571 }
572 }
573 stopWaiting(proxyValidity, (stdClrs.FgGreen + " VALID"));
574 await LOG('IP is from a valid country');
575
576 //#endregion
577
578 await page.close();
579 } else {
580 await LOG('Initializing Browser');
581 console.log('Account Creation Started');
582 browser = await initBrowser();
583 }
584 await LOG('Account Creation Started');
585
586 let noOfPages = dataIn.cycles;
587 for (let page = 0; page < noOfPages; page++) {
588 await LOG(`Starting ${page+1} of ${dataIn.cycles} form submission`);
589 let webPage = await browser.newPage();
590
591 if(useEmulation) await webPage.emulate(iPhonex);
592
593 let msgStart = stdClrs.FgYellow + `[${page+1}] ` + stdClrs.Reset;
594
595 //#region Loading Signup Page
596
597 let pageLoading = waiting(msgStart + "Page Loading", 800);
598 try {
599 await webPage.goto(siteData.app, { waitUntil: "load" });
600 } catch (err) {
601 if(noOfPages < 5) noOfPages++;
602 stopWaiting(pageLoading, (stdClrs.FgRed + "ERROR"));
603 await LOG(`Error occured while loading: ${siteData.app} ${err}`);
604 await webPage.close();
605
606 continue;
607 }
608 await LOG(`${siteData.app} URL loaded`);
609 stopWaiting(pageLoading, (stdClrs.FgGreen + "DONE"));
610
611 //#endregion
612
613 //#region Anti-Captcha handling
614
615 await LOG('Handling Anti-captcha');
616 let responseKeyHandle = waiting(msgStart + "Handling Anti-captcha", 500);
617
618 let antiCaptchaKey = await handleAntiCaptcha();
619 if(antiCaptchaKey == false) {
620 stopWaiting(responseKeyHandle, (stdClrs.FgRed + "ERROR"));
621 status = {
622 errorId: 4,
623 msg: 'Error in Anticaptcha Key'
624 }
625 break;
626 }
627
628 await LOG('Anti-captcha response key recieved successfully');
629 stopWaiting(responseKeyHandle, (stdClrs.FgGreen + "DONE"))
630
631 //#endregion
632
633 //#region Page Processing
634 // process html and inject response key
635 let injectLoading = waiting(msgStart + "Page Injection", 400);
636 await LOG('Page Alteration Started');
637 let alteration = await webPage.evaluate((key) => {
638 let divs = document.querySelectorAll("body > div"),
639 iframe = document.querySelector('body > iframe'),
640 keyArea = document.querySelector('#g-recaptcha-response'),
641 form = document.querySelector('body > div.ak-mobile-menu-scroller > div.container.ak-main-container > div > div:nth-child(1) > div > div > div > div.ak-inner-block > div > div.col-md-8 > div > form'),
642 btn = document.createElement('input');
643
644 if(iframe == null) return {
645 errorId: 5,
646 error: 'Iframe not found',
647 content: iframe
648 };
649 iframe.parentNode.removeChild(iframe);
650
651 if(divs == null) return {
652 errorId: 6,
653 error: 'Div not found',
654 content: div
655 };
656 divs.forEach((div) => {
657 let top = div.style.top;
658 if(top!==''){
659 div.parentNode.removeChild(div);
660 }
661 });
662
663 try {
664 keyArea.style.display = "block";
665 keyArea.innerHTML = key;
666
667 btn.setAttribute('id', 'submit_field');
668 btn.setAttribute('type', 'submit');
669 form.append(btn);
670 } catch (error) {
671 return {
672 errorId: 7,
673 msg: 'Error on alteration',
674 error: error
675 };
676 }
677
678 return {
679 errorId: 0
680 };
681 }, antiCaptchaKey );
682
683 if(alteration.errorId != 0) {
684 await LOG(`Error in page injection: ${JSON.stringify(alteration)}`)
685 stopWaiting(injectLoading, (stdClrs.FgRed + "ERROR"));
686 await webPage.close();
687
688 continue;
689 }
690 await LOG('Page Alteration Done');
691 stopWaiting(injectLoading, (stdClrs.FgGreen + "DONE"));
692
693 // #endregion
694
695 //#region Form Submission
696
697 let formFilling = waiting(msgStart + "Form Filling", 500);
698 await LOG('Starting Form auto filling');
699 let userName = tempId(),
700 password = tempId(),
701 email = userName + mailDomain,
702 bDay = ("0" + getRnd(1,10).toString()).slice(-2),
703 bMonth = getFrenchMonth(getRnd(1, 12)).toString().substr(0,2),
704 bYear = getRnd(1987, 1998).toString();
705
706 let formData = {
707 username: userName,
708 password: password,
709 email: email,
710 birth: {
711 day: bDay,
712 month: bMonth,
713 year: bYear
714 }
715 };
716 await LOG(`Form filling started using random data ${JSON.stringify(formData)}`);
717
718 try {
719 await Promise.all([
720 await webPage.focus(siteData.username),
721 await webPage.keyboard.type(userName),
722 await webPage.keyboard.press('Tab'),
723
724 await webPage.focus(siteData.password),
725 await webPage.keyboard.type(password),
726 await webPage.keyboard.press('Tab'),
727
728 await webPage.focus(siteData.verify_pass),
729 await webPage.keyboard.type(password),
730 await webPage.keyboard.press('Tab'),
731
732 await webPage.focus(siteData.email),
733 await webPage.keyboard.type(email),
734 await webPage.keyboard.press('Tab'),
735
736 await webPage.focus(siteData.birthDay),
737 await webPage.keyboard.type(bDay),
738
739 await webPage.focus(siteData.birthMonth),
740 await webPage.keyboard.type(bMonth),
741
742 await webPage.focus(siteData.birthYear),
743 await webPage.keyboard.type(bYear)
744 ]);
745 await LOG('Form filling finished');
746 } catch (error) {
747 await LOG(`Error on form fill: ${error}`);
748 stopWaiting(formFilling, (stdClrs.FgRed + "ERROR"));
749 await webPage.close();
750
751 status = {
752 errorId: 10,
753 msg: 'Error on form filling',
754 error: error
755 }
756
757 break;
758 }
759
760 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_beforeSubmission.png`, fullPage: true });
761 await LOG('Submitting filled signup form');
762 await webPage.click(siteData.submit);
763 await webPage.waitFor(2*1000);
764
765 stopWaiting(formFilling, (stdClrs.FgGreen + "DONE"));
766
767 //#endregion
768
769 //#region Checking Submission State
770
771 let checkingSubmission = waiting(msgStart + "Checking Submission State", 500);
772
773 await LOG('Searching for submit state in DOM');
774 let submitState = await webPage.evaluate(() => {
775 let okDiv = document.querySelectorAll('.ak-register-email-validate'),
776 problemDiv = document.querySelectorAll('.ak-register-error');
777
778 if(okDiv.length >= 1){
779 return {
780 state: 'OK'
781 };
782 } else if(problemDiv.length >= 1) {
783 return {
784 state: 'ERROR'
785 };
786 } else {
787 return {
788 state: 'UNKNOWN'
789 };
790 }
791 });
792
793 if(submitState.state != 'OK') {
794 await LOG('Form was not submitted successfully: ' + JSON.stringify(submitState));
795 stopWaiting(checkingSubmission, (stdClrs.FgRed + "ERROR"));
796
797 await webPage.screenshot({ path: `./capture/${Date.now()}_error_${formData.username}_${formData.password}.png`, fullPage: true });
798 await webPage.close();
799
800 status = {
801 errorId: 5,
802 msg: 'Submission Error'
803 };
804 break;
805 }
806 await LOG('Form submitted successfully');
807 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_submitted.png`, fullPage: true });
808 await LOG('Submitted form page Captured');
809 stopWaiting(checkingSubmission, (stdClrs.FgGreen + "DONE"));
810
811 //#endregion
812
813 //#region Form Validation & Logging Out
814
815 let checkingEmail = waiting(msgStart + "Checking Validation Email", 500);
816 await LOG('Searching for validation Email')
817 let validationLink = await getValidationLink(formData.username.toLowerCase());
818 await LOG('Got the validation link: '+ validationLink);
819 stopWaiting(checkingEmail, (stdClrs.FgGreen + "DONE"));
820
821 let validateAccount = waiting(msgStart + "Validating Account", 500);
822 try {
823 await webPage.goto(validationLink, { waitUntil: 'load' });
824 await LOG('Account validated');
825 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_validated.png`, fullPage: true });
826 await writeOutputFile(outputFile, `${formData.username}:${formData.password}\n`);
827 } catch (error) {
828 stopWaiting(validateAccount, (stdClrs.FgRed + "ERROR"));
829 await LOG('Error on Account validation: '+error);
830 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_errorvalidated.png`, fullPage: true });
831 await webPage.close();
832
833 status = {
834 errorId: 6,
835 msg: 'Error on validation',
836 error: error
837 };
838 break;
839 }
840 stopWaiting(validateAccount, (stdClrs.FgGreen + "DONE"));
841
842
843 let loggingOut = waiting(msgStart + "Logging Out", 500);
844 await LOG('Logging out of the account');
845 await webPage.goto(siteData.appHome, { waitUntil: 'load' });
846 if(webPage.url() != siteData.appHome) {
847 // console.log('Cloudfare detected', webPage.url());
848 await LOG('Logging out not succeeded');
849 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_errorAfterValidation.png`, fullPage: true });
850 await webPage.close();
851
852 stopWaiting(loggingOut, (stdClrs.FgRed + "ERROR"));
853 break;
854 }
855 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_homeAfterValidation.png`, fullPage: true });
856
857 await webPage.goto(siteData.appLogout, { waitUntil: 'load' });
858 await webPage.screenshot({ path: `./capture/${Date.now()}_${formData.username}_${formData.password}_logoutAfterValidation.png`, fullPage: true });
859 await LOG('Logged out successfully');
860 stopWaiting(loggingOut, (stdClrs.FgGreen + "DONE"));
861
862 let deleteMails = waiting(msgStart + "Deleting Validation Email", 500);
863 await LOG('Deleting validation mail');
864 let mailList = await getAllMails();
865 let unsubscribeUrl = null;
866 if(mailList.length < 1) {
867 console.log('No Mails in inbox');
868 await LOG('No mails found for delete');
869 stopWaiting(deleteMails, (stdClrs.FgMagenta + "NO MAILS"));
870 }else {
871 let isDone = false;
872 for (let i = 0; i < mailList.length; i++) {
873 const element = mailList[i];
874 if(element.originalInbox.split('@')[0] == formData.username) {
875 await deleteMail(element._id).then(async (conf) => {
876 await LOG(`Validation Mail deleted: ${conf}`);
877 });
878 isDone = true;
879
880 element.links.forEach((link) => {
881 if(link.split(formData.username).length > 1) {
882 unsubscribeUrl = link;
883 }
884 });
885 await LOG(`Unsubscription link was ${unsubscribeUrl?'':'not'} found: ${unsubscribeUrl}`);
886 }
887 }
888 stopWaiting(deleteMails, isDone?(stdClrs.FgGreen + "DONE"):(stdClrs.FgRed + "ERROR"));
889 }
890
891
892 //#endregion
893
894 await LOG(`Account ${page+1} of 3, Created Successfully`);
895 console.log(`Account ${page+1} of 3, Created Successfully`);
896 await webPage.close();
897 }
898 await closeBrowser(browser);
899
900 if(status){
901 return status;
902 }
903 return { errorId: 0, msg: 'successfull' };
904}
905
906const handleTasks = async () => {
907 console.clear();
908 let proxyList = [
909
910 ];
911 if(useProxy) {
912 proxyList = await readInputFile(inputFile)
913 .catch((err) => {
914 console.log(err);
915 process.exit(0);
916 });
917 }
918
919 let length = proxyList.length;
920 length = (length > 0)?length:1;
921 for (let i = 0; i < length; i++) {
922 let status = await handleFormSubmission(useProxy?{
923 proxy: {
924 ip: proxyList[i].ip,
925 port: proxyList[i].port
926 },
927 cycles: 3,
928 entryNo: i
929 } : {
930 cycles: 3,
931 entryNo: i
932 });
933 }
934
935 return;
936}
937
938//#endregion
939
940(async function() {
941 var dirs = Object.values(defaultData.dirs);
942 for (const dir in defaultData.dirs) {
943 if (defaultData.dirs.hasOwnProperty(dir)) {
944 const element = defaultData.dirs[dir];
945
946 checkDir(element, (err) => {
947 console.log('Error Occured', err);
948 });
949 }
950 }
951 await delay(2);
952 await handleTasks();
953
954 process.exit();
955})();