You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.5 KiB
JavaScript

// 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 <pre> 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}`);
});