91 lines
2.2 KiB
JavaScript
91 lines
2.2 KiB
JavaScript
const { env } = require('./config.js');
|
|
const puppeteer = require('puppeteer-extra');
|
|
const logger = require('./logger.js');
|
|
|
|
// add stealth plugin and use defaults (all evasion techniques)
|
|
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
|
|
puppeteer.use(StealthPlugin());
|
|
|
|
|
|
function createWebSocketIterator() {
|
|
const queue = [];
|
|
let resolve;
|
|
let done = false;
|
|
|
|
const push = (value) => {
|
|
if (resolve) {
|
|
resolve({ value, done: false });
|
|
resolve = null;
|
|
} else {
|
|
queue.push(value);
|
|
}
|
|
};
|
|
|
|
const close = () => {
|
|
done = true;
|
|
if (resolve) {
|
|
resolve({ value: undefined, done: true });
|
|
resolve = null;
|
|
}
|
|
};
|
|
|
|
const iterator = {
|
|
async next() {
|
|
if (queue.length > 0) {
|
|
return { value: queue.shift(), done: false };
|
|
}
|
|
if (done) {
|
|
return { value: undefined, done: true };
|
|
}
|
|
return new Promise((res) => {
|
|
resolve = res;
|
|
});
|
|
},
|
|
[Symbol.asyncIterator]() {
|
|
return this;
|
|
}
|
|
};
|
|
|
|
(async () => {
|
|
const browser = await puppeteer.launch({ headless: env.HEADLESS });
|
|
const page = await browser.newPage();
|
|
|
|
const client = await page.target().createCDPSession();
|
|
await client.send('Network.enable');
|
|
|
|
client.on('Network.webSocketCreated', ({ requestId, url }) => {
|
|
logger.debug(`webSocketCreated: ${url}`);
|
|
});
|
|
|
|
client.on('Network.webSocketClosed', ({ requestId, timestamp }) => {
|
|
logger.debug(`webSocketClosed: ${requestId}`);
|
|
});
|
|
|
|
client.on('Network.webSocketFrameReceived', ({ requestId, timestamp, response }) => {
|
|
logger.debug('FrameReceived:', response.payloadData);
|
|
push(response.payloadData);
|
|
});
|
|
|
|
client.on('Network.webSocketFrameSent', ({ requestId, timestamp, response }) => {
|
|
logger.debug(`FrameSent: ${response.payloadData}`);
|
|
});
|
|
|
|
await page.goto(env.CB_ROOM);
|
|
await page.setViewport({ width: 1080, height: 1024 });
|
|
|
|
// Optional: close iterator when page closes
|
|
page.on('close', () => {
|
|
close();
|
|
});
|
|
|
|
})().catch((err) => {
|
|
logger.error(`Fatal error: ${err}`);
|
|
close();
|
|
});
|
|
|
|
return iterator;
|
|
}
|
|
|
|
|
|
module.exports = createWebSocketIterator
|