Files
puppeteerjs/src/workers/SlidingCaptchaSolver.js
T
2023-07-17 23:28:28 +02:00

118 lines
4.4 KiB
JavaScript

const fs = require("fs");
const {exec} = require("child_process");
const axios = require("axios");
const {v4: uuidv4} = require('uuid');
// const DEEPLEARNING_CAPTCHA_HOST = "http://appointment.lpaconsulting.fr:9000"
const DEEPLEARNING_CAPTCHA_HOST = "http://192.168.0.36:9000"
function delay(delayInMs) {
return new Promise(resolve => {
setTimeout(() => {
resolve(2);
}, delayInMs);
});
}
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
class SlidingCaptchaSolver {
constructor(device) {
this.device = device;
}
async solve(page, onResult) {
await this.sliding_captcha(this.device, onResult)
}
async take_screen_shot(name, device) {
// let stdout1 = await exec("adb -s " + device.serial() + " shell screencap -p /sdcard/" + name)
console.log("take screenshot " + name);
await device.screenshot({path: name});
// let stdout1 = await exec("adb -s " + device.serial() + " exec-out screencap -p > " + name)
await delay(1000);
// console.log(`stdout: ${stdout1}`);
}
async sliding_captcha(device, onResult) {
// take screenshot
console.log("take screenshot")
let blockedFileName = uuidv4();
let blockedImageFileName = "blocked_" + blockedFileName + ".png"
await this.take_screen_shot(blockedImageFileName, device)
//get resolution of screen
await this.sendRequest(blockedImageFileName, async (detectedPositionList) => {
console.log("detectedPosition: " + device.model() + ":" + detectedPositionList);
if (detectedPositionList.length >= 2) {
// #xiaomi
let startPosition = detectedPositionList.filter((positionInfo) => {
return positionInfo.label === "origin"
})[0]
let targetPosition = detectedPositionList.filter((positionInfo) => {
return positionInfo.label === "target"
})[0]
if (startPosition !== undefined && targetPosition !== undefined) {
let y0 = (startPosition.y2 + startPosition.y1) / 2.0;
let x0 = (startPosition.x2 + startPosition.x1) / 2.0;
let y1 = (targetPosition.y2 + targetPosition.y1) / 2.0;
let x1 = (targetPosition.x2 + targetPosition.x1) / 2.0;
let width = targetPosition.x2 - targetPosition.x1;
let randomTime = randomIntFromInterval(100, 500)
let cmd = `adb -s ${device.serial()} shell input touchscreen swipe ${x0} ${y0} ${x1 + width * 0.5} ${y0} ${600 + randomTime}`
await delay(2000);
console.log("cmd is " + cmd);
console.log("will slide captcha");
await exec(cmd);
await delay(5000);
onResult(true)
} else {
console.log("startPosition not found for " + device.model())
onResult(false)
}
} else {
console.log("startPosition not found for " + device.model())
onResult(false)
}
})
}
async sendRequest(fileName, callback) {
const fileStream = fs.createReadStream(fileName);
let response = await axios.post(DEEPLEARNING_CAPTCHA_HOST, fileStream, {
headers: {
'Content-Type': 'wav',
'Authorization': 'Bearer 97e36f7e-340e-4c02-b329-9415faee38c3'
},
timeout: 30 * 1000
}).catch(err => {
console.log(err.code);
console.log(err.stack);
console.log(err.message);
callback([]);
})
if (response === undefined) {
await callback({});
return
}
if (response.status === 200) {
let result = response.data;
console.log(result);
await callback(result);
// console.log("will delete png file: " + fileName);
// await fs.unlink(fileName, (err) => {
// if (err) throw err;
// console.log(fileName + ' was deleted');
// })
} else {
console.log("error");
await callback([]);
}
}
}
module.exports = SlidingCaptchaSolver