117 lines
4.3 KiB
JavaScript
117 lines
4.3 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"
|
|
|
|
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 swipe ${x0} ${y0} ${x1 + width * 0.5} ${y0} ${1000 + 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 |