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