Я тренируюсь с безголовым браузером, и я планирую сделать небольшую программу просмотра. Цель состоит в том, чтобы иметь возможность разместить сайт, на котором транслируется поток, и выбрать количество зрителей для отправки в потоке с возможностью увеличения или уменьшения количества без перезапуска приложения.
В настоящее время у меня есть некоторые проблемы с использованием puppeteer-cluster.
1 / Я не могу найти способ обрабатывать количество активных задач одновременно, как добавлять или удалять в любой время. Так сказать мое количество зрителей в этом случае. Будет ли Puppeteer лучше, чем Puppeteer-cluster для моего использования?
2 / Когда задачи кластера go будут работать, если у меня возникнет проблема с таймаутом на единственная задача - это все остальные, которые тоже sh. Как я могу это исправить?
3 / После запуска задачи как убедиться, что она никогда не заканчивается, что средство просмотра находится на странице без обнаружения AFK или что задача завершена.
const {Cluster} = require('puppeteer-cluster');
const vanillaPuppeteer = require('puppeteer')
const {addExtra} = require('puppeteer-extra')
const Stealth = require('puppeteer-extra-plugin-stealth')
async function main() {
const puppeteer = addExtra(vanillaPuppeteer)
puppeteer.use(Stealth())
let viewers = 3;
let live = 'https://a-live-stream.com';
const browserArgs = [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-infobars'
];
const proxies = [
'proxy:port',
'proxy:port',
'proxy:port',
];
let perBrowserOptions = [];
for (let i = 0; i < viewers; i++) {
perBrowserOptions = [...perBrowserOptions, {args: browserArgs.concat(['--proxy-server=' + proxies[i]])}]
}
const cluster = await Cluster.launch({
puppeteerOptions: {
headless: false,
args: browserArgs,
executablePath: 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe'
},
monitor: false,
puppeteer,
concurrency: Cluster.CONCURRENCY_BROWSER,
maxConcurrency: viewers,
perBrowserOptions: perBrowserOptions
});
cluster.on('taskerror', (err, data) => {
console.log(`Error crawling ${data}: ${err.message}`);
});
const viewer = async ({page, data: url}) => {
await page.goto(url, {waitUntil: 'networkidle2'})
const element = await page.$('iframe')
await element.click()
console.log('#Viewer live')
await page.waitFor(3000000)
console.log('#Closed')
};
cluster.queue(live, viewer)
cluster.queue(live, viewer)
cluster.queue(live, viewer)
await cluster.idle()
await cluster.close()
}
main().catch(console.warn)