مهدی یوسفی پور
2 سال پیش توسط مهدی یوسفی پور مطرح شد
16 پاسخ

api محصولات دیجیکالا

سلام
وقت بخیر
کسی از دوستان لینک api محصولات دیجیکالا رو داره ؟
مثل api :
https://www.morvarid-store.ir/api/torob
برای انتقال محصولات از دیجی کالا به سایت دیگه ای میخوام


ثبت پرسش جدید
مهدی یوسفی پور
تخصص : مدیر بازاریابی
@mahdiyousfipour 2 سال پیش مطرح شد
0

api میخوام که محصولات دیجی کالا در اون نشون بده، api صفحه آرشیو محصولات، سایتی که میخوام از دیجی کالا به اون منتقل کنم این طور api میخواد

{
"products": [
{
"title": "مغازه ی جادویی اثر جیمز دوتی",
"price": "130000",
"product_id": "dkg-2000",
"page_url": "https://www.morvarid-store.ir/product/Into the Magic Shop",
"availability": 1,
"off": "0",
"image": "https://www.morvarid-store.ir/upload/image/2024/1b671355e5324c5883f0d31cf945a674.jpg,https://www.morvarid-store.ir/upload/image/2024/482a6ccadc6447cd80fbc2095e4f7765.jpg",
"guarantee": "",
"category": "فانتزی,داستان و رمان,داستان خارجی"
},
{
"title": "به امید دل بستم اثر لنکالی",
"price": "250000",
"product_id": "uk-2001",
"page_url": "https://www.morvarid-store.ir/product/به-امید-دل-بستم-اثر-لنکالی",
"availability": 1,
"off": "0",
"image": "https://www.morvarid-store.ir/upload/image/2024/معرفی کتاب من عاشق امید شدم اثر لنکالی.jpg,https://www.morvarid-store.ir/upload/image/2024/معرفی کتاب من عاشق امید شدم اثر لنکالی1.jpg",
"guarantee": "",
"category": "داستان و رمان,داستان خارجی"
},


سپهر سلیمی مهر
تخصص : full stack developer
@sepehrsalimimehr 2 سال پیش مطرح شد
0

مهدی عزیز سلام امید وارم حالت خوب باشه
نفهمیدم دقیقا کدوم بخش مد نظرت هست اما این هارو برات میزارم امیدوارم به کارت بیاد

دسته بندی محصولات
https://api.digikala.com/v1/categories/notebook-netbook-ultrabook/brands/asus/search/?page=2

اطلاعات محصول
https://api.digikala.com/v2/product/14486886/

سرچ محصولات
https://api.digikala.com/v1/search/?q=%D9%84%D8%A8%D8%A7%D8%B3&page=1


مهدی یوسفی پور
تخصص : مدیر بازاریابی
@mahdiyousfipour 2 سال پیش مطرح شد
0

api میخوام که محصولات دیجی کالا در اون نشون بده، api صفحه آرشیو محصولات، سایتی که میخوام از دیجی کالا به اون منتقل کنم این طور api میخواد

{
"products": [
{
"title": "مغازه ی جادویی اثر جیمز دوتی",
"price": "130000",
"product_id": "dkg-2000",
"page_url": "https://www.morvarid-store.ir/product/Into the Magic Shop",
"availability": 1,
"off": "0",
"image": "https://www.morvarid-store.ir/upload/image/2024/1b671355e5324c5883f0d31cf945a674.jpg,https://www.morvarid-store.ir/upload/image/2024/482a6ccadc6447cd80fbc2095e4f7765.jpg",
"guarantee": "",
"category": "فانتزی,داستان و رمان,داستان خارجی"
},
{
"title": "به امید دل بستم اثر لنکالی",
"price": "250000",
"product_id": "uk-2001",
"page_url": "https://www.morvarid-store.ir/product/به-امید-دل-بستم-اثر-لنکالی",
"availability": 1,
"off": "0",
"image": "https://www.morvarid-store.ir/upload/image/2024/معرفی کتاب من عاشق امید شدم اثر لنکالی.jpg,https://www.morvarid-store.ir/upload/image/2024/معرفی کتاب من عاشق امید شدم اثر لنکالی1.jpg",
"guarantee": "",
"category": "داستان و رمان,داستان خارجی"
},


Majid Goudarzi
تخصص : برنامه نویس
@masterspyware 2 سال پیش آپدیت شد
0

سلام.
شما باید بسته به زبان برنامه نویسی خودتون،از یک الگوی رفت و برگشتی برای اتصال به api استفاده کنید.

مثلا در فریم ورک های جاوا اسکریپت،axios رو داریم.
در لاراول،httpguzzle
و...

همه زبات های برنامه نویسی،از فرمت JSON پشتیبانی میکنن.

مثلا در vue اگر بخوای محصولات دیجیکالا رو نشون بدی باید اینطوری بنویسی:

onMounted(async () => {
  try {
    const response = await axios.get('https://api.digikala.com/v1/incredible-offers/products/?category_id=1&page=1')
    console.log( response.data)
  } catch (error) {
    console.error('Error  data:', error)
  }
})

اینم مثال لاراول:

$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.digikala.com/v1/incredible-offers/products/?category_id=1&page=1');
echo $res->getBody();

رضا
تخصص : برنامه نویس
@remor 1 سال پیش مطرح شد
0

ایده جالبیه


حسن رسولی
@hrcprogrammer 1 سال پیش مطرح شد
0

سلام. چرا این api را که با کد کال می کنیم خطای 403 میده؟
من با httpclient در c# فراخوانی می کنم خطا میده. ولی همین api را با postman جواب میده.
علتش را کسی میدونه؟


روزبهی
@y.rouzbehi74 1 سال پیش مطرح شد
0

سلام وقت بخیر
این مواردی که ارسال کردین همگی خطای 403 میده چطور باید این مورد و رفع کنیم؟


عرشیا محرری
تخصص : تقریبا برنامه نویس بک-اند
@arshia.moharrary 1 سال پیش مطرح شد
0

@y.rouzbehi74 باید توکن احراز هویت رو از سرویس دهنده دریافت کنید


uzer
@uzer98 1 سال پیش مطرح شد
0

این دوستمون راه حل رو پیدا کرده
بهش تو ایتا پیام بدید
@rbkhoram701


حسن رسولی
@hrcprogrammer 1 سال پیش مطرح شد
0

منم پیدا کردم. خصوصی پیام بدید تا بفرستم براتون


روزبهی
@y.rouzbehi74 1 سال پیش مطرح شد
0

سلام امکانش هست راه حل خودتون را ارسال کنید؟


مریم شریفانی
تخصص : دانشجو
@Mariash23.gama 12 ماه پیش مطرح شد
0

عالی بود و مفید


عرفان خلیل زاده
@Erfankhlz 10 ماه پیش آپدیت شد
0

سلام
میشه بگید چطور میشه حل کرد این موضوع پاسخ 403 رو


سارو
@sarowyn 8 ماه پیش آپدیت شد
0

@sepehrsalimimehr
ببخشید میشه بگید این endpoint ها رو از کجا ازش مطلع شدید؟
دیجیکالا برای api documents داره؟ جایی که بشه دید چطور از api استفاده کرد؟ یا چه endpoint هایی وجود داره
یا اگه میشه بگید خودتون از کجا این ها رو پیدا کردید؟


سارو
@sarowyn 8 ماه پیش مطرح شد
0

@arshia.moharrary
سلام وقت بخیر
ببخشید شما میدونید که api documetns وجود داره برای دیجیکالا؟ یا کلا از کجا باید بدونیم چطور از api استفاده کرد؟ endpoint هاش چی هستن؟


مهدی یوسفی پور
تخصص : مدیر بازاریابی
@mahdiyousfipour 8 ماه پیش مطرح شد
0

من برای دریافت اطلاعات محصولات از xpath استفاده کردم.


حسین خالقی نیا
@hossein1150 1 هفته پیش مطرح شد
0

این کد رو cloude نوشت برای دریافت لیست دسته بنده بندی هایی که می‌خوام.
شاید بدردتون خورد

import json
import time

# دسته‌بندی‌های مورد نظر با URL های صحیح
categories = {
    'mobile': {
        'url': 'https://api.digikala.com/v1/categories/mobile-phone/search/',
        'name': 'گوشی موبایل'
    },
    'laptop': {
        'url': 'https://api.digikala.com/v1/categories/notebook-netbook-ultrabook/search/',
        'name': 'لپ تاپ'
    },
    'tablet': {
        'url': 'https://api.digikala.com/v1/categories/tablet/search/',
        'name': 'تبلت'
    }
}

def fetch_products(category_url, category_name, max_pages=5):
    """
    دریافت محصولات از API دیجیکالا
    """
    all_products = []

    print(f"\n{'='*60}")
    print(f"🔍 در حال دریافت محصولات {category_name}...")
    print(f"{'='*60}")

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'application/json',
    }

    for page in range(1, max_pages + 1):
        try:
            # ساخت URL با پارامتر صفحه
            url = f'{category_url}?page={page}'

            print(f"📄 صفحه {page} در حال دریافت...")

            response = requests.get(url, headers=headers, timeout=15)

            if response.status_code == 200:
                data = response.json()

                # بررسی ساختار داده و استخراج محصولات
                products = []

                # حالت اول: data.products
                if 'data' in data and 'products' in data['data']:
                    products = data['data']['products']
                # حالت دوم: products مستقیم
                elif 'products' in data:
                    products = data['products']
                # حالت سوم: data.items
                elif 'data' in data and 'items' in data['data']:
                    products = data['data']['items']

                if products:
                    all_products.extend(products)
                    print(f"  ✅ {len(products)} محصول دریافت شد")
                    print(f"  📊 مجموع تا الان: {len(all_products)} محصول")
                else:
                    print(f"  ⚠️  صفحه {page} محصولی ندارد یا به آخر رسیدیم")
                    break

                # اگر تعداد محصولات کمتر از حد معمول باشه، احتمالا آخرین صفحه است
                if len(products) < 20:
                    print(f"  ℹ️  احتمالا به آخرین صفحه رسیدیم")
                    break

                # تاخیر برای جلوگیری از فشار به سرور
                time.sleep(2)

            elif response.status_code == 404:
                print(f"  ❌ صفحه {page} یافت نشد - احتمالا به انتهای لیست رسیدیم")
                break
            elif response.status_code == 429:
                print(f"  ⏸️  محدودیت نرخ درخواست - صبر میکنیم...")
                time.sleep(10)
                continue
            else:
                print(f"  ❌ خطا در دریافت صفحه {page}: کد {response.status_code}")
                # نمایش بخشی از پاسخ برای دیباگ
                print(f"  📝 پاسخ سرور: {response.text[:200]}")
                break

        except requests.exceptions.Timeout:
            print(f"  ⏱️  درخواست صفحه {page} منقضی شد")
            break
        except requests.exceptions.RequestException as e:
            print(f"  ❌ خطا در درخواست صفحه {page}: {str(e)}")
            break
        except json.JSONDecodeError as e:
            print(f"  ❌ خطا در تجزیه JSON صفحه {page}: {str(e)}")
            break
        except Exception as e:
            print(f"  ❌ خطای غیرمنتظره در صفحه {page}: {str(e)}")
            break

    print(f"\n✨ تعداد کل محصولات {category_name}: {len(all_products)}")
    return all_products

def save_to_json(data, filename):
    """
    ذخیره داده‌ها در فایل JSON
    """
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)

        # محاسبه حجم فایل
        import os
        file_size = os.path.getsize(filename) / 1024  # به کیلوبایت

        print(f"💾 فایل {filename} با موفقیت ذخیره شد ({file_size:.2f} KB)")
        return True
    except Exception as e:
        print(f"❌ خطا در ذخیره فایل {filename}: {str(e)}")
        return False

def extract_product_summary(products):
    """
    استخراج خلاصه اطلاعات محصولات
    """
    summary = []
    for product in products[:5]:  # فقط 5 محصول اول برای نمونه
        try:
            item = {
                'id': product.get('id', 'N/A'),
                'title': product.get('title_fa', product.get('title', 'N/A')),
                'price': product.get('default_variant', {}).get('price', {}).get('selling_price', 0),
                'url': f"https://www.digikala.com/product/dkp-{product.get('id', '')}"
            }
            summary.append(item)
        except:
            continue
    return summary

def main():
    print("\n" + "="*60)
    print("🚀 شروع دریافت محصولات از دیجیکالا")
    print("="*60)

    results_summary = {}

    # دریافت و ذخیره محصولات هر دسته
    for category_key, category_info in categories.items():
        print(f"\n{'🔷'*30}")

        products = fetch_products(
            category_info['url'], 
            category_info['name'],
            max_pages=5  # تعداد صفحات - میتونی تغییرش بدی
        )

        if products:
            filename = f'digikala_{category_key}.json'

            # ساختار داده برای ذخیره
            output_data = {
                'category_name': category_info['name'],
                'category_url': category_info['url'],
                'total_products': len(products),
                'fetch_date': time.strftime('%Y-%m-%d %H:%M:%S'),
                'products': products
            }

            # ذخیره فایل
            if save_to_json(output_data, filename):
                # نمایش نمونه محصولات
                print(f"\n📋 نمونه محصولات {category_info['name']}:")
                summary = extract_product_summary(products)
                for i, item in enumerate(summary, 1):
                    print(f"  {i}. {item['title'][:50]}...")
                    print(f"     💰 قیمت: {item['price']:,} تومان")

                results_summary[category_key] = {
                    'name': category_info['name'],
                    'count': len(products),
                    'file': filename
                }
        else:
            print(f"⚠️  هیچ محصولی برای {category_info['name']} یافت نشد")
            results_summary[category_key] = {
                'name': category_info['name'],
                'count': 0,
                'file': None
            }

        # تاخیر بین دسته‌بندی‌ها
        time.sleep(3)

    # نمایش خلاصه نتایج
    print("\n" + "="*60)
    print("📊 خلاصه نتایج:")
    print("="*60)
    for key, info in results_summary.items():
        status = "✅" if info['count'] > 0 else "❌"
        print(f"{status} {info['name']}: {info['count']} محصول")
        if info['file']:
            print(f"   📁 فایل: {info['file']}")

    print("\n" + "="*60)
    print("🎉 عملیات با موفقیت پایان یافت!")
    print("="*60)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n\n⚠️  برنامه توسط کاربر متوقف شد")
    except Exception as e:
        print(f"\n\n❌ خطای کلی: {str(e)}")

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام