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

عدسة-بينتريست

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

عدسة بينتريست بحث بالصور

// كود عدسة بينتريست 
// https://whatsapp.com/channel/0029Vb7Nq294Y9le1aAcTE0D
// تابعو القناة هننشر اكواد تانية "izana,uncel shawaza" 
import axios from 'axios'
import FormData from 'form-data'
import { fileTypeFromBuffer } from 'file-type'
import { generateWAMessageFromContent, proto, prepareWAMessageMedia } from '@whiskeysockets/baileys'

const API_BASE = 'https://engez.a7a.online/api/v1'
const DEC = '*※⋅ ━━ ╼╃⊰🍷⊱╄╾ ━━ ⋅※*'
const BOT = '❄️ 𝑹𝑨𝑮𝑵𝑨 𝑩𝑶𝑻 ❄️'

// رفع الملف إلى Uguu
async function uploadToUguu(buffer, ext) {
    const form = new FormData()
    form.append('files[]', buffer, `file.${ext}`)

    try {
        const response = await axios.post('https://uguu.se/upload.php', form, {
            headers: {
                ...form.getHeaders()
            },
            timeout: 30000
        })

        if (!response.data?.files?.[0]?.url) {
            throw new Error('فشل في رفع الملف')
        }

        return response.data.files[0].url
    } catch (error) {
        throw new Error(`فشل رفع الملف: ${error.message}`)
    }
}

// دالة البحث في Pinterest Lens
async function searchPinterestLens(imageUrl) {
    try {
        const params = new URLSearchParams()
        params.append('imageUrl', imageUrl)

        const response = await axios.get(`${API_BASE}/tools/pinlens?${params.toString()}`, {
            timeout: 60000
        })

        if (!response.data?.success) {
            throw new Error(response.data?.error || 'فشل البحث')
        }

        return response.data.results || []
    } 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 handler = async (m, { conn }) => {
    // التحقق من وجود صورة
    const q = m.quoted
    if (!q || !q.mimetype || !q.mimetype.startsWith('image/')) {
        return m.reply(`${DEC}\n${BOT}\n${DEC}\n❌ يرجى الرد على *صورة* للبحث عن مشابهاتها.`)
    }

    await m.react('⏳')

    try {
        // تحميل الصورة
        const buffer = await q.download()
        if (!buffer || buffer.length === 0) {
            throw new Error('فشل تحميل الصورة')
        }

        await m.react('📤')

        // استخراج نوع الملف
        const fileInfo = await fileTypeFromBuffer(buffer)
        const ext = fileInfo?.ext || 'jpg'

        // رفع الصورة إلى Uguu
        const imageUrl = await uploadToUguu(buffer, ext)
        if (!imageUrl) {
            throw new Error('فشل رفع الصورة')
        }

        await m.react('🔍')

        // البحث في Pinterest
        const results = await searchPinterestLens(imageUrl)

        if (!results || results.length === 0) {
            await m.react('❌')
            return m.reply(`${DEC}\n${BOT}\n${DEC}\n❌ لم يتم العثور على نتائج مشابهة.`)
        }

        // بناء الكاروسيل
        async function createImageMessage(url) {
            try {
                const media = await prepareWAMessageMedia(
                    { image: { url } },
                    { upload: conn.waUploadToServer }
                )
                return media.imageMessage
            } catch (e) {
                return null
            }
        }

        let cards = []
        const displayResults = results.slice(0, 10)

        for (let i = 0; i < displayResults.length; i++) {
            const item = displayResults[i]
            const image = item.image
            if (!image) continue

            const pinnerName = item.pinner?.full_name || item.pinner?.username || 'غير معروف'
            const boardName = item.board?.name || 'غير معروفة'
            const title = item.title || 'بدون عنوان'
            const description = item.description?.trim() || ''
            const createdAt = item.createdAt || 'غير متوفر'
            const saves = item.stats?.saves || 0
            const comments = item.stats?.comments || 0
            const likes = item.stats?.likes || 0

            const caption = `${DEC}
${BOT}
${DEC}
📌 *النتيجة ${i + 1}*
${title !== 'بدون عنوان' ? `📝 *العنوان:* ${title}\n` : ''}👤 *المستخدم:* ${pinnerName}
📂 *اللوحة:* ${boardName}
💾 *الحفظات:* ${formatNumber(saves)}
❤️ *الإعجابات:* ${formatNumber(likes)}
💬 *التعليقات:* ${formatNumber(comments)}
🕒 *التاريخ:* ${createdAt}
${description ? `📄 *الوصف:* ${description.substring(0, 100)}${description.length > 100 ? '...' : ''}` : ''}
${DEC}`.trim()

            const pinLink = item.url || `https://www.pinterest.com/pin/${item.id}/`

            try {
                const imageMessage = await createImageMessage(image)
                if (!imageMessage) continue

                cards.push({
                    body: proto.Message.InteractiveMessage.Body.fromObject({ text: caption }),
                    header: proto.Message.InteractiveMessage.Header.fromObject({
                        title: '',
                        hasMediaAttachment: true,
                        imageMessage
                    }),
                    nativeFlowMessage: proto.Message.InteractiveMessage.NativeFlowMessage.fromObject({
                        buttons: [{
                            name: 'cta_url',
                            buttonParamsJson: JSON.stringify({
                                display_text: '📌 افتح في Pinterest',
                                url: pinLink
                            })
                        }]
                    })
                })
            } catch (cardErr) {
                console.error('❌ فشل بناء كارد:', cardErr.message)
            }
        }

        if (cards.length === 0) {
            await m.react('❌')
            return m.reply(`${DEC}\n${BOT}\n${DEC}\n❌ فشل بناء نتائج البحث.`)
        }

        const finalMessage = generateWAMessageFromContent(m.chat, {
            viewOnceMessage: {
                message: {
                    interactiveMessage: proto.Message.InteractiveMessage.fromObject({
                        header: proto.Message.InteractiveMessage.Header.create({
                            hasMediaAttachment: false
                        }),
                        body: proto.Message.InteractiveMessage.Body.create({
                            text: `${DEC}\n${BOT}\n${DEC}\n📸 *أفضل ${cards.length} نتيجة من Pinterest Lens*`
                        }),
                        footer: proto.Message.InteractiveMessage.Footer.create({
                            text: BOT
                        }),
                        carouselMessage: proto.Message.InteractiveMessage.CarouselMessage.fromObject({
                            cards
                        })
                    })
                }
            }
        }, { quoted: m })

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

    } catch (err) {
        console.error('❌ خطأ:', err)
        await m.react('❌')
        await m.reply(`${DEC}\n${BOT}\n${DEC}\n❌ ${err.message || 'حدث خطأ، حاول مجدداً.'}`)
    }
}

handler.help = ['بينتر-بحث', 'عدسة']
handler.tags = ['search']
handler.command = /^(lens|عدسة|عدسه)$/i

export default handler

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

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