From 48a7338928eac59375c01dfb4f499f932aaf0f87 Mon Sep 17 00:00:00 2001 From: PAN Lei Date: Mon, 22 May 2023 00:57:12 +0200 Subject: [PATCH] need to use openCv to identifiy text --- assets/templates/welcome_later_btn.png | Bin 0 -> 20000 bytes src/appointment.js | 10 +- src/findTextWithOpenCV.js | 107 ++++++++++++++ src/openCvTest.js | 4 +- src/workers/CommandorPage.js | 187 +++++++++++++------------ src/workers/OCRChecker.js | 8 ++ start.js | 2 +- 7 files changed, 222 insertions(+), 96 deletions(-) create mode 100644 assets/templates/welcome_later_btn.png create mode 100644 src/findTextWithOpenCV.js diff --git a/assets/templates/welcome_later_btn.png b/assets/templates/welcome_later_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..78d0c28a62c801e5fba4ab835de104545d3872d8 GIT binary patch literal 20000 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 r7F;vD!tBZI literal 0 HcmV?d00001 diff --git a/src/appointment.js b/src/appointment.js index ecc1326..53d4549 100644 --- a/src/appointment.js +++ b/src/appointment.js @@ -14,7 +14,7 @@ let collectionName = formatDate(new Date()) // device_to_excludes = ["47e7e36b", "e30eb015"] // device_to_excludes = ["47e7e36b"] // device_to_excludes = ["J4AXB761H2322WJ"] -device_to_excludes = [] +device_to_excludes = ["e30eb015"] attributedPorts = [] const device_port_info = new Map(); startPort = 9000 @@ -171,12 +171,16 @@ async function startBookWithNumbers(startNumber, endNumber, selectedStore, pathT // get attributed port let attributedPort = device_port_info[device.serial()] if (attributedPort) { - const output = execSync('adb -s ' + device.serial() + " forward tcp:" + attributedPort + " localabstract:chrome_devtools_remote", {encoding: 'utf-8'}); // the default is 'buffer' + let cmd = 'adb -s ' + device.serial() + " forward tcp:" + attributedPort + " localabstract:chrome_devtools_remote"; + console.log("cmd is " + cmd); + const output = execSync(cmd, {encoding: 'utf-8'}); // the default is 'buffer' console.log('Output was:\n', output); } else { attributedPort = startPort; startPort++; - const output = execSync('adb -s ' + device.serial() + " forward tcp:" + attributedPort + " localabstract:chrome_devtools_remote", {encoding: 'utf-8'}); // the default is 'buffer' + let cmd = 'adb -s ' + device.serial() + " forward tcp:" + attributedPort + " localabstract:chrome_devtools_remote"; + console.log("cmd is " + cmd); + const output = execSync(cmd, {encoding: 'utf-8'}); // the default is 'buffer' console.log('Output was:\n', output); } return attributedPort diff --git a/src/findTextWithOpenCV.js b/src/findTextWithOpenCV.js new file mode 100644 index 0000000..c6e4baa --- /dev/null +++ b/src/findTextWithOpenCV.js @@ -0,0 +1,107 @@ +const path = require('path'); +const fs = require('fs'); +const { cv, drawBlueRect } = require('opencv4nodejs/ut'); +// const { extractResults } = require('./dnn/ssdUtils'); + +if (!cv.xmodules.dnn) { + throw new Error('exiting: opencv4nodejs compiled without dnn module'); +} + +const modelPath = path.resolve(__dirname, + '../data/text-models/frozen_east_text_detection.pb'); +const imgPath = path.resolve(__dirname, '../data/text-data/detection.png'); + +if (!fs.existsSync(modelPath)) { + console.log('could not find EAST model'); + console.log('download the model from: https://github.com/oyyd/frozen_east_text_detection.pb/blob/71415464412c55bb1d135fcdeda498e29a67effa/frozen_east_text_detection.pb?raw=true' + + ' or create a .pb model from https://github.com/argman/EAST'); + throw new Error('exiting: could not find EAST model'); +} + +const MIN_CONFIDENCE = 0.5; +const NMS_THRESHOLD = 0.4; +const SIZE = 320; + +function decode(scores, geometry, confThreshold) { + const [numRows, numCols] = scores.sizes.slice(2); + const boxes = []; + const confidences = []; + + for (let y = 0; y < numRows; y += 1) { + for (let x = 0; x < numCols; x += 1) { + const score = scores.at([0, 0, y, x]); + + if (score < MIN_CONFIDENCE) { + continue; + } + + const offsetX = x * 4; + const offsetY = y * 4; + const angle = geometry.at([0, 4, y, x]); + const cos = Math.cos(angle); + const sin = Math.sin(angle); + + const h = geometry.at([0, 0, y, x]) + geometry.at([0, 2, y, x]); + const w = geometry.at([0, 1, y, x]) + geometry.at([0, 3, y, x]); + + const endX = offsetX + (cos * geometry.at([0, 1, y, x])) + (sin * geometry.at([0, 2, y, x])); + const endY = offsetY - (sin * geometry.at([0, 1, y, x])) + (cos * geometry.at([0, 2, y, x])); + const startX = endX - w; + const startY = endY - h; + + boxes.push(new cv.Rect( + startX, + startY, + endX - startX, + endY - startY, + )); + confidences.push(score); + } + } + + return [boxes, confidences]; +} + +function detection(modelAbsPath, imgAbsPath) { + const net = cv.readNetFromTensorflow(modelPath); + const img = cv.imread(imgAbsPath); + const [imgHeight, imgWidth] = img.sizes; + const widthRatio = imgWidth / SIZE; + const heightRatio = imgHeight / SIZE; + + const inputBlob = cv.blobFromImage(img, 1, + new cv.Size(SIZE, SIZE), new cv.Vec3(123.68, 116.78, 103.94), true, false); + + net.setInput(inputBlob); + + const outBlobNames = [ + 'feature_fusion/Conv_7/Sigmoid', + 'feature_fusion/concat_3', + ]; + + const [scores, geometry] = net.forward(outBlobNames); + const [boxes, confidences] = decode(scores, geometry, MIN_CONFIDENCE); + + const indices = cv.NMSBoxes( + boxes, + confidences, MIN_CONFIDENCE, NMS_THRESHOLD + ); + + indices.forEach((i) => { + const rect = boxes[i]; + const imgRect = new cv.Rect( + rect.x * widthRatio, + rect.y * heightRatio, + rect.width * widthRatio, + rect.height * heightRatio, + ) + drawBlueRect(img, imgRect); + }); + + cv.imshowWait('EAST text detection', img); +} + +detection( + modelPath, + imgPath +); \ No newline at end of file diff --git a/src/openCvTest.js b/src/openCvTest.js index 5f8f0be..addcd79 100644 --- a/src/openCvTest.js +++ b/src/openCvTest.js @@ -12,8 +12,8 @@ const cv = require('opencv4nodejs'); const findWaldo = async () => { // Load images - const originalMat = await cv.imreadAsync(`/Users/lpan/Downloads/Screenshot_2023-05-19-14-09-11-82_40deb401b9ffe8e1df2f1cc5ba480b12.jpg`); - const waldoMat = await cv.imreadAsync(`${__dirname}/../assets/templates/valid_btn_template.png`); + const originalMat = await cv.imreadAsync(`/Users/lpan/Downloads/Screenshot_2023-05-20-15-20-22-860_com.android.chrome.jpg`); + const waldoMat = await cv.imreadAsync(`${__dirname}/../assets/templates/welcome_later_btn.png`); // Match template (the brightest locations indicate the highest match) const matched = originalMat.matchTemplate(waldoMat, 3); diff --git a/src/workers/CommandorPage.js b/src/workers/CommandorPage.js index 047089f..0f88081 100644 --- a/src/workers/CommandorPage.js +++ b/src/workers/CommandorPage.js @@ -11,7 +11,6 @@ const { } = require('electron') const GeoCaptchaSolver = require("./GeoCaptchaSolver"); const SlidingCaptchaSolver = require("./SlidingCaptchaSolver"); -const {de} = require("yarn/lib/cli"); const OCRChecker = require("./OCRChecker"); // const RDV_URL = "http://192.168.0.44:8000/test_appointment.html" const RDV_URL = "https://rendezvousparis.hermes.com/client/register"; @@ -34,12 +33,6 @@ const TIME_OUT = 60 * 1000 * 4//4 mins const EMPTY_RESPONSE_ERROR = "ERR_EMPTY_RESPONSE" const MESSAGE_URL_VALIDATION_FR = "Nous avons envoyé un lien par e-mail." const MESSAGE_URL_VALIDATION_EN = "Please click on the link we sent by email" -const DOUBLE_REQUEST_ERROR_MESSAGE = "A request with the same data has already been validated today." -const DOUBLE_REQUEST_ERROR_MESSAGE_FR = "Une demande avec les données saisies a déjà été validée aujourd’hui." -const TOO_MANY_REQUEST_ERROR_MESSAGE = "Due to a large number of requests" -const TOO_MANY_REQUEST_ERROR_MESSAGE_FR = "Suite à un trop grand nombre de demandes" -const CAPTCHA_ERROR_MESSAGE = "Error verifying captcha, please try again" -const CAPTCHA_ERROR_MESSAGE_FR = "La vérification du captcha a échoué" const REGEX_RDV_URL = "https:\/\/rendezvousparis\.hermes\.com\/client\/register\/[A-Z0-9]+" const DEFAULT_STORE = 'faubourg'; @@ -90,12 +83,16 @@ class CommandorPage { async connect_to_browser(ocrResult) { - this.browser = await puppeteer.connect({ - browserWSEndpoint: "ws://127.0.0.1:" + this.port + "/devtools/browser", - headless: false, defaultViewport: null - }) + console.log("connect_to_browser() called"); + if (!this.browser.isConnected()) { + this.browser = await puppeteer.connect({ + browserWSEndpoint: "ws://127.0.0.1:" + this.port + "/devtools/browser", + headless: false, defaultViewport: null + }) + } let pages = await this.browser.pages(); - this.page = pages[pages.length - 1] + // 0 is the last page + this.page = pages[0]; switch (ocrResult) { case OCRResult.SUCCESS: // get url and push to server @@ -105,10 +102,9 @@ class CommandorPage { case OCRResult.TO_REFRESH: logWithDevice("will reload page", this.device) await this.page.reload(); - logWithDevice("will disconnect browser", this.device) - await this.browser.disconnect() + await delay(1000); + await this.checkResultWithOcr(); break; - } let content = await this.page.content(); console.log(content); @@ -116,7 +112,7 @@ class CommandorPage { async loadPage() { // Connect to the device. - log("loadPage() called, with port:" + this.port); + logWithDevice("loadPage() called, with port:" + this.port, this.device); try { this.browser = await puppeteer.connect({ browserWSEndpoint: "ws://127.0.0.1:" + this.port + "/devtools/browser", @@ -145,14 +141,14 @@ class CommandorPage { log(e) this.isTerminated = true } - try { - if (this.page.url().includes("google")) { - this.page.focus('button >> nth=3') - this.page.click() - } - } catch (e) { - log(e) - } + // try { + // if (this.page.url().includes("google")) { + // this.page.focus('button >> nth=3') + // this.page.click() + // } + // } catch (e) { + // log(e) + // } try { const [button] = await this.page.$x("//a[contains(., 'rendezvousparis')]"); console.log("button is " + button) @@ -165,9 +161,9 @@ class CommandorPage { // }); } catch (e) { log(e) - if (!this.page.url().includes(RDV_URL)) { - this.isTerminated = true; - } + // if (!this.page.url().includes(RDV_URL)) { + // this.isTerminated = true; + // } } let cancel @@ -182,10 +178,10 @@ class CommandorPage { cancel() return this.browser } else { - if (this.page.url() === RDV_URL) { - if (!this.isFillingFields) - this.fillFields(this.page); - } + // if (this.page.url() === RDV_URL) { + // if (!this.isFillingFields) + // this.fillFields(this.page); + // } } }, 10 * 1000)//interval of 10 seconds @@ -331,7 +327,8 @@ class CommandorPage { async fillFields(page) { - log("fillFields called") + log("fillFields called for contact:" + this.contact.mail) + await this.enableDisableAirPlanMode() if (!this.isFillingFields) { this.isFillingFields = true; await this.chooseStore(page); @@ -364,24 +361,12 @@ class CommandorPage { // remove debug flag // const validElement = await page.$('.btn'); console.log("will click on valid button"); - console.log("will click on valid button"); - console.log("will click on valid button"); await this.page.evaluate(() => { document.getElementsByClassName("btn")[0].click(); }) // this.browser.disconnect(); - // await delay(2000); - // let ocrChecker = new OCRChecker(this.device, this.contact); - // let checkResult = await ocrChecker.get_result(); - // switch (checkResult) { - // case OCRResult.SUCCESS: - // // reconnect to page and get url - // await this.connect_to_browser(OCRResult.SUCCESS); - // break; - // case OCRResult.BLOCKED: - // await this.resetBrowser(); - // break; - // } + // await this.checkResultWithOcr(); + } catch (e) { log(e); } @@ -440,24 +425,17 @@ class CommandorPage { } async onPageLoad(currentPage) { + logWithDevice("onPageLoad called with url " + this.page.url(), this.device) try { - let content = await currentPage.content(); + let content = await this.page.content(); let captcha_url = "geo.captcha-delivery.com/captcha"; if (content.toString().includes(captcha_url)) { - if (this.audioAnalyse) { - await this.checkAudioBtn(); - } - if (this.alertBeep) { - for (let i = 0; i < 15; i++) { - await delay(1000) - shell.beep() - } - } + await this.checkResultWithOcr() logWithDevice("发现datadome", this.device); } else if (content.includes("502 Bad Gateway")) { logWithDevice("502 Bad Gateway found", this.device) await this.page.reload() - } else if (currentPage.url().includes("sorry")) { + } else if (this.page.url().includes("sorry")) { await this.resetBrowser() } else if (content.includes("PROXY_CONNECTION_FAILED")) { logWithDevice("PROXY_CONNECTION_FAILED, will reload page", this.device); @@ -467,12 +445,14 @@ class CommandorPage { logWithDevice("ERR_NETWORK_CHANGED, will reload page", this.device); await delay(2000) await this.page.reload() - } else if (content.includes("CACHE_MISS")) { - logWithDevice("CACHE_MISS, will reload page", this.device); - await delay(2000) - // await this.setUpCookies() - await this.page.reload() - } else if (content.includes("ERR_TIMED_OUT")) { + } + // else if (content.includes("CACHE_MISS")) { + // logWithDevice("CACHE_MISS, will reload page", this.device); + // await delay(2000) + // // await this.setUpCookies() + // await this.page.reload() + // } + else if (content.includes("ERR_TIMED_OUT")) { logWithDevice("ERR_TIMED_OUT, will reload page", this.device); await delay(2000) await this.page.reload() @@ -481,7 +461,7 @@ class CommandorPage { await delay(2000) await this.page.reload() } else { - if (currentPage.url() === RDV_URL) { + if (this.page.url() === RDV_URL) { await this.fillFields(this.page); await this.saveCookies() // if (this.isFillingFields) @@ -539,6 +519,14 @@ class CommandorPage { // } } + async slidingCaptcha(onResult) { + let slidingCaptchaSolver = new SlidingCaptchaSolver(this.device); + await slidingCaptchaSolver.solve(this.page, async (isSuccessful) => { + console.log("check isAlwaysBlocked") + onResult(isSuccessful) + }) + } + async checkAudioBtn() { let isBlocked = await this.isBlocked() if (!isBlocked) { @@ -589,6 +577,7 @@ class CommandorPage { async push_message_to_queue(publishType) { let url = this.page.url(); + logWithDevice("successful url is " + url, this.device) await this.push_message_to_db(publishType, url) } @@ -640,36 +629,11 @@ class CommandorPage { let elementHandle = await this.page.$('[title="reCAPTCHA"]') const iframe = await elementHandle.contentFrame() await iframe.click("#recaptcha-anchor > div.recaptcha-checkbox-border") - // // .getByRole('checkbox', {name: 'I\'m not a robot'}) - // if (enCheckbox) { - // enCheckbox.click() - // } else { - // let frCheckbox = await this.page.$('[title="reCAPTCHA"]').getByRole('checkbox', {name: 'Je ne suis pas un robot'}) - // if (frCheckbox) { - // frCheckbox.click() - // } else { - // console.log("recaptcha checkbox not found") - // } - // } } catch (e) { log(e); } } - async handleError(errorContent) { - log("handle error:" + errorContent); - if (errorContent.includes(DOUBLE_REQUEST_ERROR_MESSAGE) || errorContent.includes(DOUBLE_REQUEST_ERROR_MESSAGE_FR)) { - this.isTerminated = true; - } else if (errorContent.includes(TOO_MANY_REQUEST_ERROR_MESSAGE) || errorContent.includes(TOO_MANY_REQUEST_ERROR_MESSAGE_FR)) { - //add contact to black list and set terminated the task - log("handle error: will save to black list db"); - await this.saveToBlackList() - } else if (errorContent.includes(CAPTCHA_ERROR_MESSAGE) || errorContent.includes(CAPTCHA_ERROR_MESSAGE_FR)) { - this.isTerminated = true; - } - - } - async removeDebugFlag() { await delay(1000) await this.device.shell("am clear-debug-app --persistent com.android.chrome") @@ -680,12 +644,55 @@ class CommandorPage { console.log("will reset browser") await this.device.shell("pm clear com.android.chrome") await delay(1000) - await this.device.shell("pm am start -n com.android.chrome/com.google.android.apps.chrome.Main") + await this.device.shell("am start -n com.android.chrome/com.google.android.apps.chrome.Main") await delay(1000) + // await this.skipWelcomePage() this.isTerminated = true } + async checkResultWithOcr() { + console.log("checkResultWithOcr() called.") + await delay(2000); + let ocrChecker = new OCRChecker(this.device, this.contact); + let checkResult = await ocrChecker.get_result(); + while (checkResult === OCRResult.RECHECK) { + await delay(4000) + logWithDevice("will recheck OCR", this.device) + checkResult = await ocrChecker.get_result(); + } + while (checkResult === OCRResult.SLIDING_CAPTCHA) { + await this.slidingCaptcha(async () => { + checkResult = await ocrChecker.get_result(); + await this.checkResultWithOcr() + }) + await delay(5000) + } + switch (checkResult) { + case OCRResult.SUCCESS: + // reconnect to page and get url + await this.connect_to_browser(OCRResult.SUCCESS); + break; + case OCRResult.RECAPTCHA_ERROR: + this.isTerminated = true; + break; + case OCRResult.TO_REFRESH: + await this.connect_to_browser(OCRResult.TO_REFRESH) + break; + case OCRResult.BLOCKED: + await this.resetBrowser(); + break; + } + } + + async enableDisableAirPlanMode() { + logWithDevice("will enable aireplan mode", this.device) + await this.device.shell("cmd connectivity airplane-mode enable") + await this.device.shell("adb shell settings put global airplane_mode_on 1") + await delay(1000) + await this.device.shell("adb shell settings put global airplane_mode_on 0") + await this.device.shell("cmd connectivity airplane-mode disable") + } } module.exports = CommandorPage \ No newline at end of file diff --git a/src/workers/OCRChecker.js b/src/workers/OCRChecker.js index 2226052..54f36f1 100644 --- a/src/workers/OCRChecker.js +++ b/src/workers/OCRChecker.js @@ -23,6 +23,8 @@ const CAPTCHA_ERROR_MESSAGE_FR = "La vérification du captcha a échoué" const BLOCKED_MSG_EN = "have been blocked" const BLOCKED_MSG_FR = "avez été bloqué" const CHECKING_MSG_FR = "Verifying" +const ERR_CACHE_MISS = "ERR_CACHE_MISS" +const SLIDING_CAPTCHA_FR = "Glissez vers la droite" class OCRChecker { @@ -47,6 +49,12 @@ class OCRChecker { return OCRResult.RECAPTCHA_ERROR } else if (result.includes(BLOCKED_MSG_EN) || result.includes(BLOCKED_MSG_FR)) { return OCRResult.BLOCKED + } else if (result.includes(ERR_CACHE_MISS)) { + return OCRResult.TO_REFRESH + } else if (result.includes(CHECKING_MSG_FR)) { + return OCRResult.RECHECK + } else if (result.includes(SLIDING_CAPTCHA_FR)) { + return OCRResult.SLIDING_CAPTCHA } } diff --git a/start.js b/start.js index 359a044..fc0d87e 100644 --- a/start.js +++ b/start.js @@ -1,6 +1,6 @@ const {startBookWithNumbers, scheduleBookWithNumbers} = require('./src/appointment') -startBookWithNumbers(0, 2, "random", "./163_contacts.xlsx", true, false).then((r) => { +startBookWithNumbers(70, 200, "random", "/Users/lpan/Desktop/gmail_contacts.xlsx", true, false).then((r) => { console.log(r) })