// xml-proxy.js import express from 'express'; import puppeteer from 'puppeteer-extra'; import StealthPlugin from 'puppeteer-extra-plugin-stealth'; import he from 'he'; // HTML entity decoder puppeteer.use(StealthPlugin()); const app = express(); const PORT = process.env.PORT || 3000; const PASSWORD = process.env.PASSWORD || '8yug8976tyu7654etdr645etr65etrdyugydt'; app.get('/fetch', async (req, res) => { const { url, password } = req.query; if (password !== PASSWORD) { res.status(403); res.send('Missing password'); return; } if (!url) return res.status(400).send('Missing url parameter'); let browser; try { browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); const page = await browser.newPage(); await page.setUserAgent( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', ); await page.goto(url, { waitUntil: 'networkidle2' }); // Extract escaped XML from
 and decode
		const xml = await page.evaluate(() => {
			const pre = document.querySelector('pre');
			return pre ? pre.innerHTML : document.documentElement.outerHTML;
		});

		const decodedXml = he.decode(xml);

		res.set('Content-Type', 'application/xml; charset=utf-8');
		res.send(decodedXml);
	} catch (err) {
		console.error(err);
		res.status(500).send('Error fetching XML');
	} finally {
		if (browser) await browser.close();
	}
});

app.listen(PORT, () => {
	console.log(`XML Puppeteer proxy listening at http://localhost:${PORT}`);
});