image_crawler/digikala.js

74 lines
2.6 KiB
JavaScript

// digikala.js
const fetch = require("node-fetch");
async function searchDigikala(query, limit = 12) {
if (!query) return [];
try {
const encodedQuery = encodeURIComponent(query);
const url = `https://api.digikala.com/v3/search/?q=${encodedQuery}`;
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}`);
return [];
}
const data = await response.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)");
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) + " تومان"
: "—";
// تصویر: 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: ""
};
});
} catch (err) {
console.error("🔴 Digikala search error:", err.message);
return [];
}
}
// برای جلوگیری از خطا در server.cjs
async function getProductById() {
return null;
}
module.exports = { searchDigikala, getProductById };