تخطَّ إلى المحتوى
ARAB CODEمجتمع المطورين العرب

داكس

javascriptv1MITنُشر ١٠ أغسطس ٢٠٢٦· ♥ 0 · ⬇ 1 · 💬 0

كود امر ل بوت تليجرام جلب ملفات اي موقع تبيه

const axios = require('axios');
const fs = require('fs');
const path = require('path');
const cheerio = require('cheerio');
const archiver = require('archiver');
const { URL } = require('url');

// دن تم التطوير بواسطه داكس المظ🐦مطور بوت سيراف
// لا تحذف السطرين دول بل حب😭🗿

async function downloadFile(url, outputPath, cookies = '', retries = 2) {
    for (let i = 0; i < retries; i++) {
        try {
            const response = await axios({
                method: 'get',
                url: url,
                responseType: 'arraybuffer',
                timeout: 15000,
                headers: {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0.0.0',
                    'Cookie': cookies
                }
            });
            ensureDir(path.dirname(outputPath));
            fs.writeFileSync(outputPath, response.data);
            return true;
        } catch (_) {
            if (i === retries - 1) return false;
        }
    }
}

function ensureDir(dirPath) {
    if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath, { recursive: true });
    }
}

function toAbsoluteUrl(baseUrl, relative) {
    if (!relative || relative.startsWith('data:') || relative.startsWith('javascript:') || relative.startsWith('#')) return null;
    try {
        return new URL(relative, baseUrl).href;
    } catch (_) {
        return null;
    }
}

