diff --git a/digikala.js b/digikala.js index 24f742b..c411e4d 100644 --- a/digikala.js +++ b/digikala.js @@ -1,74 +1,59 @@ // digikala.js -const fetch = require("node-fetch"); async function searchDigikala(query, limit = 12) { - if (!query) return []; + if (!query?.trim()) return []; + + const url = `https://api.digikala.com/v3/search/?q=${encodeURIComponent(query.trim())}`; + + const headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36', + 'Accept': 'application/json', + 'Accept-Language': 'fa,en;q=0.9', + 'Referer': 'https://www.digikala.com/', + 'Origin': 'https://www.digikala.com', + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'cors', + 'x-api-client': 'web' + }; try { - const encodedQuery = encodeURIComponent(query); - const url = `https://api.digikala.com/v3/search/?q=${encodedQuery}`; + const res = await fetch(url, { headers, timeout: 10000 }); - const headers = { - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36", - "Accept": "application/json", - "Accept-Language": "fa-IR,fa;q=0.9,en-US;q=0.8,en;q=0.7", - "Referer": `https://www.digikala.com/search/?q=${encodedQuery}`, - "Origin": "https://www.digikala.com" - }; - - const response = await fetch(url, { headers }); - - if (!response.ok) { - console.error(`❌ Digikala API error: ${response.status} ${response.statusText}`); + if (!res.ok) { + console.error(`❌ API Error: ${res.status} ${res.statusText}`); return []; } - const data = await response.json(); + const data = await res.json(); - // 🔥 مسیر واقعی بر اساس داده شما: data.widgets[0].data.products - const products = data?.widgets?.[0]?.data?.products || []; - - if (!Array.isArray(products) || products.length === 0) { - console.log("⚠️ No products found in Digikala API response (widgets[0].data.products is empty or not array)"); + // Navigate to product list + const widgets = data?.data?.widgets?.[0]; + if (!widgets || widgets.type !== 'vertical_product_listing') { + console.warn('⚠️ Unexpected widget structure'); return []; } - return products.slice(0, limit).map(item => { - const title = item.title_fa || "بدون عنوان"; - const price = item.default_variant?.price?.selling_price || null; - const formattedPrice = price !== null - ? new Intl.NumberFormat('fa-IR').format(price) + " تومان" - : "—"; + const productWidgets = widgets.data?.widgets || []; + const products = productWidgets + .filter(w => w.type === 'product') + .map(w => w.data) + .slice(0, limit) + .map(p => ({ + id: p.id, + title: p.title_fa || 'بدون عنوان', + image: p.images?.main?.url?.[0] || 'https://dkstatics-public.digikala.com/digikala-products/default.jpg?x-oss-process=image/resize,m_lfit,h_150,w_150', + rrpPrice: p.default_variant?.price?.sellingPrice || null, + sellingPrice: p.default_variant?.price?.selling_price || null, + discountPercent: p.default_variant?.price?.discount_percent || 0, + link: 'https://www.digikala.com' + (p.url?.uri || `/product/dkp-${p.id}/`) + })); - // تصویر: url یک آرایه است → اولین عنصر - let image = "https://via.placeholder.com/150"; - if (Array.isArray(item.images?.main?.url) && item.images.main.url.length > 0) { - image = item.images.main.url[0].replace(/\s+/g, ''); - } - - const link = item.url?.uri - ? `https://www.digikala.com${item.url.uri}` - : `https://www.digikala.com/product/dkp-${item.id}/`; - - return { - id: item.id, - title, - price: formattedPrice, - image, - link, - description: "" - }; - }); + return products; } catch (err) { - console.error("🔴 Digikala search error:", err.message); + console.error('🔴 Fetch error:', err.message); return []; } } -// برای جلوگیری از خطا در server.cjs -async function getProductById() { - return null; -} - -module.exports = { searchDigikala, getProductById }; \ No newline at end of file +module.exports = { searchDigikala }; \ No newline at end of file