digikala updated
This commit is contained in:
parent
77165d7b4e
commit
7e21601f12
87
digikala.js
87
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 [];
|
||||
|
||||
try {
|
||||
const encodedQuery = encodeURIComponent(query);
|
||||
const url = `https://api.digikala.com/v3/search/?q=${encodedQuery}`;
|
||||
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-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"
|
||||
'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'
|
||||
};
|
||||
|
||||
const response = await fetch(url, { headers });
|
||||
try {
|
||||
const res = await fetch(url, { headers, timeout: 10000 });
|
||||
|
||||
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 };
|
||||
module.exports = { searchDigikala };
|
||||
Loading…
Reference in New Issue