module.exports = (bot) => {
    const activeRequests = new Map();

    bot.command('MOK', (ctx) => {
        activeRequests.set(ctx.from.id, true);
        ctx.reply(
            '📥 **تم تفعيل وضع الاستنساخ الشامل (بأسماء الملفات الأصلية بدون تعديل)!**\n' +
            'أرسل رابط الموقع للبدء في تحميل جميع الملفات والمجلدات بأسمائها الحقيقية.\n\n' +
            '💡 *ملاحظة:* أرسل الرابط متبوعاً بـ `COOKIE:` إن كان الموقع يتطلب تسجيل دخول.'
        );
    });

    bot.use(async (ctx, next) => {
        if (ctx.message?.text && activeRequests.has(ctx.from.id)) {
            const input = ctx.message.text.trim();
            activeRequests.delete(ctx.from.id);

            let url = input;
            let userCookies = '';
            if (input.includes('COOKIE:')) {
                const parts = input.split('COOKIE:');
                url = parts[0].trim();
                userCookies = parts[1].trim();
            }

            let statusMsg = await ctx.reply('⏳ جاري جلب ملفات الموقع بأسمائها الأصلية وبدون أي تعديل...');

            const tempDir = path.join(__dirname, 'temp_' + Date.now());
            ensureDir(tempDir);

            try {
                const { data: htmlContent } = await axios.get(url, {
                    headers: {
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/122.0.0.0',
                        'Cookie': userCookies
                    },
                    timeout: 25000
                });

                const baseUrl = url;
                const $ = cheerio.load(htmlContent);
                const downloadedResources = new Map();

                function getLocalPathAndRelative(absoluteUrl, currentFilePath) {
                    const parsed = new URL(absoluteUrl);
                    let pathname = parsed.pathname;

                    let cleanPath = pathname.replace(/^\/+/, '');
                    if (!cleanPath || cleanPath.endsWith('/')) {
                        cleanPath += 'main_page.html';
                    }

                    const localPath = path.join(tempDir, cleanPath);
                    const relativePath = path.relative(path.dirname(currentFilePath), localPath).replace(/\\/g, '/');

                    return { localPath, relativePath };
                }

                const parsedMainUrl = new URL(baseUrl);
                let mainFileName = path.basename(parsedMainUrl.pathname);
                if (!mainFileName || !mainFileName.includes('.')) {
                    mainFileName = 'index_original.html';
                }
                const mainHtmlPath = path.join(tempDir, mainFileName);

                async function processResource(absoluteUrl, currentFilePath) {
                    if (downloadedResources.has(absoluteUrl)) {
                        return downloadedResources.get(absoluteUrl);
                    }

                    const { localPath, relativePath } = getLocalPathAndRelative(absoluteUrl, currentFilePath);
                    const success = await downloadFile(absoluteUrl, localPath, userCookies);

                    if (success) {
                        downloadedResources.set(absoluteUrl, relativePath);

                        const ext = path.extname(localPath).toLowerCase();

                        if (ext === '.css') {
                            try {
                                let cssText = fs.readFileSync(localPath, 'utf8');
                                const urlRegex = /url\((['"]?)([^'"]+?)\1\)/g;
                                let match;

                                while ((match = urlRegex.exec(cssText)) !== null) {
                                    const subUrl = match[2];
                                    const absSubUrl = toAbsoluteUrl(absoluteUrl, subUrl);
                                    if (absSubUrl) {
                                        const subRelPath = await processResource(absSubUrl, localPath);
                                        if (subRelPath) {
                                            cssText = cssText.replace(match[0], `url("${subRelPath}")`);
                                        }
                                    }
                                }
                                fs.writeFileSync(localPath, cssText, 'utf8');
                            } catch (_) {}
                        }

                        return relativePath;
                    }
                    return null;
                }

                const promises = [];

                const selectors = [
                    { selector: 'link', attr: 'href' },
                    { selector: 'script', attr: 'src' },
                    { selector: 'img', attr: 'src' },
                    { selector: 'img', attr: 'data-src' },
                    { selector: 'img', attr: 'srcset' },
                    { selector: 'source', attr: 'src' },
                    { selector: 'video', attr: 'src' },
                    { selector: 'audio', attr: 'src' },
                    { selector: 'iframe', attr: 'src' },
                    { selector: '[style]', attr: 'style' }
                ];

                selectors.forEach(({ selector, attr }) => {
                    $(selector).each((_, el) => {
                        let val = $(el).attr(attr);
                        if (!val) return;

                        if (attr === 'style') {
                            const bgMatch = val.match(/url\((['"]?)([^'"]+?)\1\)/);
                            if (bgMatch) val = bgMatch[2];
                            else return;
                        }

                        if (attr === 'srcset') {
                            val = val.split(',')[0].trim().split(' ')[0];
                        }

                        const absoluteUrl = toAbsoluteUrl(baseUrl, val);
                        if (absoluteUrl) {
                            promises.push(
                                processResource(absoluteUrl, mainHtmlPath).then(newRelPath => {
                                    if (newRelPath) {
                                        if (attr === 'style') {
                                            $(el).attr('style', `background-image: url("${newRelPath}")`);
                                        } else {
                                            $(el).attr(attr, newRelPath);
                                        }
                                    }
                                })
                            );
                        }
                    });
                });

                await Promise.all(promises);

                fs.writeFileSync(mainHtmlPath, $.html(), 'utf8');

                const zipPath = path.join(__dirname, `site_original_${Date.now()}.zip`);
                const output = fs.createWriteStream(zipPath);
                const archive = archiver('zip', { zlib: { level: 9 } });

                await new Promise((resolve, reject) => {
                    output.on('close', resolve);
                    archive.on('error', reject);
                    archive.pipe(output);
                    archive.directory(tempDir, false);
                    archive.finalize();
                });

                await ctx.replyWithDocument(
                    { source: zipPath, filename: `original_site_${Date.now()}.zip` },
                    { caption: '✅ **تم استنساخ جميع الملفات والمجلدات بالأسمآء الأصلية دون أي تعديل بنجاح!**' }
                );

                fs.rmSync(tempDir, { recursive: true, force: true });
                fs.unlinkSync(zipPath);
                await bot.telegram.deleteMessage(ctx.chat.id, statusMsg.message_id).catch(() => {});

            } catch (error) {
                await bot.telegram.deleteMessage(ctx.chat.id, statusMsg.message_id).catch(() => {});
                await ctx.reply(`❌ حدث خطأ أثناء الاستنساخ: ${error.message}`);
                if (fs.existsSync(tempDir)) {
                    fs.rmSync(tempDir, { recursive: true, force: true });
                }
            }
        } else {
            return next();
        }
    });
};

التعليقات (0)

سجّل الدخول للتعليق.