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

facebook-sh-dl

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

بحث وتحميل ريلزات من فيس

// فيس بحث وتحميل
// https://whatsapp.com/channel/0029Vb7Nq294Y9le1aAcTE0D
// تابعو القناة هننشر اكواد تانية "izana,uncel shawaza" 
import axios from 'axios'
import { generateWAMessageFromContent, proto, prepareWAMessageMedia } from '@whiskeysockets/baileys'

const API_BASE = 'https://engez.a7a.online/api/v1'

// دالة البحث في فيسبوك
async function searchFacebook(query) {
    try {
        const params = new URLSearchParams({ q: query })
        const response = await axios.get(`${API_BASE}/search/facebook?${params.toString()}`, {
            timeout: 30000
        })
        if (!response.data?.success) {
            throw new Error(response.data?.error || 'فشل البحث')
        }
        return response.data.results || []
    } catch (error) {
        throw new Error(error.message || 'فشل الاتصال')
    }
}

// دالة تحميل من فيسبوك
async function downloadFacebook(url) {
    try {
        const params = new URLSearchParams({ url })
        const response = await axios.get(`${API_BASE}/download/facebook?${params.toString()}`, {
            timeout: 60000
        })
        if (!response.data?.success) {
            throw new Error(response.data?.error || 'فشل التحميل')
        }
        return response.data.response
    } catch (error) {
        throw new Error(error.message || 'فشل الاتصال')
    }
}

// دالة تنسيق الأرقام
function formatNumber(num) {
    if (!num) return '0'
    if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M'
    if (num >= 1000) return (num / 1000).toFixed(1) + 'K'
    return num.toString()
}

const FOOTER = '🎬 Facebook Downloader'
const DEFAULT_IMAGE = 'https://i.postimg.cc/w1Ln04gV/upload-1775306108949.jpg'

// دالة إنشاء فيديو للكاروسيل
async function createVideo(url, conn) {
    try {
        const _media_ = await prepareWAMessageMedia({
            video: { url: url }
        }, {
            upload: conn.waUploadToServer
        })
        return _media_.videoMessage
    } catch (e) {
        console.error('❌ فشل تحميل فيديو:', e.message)
        return null
    }
}

// دالة إنشاء صورة للكاروسيل (احتياطي)
async function createImage(url, conn) {
    try {
        const _media_ = await prepareWAMessageMedia({
            image: { url: url || DEFAULT_IMAGE }
        }, {
            upload: conn.waUploadToServer
        })
        return _media_.imageMessage
    } catch (e) {
        const _media_ = await prepareWAMessageMedia({
            image: { url: DEFAULT_IMAGE }
        }, {
            upload: conn.waUploadToServer
        })
        return _media_.imageMessage
    }
}

const handler = async (m, { conn, text, usedPrefix, command }) => {
    if (!text) {
        return m.reply(
            '🎬 *تحميل من فيسبوك*\n\n' +
            '📌 *الأوامر:*\n' +
            `• ${usedPrefix}${command} <رابط> - تحميل فيديو\n` +
            `• ${usedPrefix}${command} <بحث> - بحث عن فيديوهات\n\n` +
            '📌 *مثال:*\n' +
            `${usedPrefix}${command} https://www.facebook.com/reel/xxx\n` +
            `${usedPrefix}${command} anime edit`
        )
    }

    await m.react('⏳')

    try {
        const isUrl = text.includes('facebook.com') || text.includes('fb.com')

        if (isUrl) {
            // ===== معالجة الرابط =====
            const data = await downloadFacebook(text)

            if (!data) {
                throw new Error('لم يتم العثور على فيديو')
            }

            // إرسال الفيديو بجودة HD إن وجدت
            const videoUrl = data.hd || data.sd
            if (videoUrl) {
                await conn.sendMessage(m.chat, {
                    video: { url: videoUrl },
                    caption: `✅ *تم التحميل*\n📺 ${data.title?.substring(0, 80) || 'فيديو فيسبوك'}\n📥 الجودة: ${data.hd ? 'HD' : 'SD'}`
                }, { quoted: m })
                await m.react('✅')
            } else {
                throw new Error('لا يوجد رابط فيديو')
            }

        } else {
            // ===== معالجة البحث =====
            const results = await searchFacebook(text)

            if (results.length === 0) {
                throw new Error('لا توجد نتائج')
            }

            // أخذ أول 3 نتائج فقط
            const topResults = results.slice(0, 3)

            // بناء كاروسيل الفيديوهات
            let cards = []
            let count = 1

            for (const video of topResults) {
                try {
                    // جلب رابط التحميل
                    const downloadData = await downloadFacebook(video.reelUrl)
                    const videoUrl = downloadData?.hd || downloadData?.sd

                    if (!videoUrl) continue

                    const videoMessage = await createVideo(videoUrl, conn)
                    if (!videoMessage) continue

                    const card = {
                        body: proto.Message.InteractiveMessage.Body.fromObject({
                            text: 
                                `🎬 *فيديو ${count++}*\n` +
                                `👤 ${video.creator || 'مجهول'}\n` +
                                `👁️ ${formatNumber(video.views)} مشاهدة\n` +
                                `🔗 ${video.reelUrl}`
                        }),
                        footer: proto.Message.InteractiveMessage.Footer.fromObject({
                            text: FOOTER
                        }),
                        header: proto.Message.InteractiveMessage.Header.fromObject({
                            title: `🎬 فيديو ${count - 1}`,
                            hasMediaAttachment: true,
                            videoMessage: videoMessage
                        }),
                        nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
                            buttons: [
                                {
                                    name: "cta_url",
                                    buttonParamsJson: JSON.stringify({
                                        display_text: "📺 فتح على فيسبوك",
                                        url: video.reelUrl
                                    })
                                }
                            ]
                        })
                    }
                    cards.push(card)
                } catch (e) {
                    console.error('❌ خطأ في بناء كارد الفيديو:', e.message)
                }
            }

            if (cards.length === 0) {
                throw new Error('فشل في تحميل الفيديوهات')
            }

            const finalMessage = generateWAMessageFromContent(m.chat, {
                viewOnceMessage: {
                    message: {
                        messageContextInfo: {
                            deviceListMetadata: {},
                            deviceListMetadataVersion: 2
                        },
                        interactiveMessage: {
                            body: proto.Message.InteractiveMessage.Body.create({
                                text: `🔍 *نتائج البحث عن:* ${text}\n📊 *عدد النتائج:* ${results.length}\n📥 عرض أول ${cards.length} فيديو`
                            }),
                            footer: proto.Message.InteractiveMessage.Footer.create({
                                text: FOOTER
                            }),
                            header: proto.Message.InteractiveMessage.Header.create({
                                hasMediaAttachment: false
                            }),
                            carouselMessage: proto.Message.InteractiveMessage.CarouselMessage.fromObject({
                                cards
                            })
                        }
                    }
                }
            }, {})

            await conn.relayMessage(m.chat, finalMessage.message, { messageId: finalMessage.key.id })
            await m.react('✅')
        }

    } catch (error) {
        console.error('❌ خطأ:', error.message)
        await m.react('❌')
        return m.reply(`❌ *خطأ:* ${error.message}`)
    }
}

handler.command = ['فيس', 'facebook', 'fb']
handler.help = ['فيس <رابط/بحث>']
handler.tags = ['downloader']
handler.limit = true

export default handler

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

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