const glob = require('glob'); const fs = require('fs'); const fsExtra = require('fs-extra'); const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); const AdblockerPlugin = require('puppeteer-extra-plugin-adblocker'); const path = require('path'); const cheerio = require('cheerio'); const sanitizeHtml = require('sanitize-html'); const { Network } = require('inspector/promises'); puppeteer.use(StealthPlugin()); puppeteer.use(AdblockerPlugin({ blockTrackers: true })); function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function generateRandomString() { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let result = ''; for (let i = 0; i < 2; i++) { result += characters.charAt(Math.floor(Math.random() * characters.length)); } return result; } function getRandomDelay() { const min = 1 * 1000; // 30 seconds in milliseconds const max = 2 * 1000; // 1 minute in milliseconds return Math.floor(Math.random() * (max - min + 1)) + min; } async function processFiles() { const files = glob.sync('html/**/*.html'); console.log(`Found ${files.length} HTML files in html folder`); for (let i = 0; i < files.length; i++) { const fileName = files[i]; let browser; try { if (!fileName.endsWith('.html')) { console.log(`Skipping non-HTML file: ${fileName}`); continue; } // Read HTML content const htmlContent = fs.readFileSync(fileName, 'utf-8'); let sanitizedContent = sanitizeHtml(htmlContent, { allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'span', 'section', 'div', 'ul', 'ol', 'li', 'br', 'strong', 'em']), allowedAttributes: { '*': ['class', 'id', 'style'], 'img': ['src', 'alt'], 'a': ['href', 'title'] }, disallowedTagsMode: 'discard', allowedSchemes: ['http', 'https'], allowedIframeHostnames: [], allowVulnerableTags: false }); console.log(`Sanitized content for ${fileName} (first 500 chars):\n${sanitizedContent.slice(0, 500)}`); let innerContent; try { const $ = cheerio.load(sanitizedContent); innerContent = $('div.post-content').html() || $('section.topic-content').html() || $('body').html().trim(); } catch (parseErr) { console.error(`Failed to parse HTML for ${fileName}. First 500 chars of sanitized HTML:\n${sanitizedContent.slice(0, 500)}\nError: ${parseErr}`); throw new Error(`HTML parsing failed: ${parseErr.message}`); } if (!innerContent) { console.warn(`No content found in ${fileName}, skipping`); continue; } const randomString = generateRandomString(); innerContent = innerContent.replace(/MOKA/g, randomString); sanitizedContent = sanitizedContent.replace(/MOKA/g, randomString); const baseFileName = path.basename(fileName, '.html'); const subjectFileName = baseFileName.replace(/MOKA/g, randomString); let postContent = innerContent; console.log(`Processing file: ${fileName}, Content length: ${postContent.length}`); console.log('Launching browser...'); try { browser = await puppeteer.launch({ headless: false, userDataDir: './chrome-session', executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-web-security', '--disable-features=IsolateOrigins,site-per-process', '--window-size=1920,1080', '--window-position=0,0' ] }); console.log('Browser launched successfully.'); } catch (launchErr) { console.error('Failed to launch browser:', launchErr); throw new Error(`Browser launch failed: ${launchErr.message}`); } const page = await browser.newPage(); try { console.log('Navigating to chess.com forum page...'); await page.goto('https://aetherhub.com/Deck/MyDecks/', { timeout: 180000, waitUntil: 'networkidle2' }); console.log('Successfully loaded chess.com forum page.'); } catch (err) { console.error(`Failed to load chess.com page: ${err}`); throw new Error('Failed to load chess.com page.'); } async function debugPage(page) { const html = await page.content(); fs.writeFileSync(`debug_${path.basename(fileName, '.html')}.html`, html); console.log(`Saved page HTML for debugging: debug_${path.basename(fileName, '.html')}.html`); } try { await page.waitForSelector('[id="NewDeck_Name"]', { visible: true, timeout: 60000 }); await page.type('[id="NewDeck_Name"]', subjectFileName); console.log(`Entered file name '${subjectFileName}' for ${fileName} into subject field.`); } catch (err) { console.error(`Selector '[id="NewDeck_Name"]' not found for ${fileName}: ${err}`); await debugPage(page, fileName); throw err; } await page.waitForSelector('button[data-id="NewDeck_DeckType"]', { visible: true, timeout: 60000 }); await page.click('button[data-id="NewDeck_DeckType"]'); console.log('Clicked the dropdown button.'); await page.waitForSelector('div.dropdown-menu.show div.inner.show ul.dropdown-menu.inner.show li a span.text', { visible: true, timeout: 60000 }); const options = await page.$$('div.dropdown-menu.show div.inner.show ul.dropdown-menu.inner.show li a span.text'); for (const option of options) { const text = await page.evaluate(el => el.textContent.trim(), option); if (text === 'Brawl') { const parentLink = await option.evaluateHandle(el => el.parentElement); await parentLink.click(); console.log('Selected "Brawl" from the dropdown.'); break; } } console.log('Selected "Brawl" from the dropdown.'); await page.waitForSelector('body > div.wrapper > div.ae-inner-content-wrapper > div > div.row.pt-2 > div.col-md-12.col-lg-8.pl-0.pr-0.order-1.order-lg-1 > div.card > div.card-body.pt-2.pb-1 > form > div:nth-child(3) > div > button', { visible: true, timeout: 60000 }); await page.click('body > div.wrapper > div.ae-inner-content-wrapper > div > div.row.pt-2 > div.col-md-12.col-lg-8.pl-0.pr-0.order-1.order-lg-1 > div.card > div.card-body.pt-2.pb-1 > form > div:nth-child(3) > div > button'); await delay(3000); // Wait for the #editNotes button to be visible and enabled await page.waitForSelector('[id="editNotes"]', { visible: true, timeout: 60000 }); await page.waitForFunction( () => { const button = document.querySelector('[id="editNotes"]'); return button && button.offsetParent !== null && !button.disabled; }, { timeout: 60000 } ); console.log('Edit Notes button is visible and enabled.'); // Retry clicking the #editNotes button until the TinyMCE iframe opens let iframeVisible = false; const maxAttempts = 3; for (let attempt = 1; attempt <= maxAttempts; attempt++) { try { console.log(`Attempt ${attempt} to click Edit Notes button and open TinyMCE iframe...`); await page.click('[id="editNotes"]'); // Wait for the TinyMCE iframe to be visible await page.waitForSelector('iframe#comment_ifr', { visible: true, timeout: 10000 }); iframeVisible = true; console.log('TinyMCE iframe is visible.'); break; // Success, exit the loop } catch (err) { console.warn(`Attempt ${attempt} failed to open TinyMCE iframe: ${err}`); if (attempt === maxAttempts) { throw new Error(`Failed to open TinyMCE iframe after ${maxAttempts} attempts: ${err}`); } await delay(2000); // Wait 2 seconds before retrying } } if (!iframeVisible) { throw new Error('TinyMCE iframe did not become visible after clicking Edit Notes button.'); } // Small delay to ensure the iframe is fully initialized await delay(1000); // Enter content into TinyMCE iframe (only the inner HTML content, not the filename) try { console.log(`postContent for ${fileName}:\n${postContent}`); // Log for debugging const frame = await page.frames().find(f => f.name() === 'comment_ifr'); if (!frame) throw new Error('TinyMCE iframe not found'); await frame.evaluate((content) => { const editor = document.querySelector('body#tinymce'); editor.innerHTML = content; // Directly inject the HTML content }, postContent); console.log(`Entered content for ${fileName} into TinyMCE iframe.`); } catch (err) { console.error(`Failed to enter content for ${fileName}: ${err}`); await debugPage(page, fileName); throw err; } try { await page.waitForSelector('#notesSubmit', { visible: true, timeout: 60000 }); await delay(2000); await page.click('#notesSubmit'); console.log('Clicked "Save" button.'); } catch (err) { console.error(`Failed to click Save button for ${fileName}: ${err}`); await debugPage(page, fileName); throw err; } try { await page.waitForSelector('a.nav-link[title="Visual View"]', { visible: true, timeout: 60000 }); await page.click('a.nav-link[title="Visual View"]'); console.log('Clicked "Visual" link.'); } catch (err) { console.error(`Failed to click Visual link for ${fileName}: ${err}`); await debugPage(page, fileName); throw err; } await delay(2000); const link = await page.evaluate(() => location.href); console.log(`Created OTX pulse: ${link}`); let linkSaved = false; if (files[i].toLowerCase().includes('robux')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free robux</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free robux`); } if (files[i].toLowerCase().includes('bucks')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free v bucks</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free v bucks`); } if (files[i].toLowerCase().includes('coin')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free coin master SPINS</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free coin master SPINS`); } if (files[i].toLowerCase().includes('skin')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free fortnite skins generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free fortnite skins generator`); } if (files[i].toLowerCase().includes('onlyfans')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">onlyfans premium account</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: onlyfans premium account`); } if (files[i].toLowerCase().includes('monopoly')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">monopoly go free dice links</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: monopoly go free dice links`); } if (files[i].toLowerCase().includes('fire')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free fire hack</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free fire hack`); } if (files[i].toLowerCase().includes('clans')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">clash of clans hack</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: clash of clans hack`); } if (files[i].toLowerCase().includes('royale')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">clash royale hack</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: clash royale hack`); } if (files[i].toLowerCase().includes('cash')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free cash app money code</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free cash app money code`); } if (files[i].toLowerCase().includes('brawl')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">brawl stars gems generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: brawl stars gems generator`); } if (files[i].toLowerCase().includes('dragon')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">dragon city generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: dragon city generator`); } if (files[i].toLowerCase().includes('facebook')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">facebook hack account</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: facebook hack account`); } if (files[i].toLowerCase().includes('homescapes')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">homesacpes hack generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: homesacpes hack generator`); } if (files[i].toLowerCase().includes('gplay')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">google play gift card generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: google play gift card generator`); } if (files[i].toLowerCase().includes('psn')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">psn free gift card generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: psn free gift card generator`); } if (files[i].toLowerCase().includes('paypal')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">paypal free money</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: paypal free money`); } if (files[i].toLowerCase().includes('instagram')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">instagram free followers</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: instagram free followers`); } if (files[i].toLowerCase().includes('xbox')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">xbox gift card generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: xbox gift card generator`); } if (files[i].toLowerCase().includes('amazon')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free amazon gift card codes</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free amazon gift card codes`); } if (files[i].toLowerCase().includes('gta')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">gta 5 free money</a>' + '\n'); ladySaved = true; console.log(`Saved link for ${fileName} with label: gta 5 free money`); } if (files[i].toLowerCase().includes('tiktok')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">tiktok free folowers generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: tiktok free folowers generator`); } if (files[i].toLowerCase().includes('imvu')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">imvu free credits generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: imvu free credits generator`); } if (files[i].toLowerCase().includes('itunes')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">itune free gift card generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: itune free gift card generator`); } if (files[i].toLowerCase().includes('legends')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">mobile legends generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: mobile legends generator`); } if (files[i].toLowerCase().includes('speed')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">need for speed no limi hack</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: need for speed no limi hack`); } if (files[i].toLowerCase().includes('netflix')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free netflix account generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free netflix account generator`); } if (files[i].toLowerCase().includes('pixel')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">pixel gun 3d hack</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: pixel gun 3d hack`); } if (files[i].toLowerCase().includes('pubg')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">pubg free uc generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: pubg free uc generator`); } if (files[i].toLowerCase().includes('rebel')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">rebel racing hack tool</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: rebel racing hack tool`); } if (files[i].toLowerCase().includes('valorant')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">valorant free points</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: valorant free points`); } if (files[i].toLowerCase().includes('genshin')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">genshin impact primogems generator</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: genshin impact primogems generator`); } if (files[i].toLowerCase().includes('discord')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">discord nitro free codes</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: discord nitro free codes`); } if (files[i].toLowerCase().includes('steam')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free steam wallet</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free steam wallet`); } if (files[i].toLowerCase().includes('ebay')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">ebay gift card free</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: ebay gift card free`); } if (files[i].toLowerCase().includes('twitch')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">twitch gift card codes</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: twitch gift card codes`); } if (files[i].toLowerCase().includes('best-buy')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">best buy gift card</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: best buy gift card`); } if (files[i].toLowerCase().includes('spotify')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free spotify account</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: free spotify account`); } if (files[i].toLowerCase().includes('java')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">java burn reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: java burn reviews`); } if (files[i].toLowerCase().includes('Puravive')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">puravive reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: puravive reviews`); } if (files[i].toLowerCase().includes('Sumatra')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">Sumatra Slim Belly Tonic reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: Sumatra Slim Belly Tonic reviews`); } if (files[i].toLowerCase().includes('nintendo')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">nintendo gift cards free</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: nintendo gift cards free`); } if (files[i].toLowerCase().includes('amiclear')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">amiclear Reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: amiclear Reviews`); } if (files[i].toLowerCase().includes('dreams')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">dice dreams free rolls</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: dice dreams free rolls`); } if (files[i].toLowerCase().includes('tonic')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">tonic greens Reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: tonic greens Reviews`); } if (files[i].toLowerCase().includes('aizen')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">aizen power Reviews</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: aizen power Reviews`); } if (files[i].toLowerCase().includes('stumble')) { fs.appendFileSync('links.txt', '<a href="'+ link +'">stumble guys free gems</a>' + '\n'); linkSaved = true; console.log(`Saved link for ${fileName} with label: stumble guys free gems`); } if (!linkSaved) { fs.appendFileSync('links.txt', '<a href="'+ link +'">free</a>' + '\n'); console.log(`Saved link for ${fileName} with default label: free`); } await browser.close(); console.log(`Finished processing file: ${fileName}`); } catch (error) { console.error(`Error processing file ${fileName}: ${error}`); if (browser) { try { await browser.close(); } catch (closeErr) { console.error(`Error closing browser for ${fileName}: ${closeErr}`); } } continue; } } console.log('All files have been processed.'); } processFiles().catch(err => { console.error('An error occurred:', err); });