diff --git a/package.json b/package.json index c96a935..7178368 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "electron-squirrel-startup": "^1.0.0", "mongodb": "^4.9.1", "mongoose": "^6.5.4", + "node-schedule": "^2.1.0", "node-wget": "^0.4.3", "node-xlsx": "^0.21.0", "playwright": "1.23.0", diff --git a/src/mail_validator.js b/src/mail_validator.js index b1e554c..0586e93 100644 --- a/src/mail_validator.js +++ b/src/mail_validator.js @@ -3,8 +3,11 @@ const {_android: android} = require("playwright"); const alert = require("alert"); const LinkValidator = require("./workers/LinkValidator"); const mongoManager = new MongoManager(); +const schedule = require('node-schedule'); +let canContinue = true; + +function validateLinks() { -mongoManager.connect().then(r => { android.devices().then((devices) => { if (devices.length === 0) { alert("未找到连接的设备"); @@ -14,15 +17,18 @@ mongoManager.connect().then(r => { let segmentNumber = list.length / devices.length; console.log("connected device number:" + devices.length) console.log("segmentNumber:" + segmentNumber) + canContinue = false; for (let i = 0; i < devices.length; i++) { startWithList(list.slice(i * segmentNumber, segmentNumber * (i + 1)), devices[i]).then(result => { console.log("stop") + canContinue = true; }) } }) }) -}); +} + async function startWithList(listOfUrls, device) { await listOfUrls.reduce(async (promise, urlToValidate) => { @@ -34,4 +40,14 @@ async function startWithList(listOfUrls, device) { await commandor.loadPage() console.log("next"); }, Promise.resolve()); -} \ No newline at end of file +} + +mongoManager.connect().then(r => { + const job = schedule.scheduleJob('*/1 * * * *', function () { + if (canContinue) { + validateLinks() + } else { + console.log("job is executing, ignored") + } + }) +}); \ No newline at end of file diff --git a/src/workers/LinkValidator.js b/src/workers/LinkValidator.js index 876a900..d3987bf 100644 --- a/src/workers/LinkValidator.js +++ b/src/workers/LinkValidator.js @@ -30,6 +30,7 @@ REGEX_RDV_URL = "https:\/\/rendezvousparis\.hermes\.com\/client\/register\/[A-Z0 const PLAY_AUDIO_BTN_ID = ".audio-captcha-play-button" const homedir = require('os').homedir(); const CAPTCHA_CONTAINER = "#captcha-container"; + function delay(delayInMs) { return new Promise(resolve => { setTimeout(() => { @@ -62,44 +63,49 @@ class LinkValidator { // Connect to the device. log("loadPage() called for url " + this.urlToValidate); // await this.device.shell('am force-stop com.android.chrome'); - const context = await this.device.launchBrowser(); - // await context.clearCookies() - - // Use BrowserContext as usual. - this.page = await context.newPage(); - this.page.on("load", (loadedPage) => { - this.onPageLoad(loadedPage) - }) - - this.page.on("response", (response) => { - this.onResponse(response) - }) try { - await this.page.goto(this.urlToValidate, {timeout: 90 * 1000}); + const context = await this.device.launchBrowser(); + // await context.clearCookies() + + // Use BrowserContext as usual. + this.page = await context.newPage(); + this.page.on("load", (loadedPage) => { + this.onPageLoad(loadedPage) + }) + + this.page.on("response", (response) => { + this.onResponse(response) + }) + try { + await this.page.goto(this.urlToValidate, {timeout: 90 * 1000}); + } catch (e) { + log(e) + this.isTerminated = true + } + + let cancel + const intervalTask = setInterval(() => { + if (this.isTerminated) { + log("request terminated, will close device") + context.close() + // this.page.close() + this.device.close() + clearInterval(intervalTask) + cancel() + return context + } + }, 10 * 1000)//interval of 10 seconds + + await new Promise(function (fulfill, reject) { + cancel = function () { + fulfill(Promise.resolve()) + } + setTimeout(fulfill, TIME_OUT, 5) + }).then(log) } catch (e) { - log(e) - this.isTerminated = true + console.log(e) } - let cancel - const intervalTask = setInterval(() => { - if (this.isTerminated) { - log("request terminated, will close device") - context.close() - // this.page.close() - this.device.close() - clearInterval(intervalTask) - cancel() - return context - } - }, 10 * 1000)//interval of 10 seconds - - await new Promise(function (fulfill, reject) { - cancel = function () { - fulfill(Promise.resolve()) - } - setTimeout(fulfill, TIME_OUT, 5) - }).then(log) } async onPageLoad(currentPage) {