const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
async function goThere(channel) {
const browser = await puppeteer.launch({
headless: 'new',
executablePath: '/usr/bin/google-chrome-stable',
});
const page = await browser.newPage();
await page.goto(
`https://www.twitch.tv/${channel}`,
{ waitUntil: 'domcontentloaded', timeout: 60000 },
);
await page.evaluate(() => {
localStorage.setItem(
'content-classification-labels-acknowledged',
`{"loggedIn":{},"loggedOut":{"MatureGame":${Date.now() + 86400000}}}`,
);
localStorage.setItem('video-muted', '{"default":false}');
localStorage.setItem('volume', '0.5');
localStorage.setItem('video-quality', '{"default":"160p30"}');
});
await page.setViewport({ width: 1280, height: 720 });
await page.reload({
waitUntil: ['domcontentloaded']
});
return {browser,page};
}
async function seeComments(page) {
await page.waitForSelector(
'div.chat-shell',
{ timeout: 60000 },
);
try {
let chatText = await page.evaluate(() => {
let scrapeComments = [];
const comments = document.querySelectorAll('div.chat-line__message');
comments.forEach(comment => {
const commentAuthor = comment.querySelector('span.chat-line__username span.chat-author__display-name').innerText;
const commentContent = comment.querySelector('span.text-fragment')?.innerText;
scrapeComments.push({ commentAuthor, commentContent });
});
return { 'userComments': scrapeComments };
});
console.log(await chatText);
} catch (err) {
console.log(err.message);
}
}
function delayP(delay) {
return new Promise((resolve, reject) => {
setTimeout(
() => { resolve(1) },
delay,
);
});
}
(async () => {
const channel = 'yogscast';
const runForMs = 3600 * 1000;
const x = await goThere(channel);
const started = Date.now();
while ((Date.now() - started) < runForMs ) {
await seeComments(x.page);
await delayP(5000);
}
await x.browser.close();
})();