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);
});