attribute automatically the port
This commit is contained in:
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
"node-wget": "^0.4.3",
|
"node-wget": "^0.4.3",
|
||||||
"node-xlsx": "^0.21.0",
|
"node-xlsx": "^0.21.0",
|
||||||
"playwright": "^1.32.1",
|
"playwright": "^1.32.1",
|
||||||
"puppeteer": "^1.13.0",
|
"puppeteer": "^1.20.0",
|
||||||
"ws": "^6.2.0",
|
"ws": "^6.2.0",
|
||||||
"read-ini-file": "^3.0.1",
|
"read-ini-file": "^3.0.1",
|
||||||
"uuid": "^9.0.0",
|
"uuid": "^9.0.0",
|
||||||
|
|||||||
+32
-9
@@ -4,6 +4,7 @@ const CommandorPage = require("./workers/CommandorPage");
|
|||||||
const {MongoManager, formatDate} = require("./workers/mongo_manager");
|
const {MongoManager, formatDate} = require("./workers/mongo_manager");
|
||||||
const alert = require('alert');
|
const alert = require('alert');
|
||||||
const schedule = require("node-schedule");
|
const schedule = require("node-schedule");
|
||||||
|
const {execSync} = require("child_process");
|
||||||
|
|
||||||
const mongoManager = new MongoManager();
|
const mongoManager = new MongoManager();
|
||||||
const SEVEN_DAYS_IN_S = 3600 * 24 * 7;
|
const SEVEN_DAYS_IN_S = 3600 * 24 * 7;
|
||||||
@@ -12,7 +13,11 @@ let excelUtil = new ExcelUtil();
|
|||||||
let collectionName = formatDate(new Date())
|
let collectionName = formatDate(new Date())
|
||||||
// device_to_excludes = ["47e7e36b", "e30eb015"]
|
// device_to_excludes = ["47e7e36b", "e30eb015"]
|
||||||
// device_to_excludes = ["47e7e36b"]
|
// device_to_excludes = ["47e7e36b"]
|
||||||
|
// device_to_excludes = ["J4AXB761H2322WJ"]
|
||||||
device_to_excludes = []
|
device_to_excludes = []
|
||||||
|
attributedPorts = []
|
||||||
|
const device_port_info = new Map();
|
||||||
|
startPort = 9000
|
||||||
|
|
||||||
async function filterAlreadyBookedContacts(contactList) {
|
async function filterAlreadyBookedContacts(contactList) {
|
||||||
let alreadyBookedContacts = await mongoManager.getAllSuccessfulItemsForDay(collectionName);
|
let alreadyBookedContacts = await mongoManager.getAllSuccessfulItemsForDay(collectionName);
|
||||||
@@ -25,7 +30,7 @@ async function filterAlreadyBookedContacts(contactList) {
|
|||||||
return contactsToBook;
|
return contactsToBook;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function filterAlreadyAccepteddContacts(contactList) {
|
async function filterAlreadyAcceptedContacts(contactList) {
|
||||||
let alreadyBookedContacts = await mongoManager.getAllAcceptedAppointments();
|
let alreadyBookedContacts = await mongoManager.getAllAcceptedAppointments();
|
||||||
let contactsToBook = [];
|
let contactsToBook = [];
|
||||||
contactList.forEach((contact) => {
|
contactList.forEach((contact) => {
|
||||||
@@ -112,20 +117,19 @@ async function needToBook(contact, mongoManager) {
|
|||||||
return needToBook
|
return needToBook
|
||||||
}
|
}
|
||||||
|
|
||||||
async function startBook(contactPojo, device, selectedStore, audioAnalyse, alertBeep) {
|
async function startBook(contactPojo, device, selectedStore, audioAnalyse, alertBeep, port) {
|
||||||
console.log(`model: ${device.model()}`);
|
console.log(`model: ${device.model()}`);
|
||||||
console.log(`serial: ${device.serial()}`);
|
console.log(`serial: ${device.serial()}`);
|
||||||
if (await needToBook(contactPojo, mongoManager)) {
|
if (await needToBook(contactPojo, mongoManager)) {
|
||||||
let commandor = new CommandorPage(contactPojo, device, mongoManager, selectedStore, audioAnalyse, alertBeep);
|
let commandor = new CommandorPage(contactPojo, device, mongoManager, selectedStore, audioAnalyse, alertBeep, port);
|
||||||
//read contacts form excel
|
//read contacts form excel
|
||||||
let port = 9222;
|
return await commandor.loadPage();
|
||||||
return await commandor.loadPage(port);
|
|
||||||
} else {
|
} else {
|
||||||
console.log("do not send request --> skip")
|
console.log("do not send request --> skip")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function startWithList(contacts, device, selectedStore, audioAnalyse, alertBeep) {
|
async function startWithList(contacts, device, selectedStore, audioAnalyse, alertBeep, port) {
|
||||||
let duplicatedList = [].concat(contacts).concat(contacts).concat(contacts)
|
let duplicatedList = [].concat(contacts).concat(contacts).concat(contacts)
|
||||||
// let duplicatedList = [].concat(contacts)
|
// let duplicatedList = [].concat(contacts)
|
||||||
await duplicatedList.reduce(async (promise, contactPojo) => {
|
await duplicatedList.reduce(async (promise, contactPojo) => {
|
||||||
@@ -133,7 +137,7 @@ async function startWithList(contacts, device, selectedStore, audioAnalyse, aler
|
|||||||
// The first iteration uses an already resolved Promise
|
// The first iteration uses an already resolved Promise
|
||||||
// so, it will immediately continue.
|
// so, it will immediately continue.
|
||||||
await promise;
|
await promise;
|
||||||
const contents = await startBook(contactPojo, device, selectedStore, audioAnalyse, alertBeep);
|
const contents = await startBook(contactPojo, device, selectedStore, audioAnalyse, alertBeep, port);
|
||||||
console.log(contents);
|
console.log(contents);
|
||||||
}, Promise.resolve());
|
}, Promise.resolve());
|
||||||
}
|
}
|
||||||
@@ -161,9 +165,26 @@ async function startBookWithNumbers(startNumber, endNumber, selectedStore, pathT
|
|||||||
alert("联系人数为0")
|
alert("联系人数为0")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function startForwordingForDevice(device) {
|
||||||
|
const execSync = require('child_process').execSync;
|
||||||
|
// 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'
|
||||||
|
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'
|
||||||
|
console.log('Output was:\n', output);
|
||||||
|
}
|
||||||
|
return attributedPort
|
||||||
|
}
|
||||||
|
|
||||||
mongoManager.connect().then(r => {
|
mongoManager.connect().then(r => {
|
||||||
filterAlreadyBookedContacts(contactList).then((listToBook) => {
|
filterAlreadyBookedContacts(contactList).then((listToBook) => {
|
||||||
filterAlreadyAccepteddContacts(listToBook).then(notAcceptedContacts => {
|
filterAlreadyAcceptedContacts(listToBook).then(notAcceptedContacts => {
|
||||||
filterBlacklistedContacts(notAcceptedContacts).then(listWithoutBlackContact => {
|
filterBlacklistedContacts(notAcceptedContacts).then(listWithoutBlackContact => {
|
||||||
console.log("number of contacts to book:" + listWithoutBlackContact.length)
|
console.log("number of contacts to book:" + listWithoutBlackContact.length)
|
||||||
android.devices().then((devices) => {
|
android.devices().then((devices) => {
|
||||||
@@ -176,7 +197,9 @@ async function startBookWithNumbers(startNumber, endNumber, selectedStore, pathT
|
|||||||
console.log("connected device number:" + filteredDeviceList.length)
|
console.log("connected device number:" + filteredDeviceList.length)
|
||||||
console.log("segmentNumber:" + segmentNumber)
|
console.log("segmentNumber:" + segmentNumber)
|
||||||
for (let i = 0; i < filteredDeviceList.length; i++) {
|
for (let i = 0; i < filteredDeviceList.length; i++) {
|
||||||
startWithList(listWithoutBlackContact.slice(i * segmentNumber, segmentNumber * (i + 1)), filteredDeviceList[i], selectedStore, audioAnalyse, alertBeep);
|
let device = filteredDeviceList[i];
|
||||||
|
let port = startForwordingForDevice(device)
|
||||||
|
startWithList(listWithoutBlackContact.slice(i * segmentNumber, segmentNumber * (i + 1)), device, selectedStore, audioAnalyse, alertBeep, port);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -68,12 +68,13 @@ function logWithDevice(message, device) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CommandorPage {
|
class CommandorPage {
|
||||||
constructor(contact, device, mongoManager, selectedStore = DEFAULT_STORE, audioAnalyse = false, alertBeep = false) {
|
constructor(contact, device, mongoManager, selectedStore = DEFAULT_STORE, audioAnalyse = false, alertBeep = false, port = 9000) {
|
||||||
this.contact = contact;
|
this.contact = contact;
|
||||||
this.device = device;
|
this.device = device;
|
||||||
this.mongoManager = mongoManager;
|
this.mongoManager = mongoManager;
|
||||||
this.selectedStore = selectedStore;
|
this.selectedStore = selectedStore;
|
||||||
this.choosedStore = selectedStore
|
this.choosedStore = selectedStore;
|
||||||
|
this.port = port;
|
||||||
this.isFillingFields = false;
|
this.isFillingFields = false;
|
||||||
this.isTerminated = false;
|
this.isTerminated = false;
|
||||||
this.audioAnalyse = audioAnalyse;
|
this.audioAnalyse = audioAnalyse;
|
||||||
@@ -86,12 +87,12 @@ class CommandorPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async loadPage(port) {
|
async loadPage() {
|
||||||
// Connect to the device.
|
// Connect to the device.
|
||||||
log("loadPage() called");
|
log("loadPage() called, with port:" + this.port);
|
||||||
try {
|
try {
|
||||||
this.browser = await puppeteer.connect({
|
this.browser = await puppeteer.connect({
|
||||||
browserWSEndpoint: 'ws://127.0.0.1:9002/devtools/browser',
|
browserWSEndpoint: "ws://127.0.0.1:" + this.port + "/devtools/browser",
|
||||||
headless: false, defaultViewport: null
|
headless: false, defaultViewport: null
|
||||||
})
|
})
|
||||||
this.page = await this.browser.newPage();
|
this.page = await this.browser.newPage();
|
||||||
@@ -126,8 +127,6 @@ class CommandorPage {
|
|||||||
log(e)
|
log(e)
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// let element = await this.page.$(':nth-match(:text("rendezvousparis"), 1)')
|
|
||||||
// let element = await this.page.$(':nth-match(:text("rendezvousparis"), 1)')
|
|
||||||
const [button] = await this.page.$x("//a[contains(., 'rendezvousparis')]");
|
const [button] = await this.page.$x("//a[contains(., 'rendezvousparis')]");
|
||||||
console.log("button is " + button)
|
console.log("button is " + button)
|
||||||
if (button) {
|
if (button) {
|
||||||
@@ -365,7 +364,7 @@ class CommandorPage {
|
|||||||
await delay(1000)
|
await delay(1000)
|
||||||
this.captchaSolver = new SolveCaptcha(page);
|
this.captchaSolver = new SolveCaptcha(page);
|
||||||
await this.captchaSolver.start((solution) => {
|
await this.captchaSolver.start((solution) => {
|
||||||
log("solution is: " + solution);
|
logWithDevice("solution is: " + solution, this.device);
|
||||||
if (solution !== ERROR_CAPTCHA_UNSOLVABLE && solution !== TWO_CAPTCHA_CONNECTION_FAILED) {
|
if (solution !== ERROR_CAPTCHA_UNSOLVABLE && solution !== TWO_CAPTCHA_CONNECTION_FAILED) {
|
||||||
try {
|
try {
|
||||||
if (!page.isClosed()) {
|
if (!page.isClosed()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user