Spaces:
Runtime error
Runtime error
| 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}`); }); | |