Popcdnsnipper / server.js
ipnshalaby5's picture
Update server.js
340b490 verified
Raw
History Blame Contribute Delete
5.76 kB
const express = require('express');
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const axios = require('axios');
puppeteer.use(StealthPlugin());
const app = express();
const PORT = 7860;
const HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://lovetier.bz/",
"Accept": "*/*"
};
function resolveUrl(url, base) {
try { return new URL(url, base).href; } catch (e) { return url; }
}
app.get('/', async (req, res) => {
const id = req.query.id;
const tsUrlBase64 = req.query.ts;
// 💡 1. مسار تشغيل الفيديو
if (tsUrlBase64) {
try {
const targetTs = Buffer.from(tsUrlBase64, 'base64').toString('utf-8');
const response = await axios({
method: 'get', url: targetTs, headers: HEADERS, responseType: 'stream'
});
res.setHeader('Content-Type', 'video/mp2t');
res.setHeader('Access-Control-Allow-Origin', '*');
response.data.pipe(res);
} catch (err) { res.status(500).send("TS Fetch Error"); }
return;
}
// 💡 2. مسار القناص (تخطي الـ JS)
if (id) {
let browser;
try {
browser = await puppeteer.launch({
headless: "new",
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium',
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-features=IsolateOrigins,site-per-process'
]
});
const page = await browser.newPage();
await page.setExtraHTTPHeaders({ 'Referer': 'https://lovetier.bz/' });
// 💡 الخدعة السحرية: إبطال مفعول حماية الـ Framebuster اللي بتطرد الوركر
await page.evaluateOnNewDocument(() => {
Object.defineProperty(window, 'top', {
get: () => { return {}; } // بنوهمه إننا مش الصفحة الرئيسية
});
});
let m3u8Url = null;
await page.setRequestInterception(true);
page.on('request', request => {
const url = request.url();
if (url.includes('.m3u8')) {
m3u8Url = url;
request.abort(); // خطفنا الرابط! بنوقف التحميل فوراً للسرعة
} else if (['image', 'stylesheet', 'font', 'media'].includes(request.resourceType())) {
request.abort(); // منع تحميل الصور عشان نسرع المعالجة
} else {
request.continue();
}
});
const targetUrl = `https://popcdn.day/player/${id}`;
try {
// زودنا وقت الانتظار عشان بطء معالجات Hugging Face
await page.goto(targetUrl, { waitUntil: 'domcontentloaded', timeout: 20000 });
let checks = 0;
// هنصبر عليه 20 ثانية يفك التشفير
while (!m3u8Url && checks < 40) {
await new Promise(r => setTimeout(r, 500));
checks++;
}
} catch(e) {}
await browser.close();
if (!m3u8Url) {
return res.status(404).send("🛑 Shalaby Node Engine: Stream not found or JS Bypass failed.");
}
// سحب محتوى القائمة وإعادة تشفيرها
const m3u8Response = await axios.get(m3u8Url, { headers: HEADERS });
let m3u8Content = m3u8Response.data;
const finalBaseUrl = m3u8Response.request.res.responseUrl || m3u8Url;
const protocol = req.headers['x-forwarded-proto'] || req.protocol;
const scriptUrl = `${protocol}://${req.get('host')}${req.path}`;
let lines = m3u8Content.split('\n');
let newContent = "";
for (let line of lines) {
line = line.trim();
if (!line) continue;
if (line.startsWith('#EXT-X-KEY:URI=')) {
const keyMatch = line.match(/URI="(.*?)"/);
if (keyMatch && keyMatch[1] && !keyMatch[1].startsWith('data:')) {
const keyUrl = resolveUrl(keyMatch[1], finalBaseUrl);
line = line.replace(keyMatch[1], `${scriptUrl}?ts=${Buffer.from(keyUrl).toString('base64')}`);
}
newContent += line + "\n";
} else if (line.startsWith('#')) {
newContent += line + "\n";
} else {
const tsLink = resolveUrl(line, finalBaseUrl);
newContent += `${scriptUrl}?ts=${Buffer.from(tsLink).toString('base64')}\n`;
}
}
res.setHeader('Content-Type', 'application/vnd.apple.mpegurl');
res.setHeader('Access-Control-Allow-Origin', '*');
res.send(newContent);
} catch (err) {
if (browser) await browser.close();
res.status(500).send("Engine Crash: " + err.message);
}
return;
}
res.send("<h2>🔥 SHALABY FULL NODE.JS SNIPER ONLINE!</h2><p>Usage: add <b>?id=beINAR3</b></p>");
});
app.listen(PORT, () => { console.log(`Shalaby Sniper running on port ${PORT}`); });