داكس
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)
سجّل الدخول للتعليق.