0
    0
    ๆ‚จ็š„่ดญ็‰ฉ่ฝฆ
    ๆ‚จ็š„่ดญ็‰ฉ่ฝฆไธบ็ฉบ

        KT้›ช่Œ„APIไฝฟ็”จๆ–‡ๆกฃ

        ็ฎ€ไป‹

        KT้›ช่Œ„APIๆไพ›ไบ†ไธ€็งๅฎ‰ๅ…จใ€้ซ˜ๆ•ˆ็š„ๆ–นๅผๆฅ่ฎฟ้—ฎๆˆ‘ไปฌ็š„ไบงๅ“ๆ•ฐๆฎๅบ“ใ€‚้€š่ฟ‡่ฟ™ไธชAPI๏ผŒๆ‚จๅฏไปฅๆŸฅ่ฏขๆˆ‘ไปฌ็š„้›ช่Œ„ไบงๅ“็›ฎๅฝ•๏ผŒ่Žทๅ–่ฏฆ็ป†็š„ไบงๅ“ไฟกๆฏ๏ผŒๅนถๆ นๆฎๅคš็งๆกไปถ่ฟ›่กŒ็ญ›้€‰ใ€‚

        ่ฎค่ฏ

        ๆ‰€ๆœ‰API่ฏทๆฑ‚้ƒฝ้œ€่ฆไฝฟ็”จAPIๅฏ†้’ฅ่ฟ›่กŒ่ฎค่ฏใ€‚่ฏท่”็ณปๆˆ‘ไปฌ่Žทๅ–ๆ‚จ็š„ไธ“็”จAPIๅฏ†้’ฅใ€‚

        ่ฎค่ฏๆ–นๅผ

        ๅœจๆ‰€ๆœ‰API่ฏทๆฑ‚็š„ๅคด้ƒจๆทปๅŠ X-API-Keyๅญ—ๆฎต๏ผš

        X-API-Key: ๆ‚จ็š„APIๅฏ†้’ฅ

        ๅผ€ๅง‹ไฝฟ็”จ

        ็ฌฌไธ€ๆญฅ๏ผšไบ†่งฃๆˆ‘ไปฌ็š„ไบงๅ“็ป“ๆž„

        ๅœจๅผ€ๅง‹ไฝฟ็”จAPIไน‹ๅ‰๏ผŒไบ†่งฃๆˆ‘ไปฌไบงๅ“ๆ•ฐๆฎ็š„็ป“ๆž„ๅพˆ้‡่ฆใ€‚ๆฏไธชไบงๅ“ๅŒ…ๅซไปฅไธ‹ไธป่ฆๅญ—ๆฎต๏ผš

        ๅญ—ๆฎตๅ ๆ่ฟฐ ็คบไพ‹
        id ไบงๅ“ๅ”ฏไธ€ID "1"
        sku ไบงๅ“็ผ–ๅท "537-001"
        product_title ไบงๅ“ๅ็งฐ "537ๆˆˆ็ฌฌๆ‰˜ (20ๆ”ฏ/็›’)"
        product_category ไบงๅ“็ฑปๅˆซ "Non-Cuban ้žๅค" ๆˆ– "Cuban ๅคๅทด"
        brand ๅ“็‰Œ "537" ๆˆ– "ๅคงๅซๆœๅคซ DAVIDOFF"
        main_photo ไธปๅ›พ็‰‡URL "/wp-content/uploads/2024/05/01_743.jpg"
        recommended_retail_price ๅปบ่ฎฎ้›ถๅ”ฎไปท 0
        is_featured ๆ˜ฏๅฆ็‰น่‰ฒไบงๅ“ true ๆˆ– false

        ็ฌฌไบŒๆญฅ๏ผš่Žทๅ–ไบงๅ“ๅˆ†็ฑปๅ’Œๅ“็‰Œๅˆ—่กจ

        ๅˆๆฌกไฝฟ็”จๆ—ถ๏ผŒๅปบ่ฎฎๅ…ˆ่Žทๅ–ๆ‰€ๆœ‰ๅฏ็”จ็š„ไบงๅ“ๅˆ†็ฑปๅ’Œๅ“็‰Œๅˆ—่กจ๏ผŒไปฅไพฟไบ†่งฃๆˆ‘ไปฌ็š„ไบงๅ“็ป„็ป‡็ป“ๆž„ใ€‚

        ่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๅˆ†็ฑป

        GET https://ktcigar.com/wp-json/xyz-api/v1/categories

        ่Žทๅ–ๆ‰€ๆœ‰ๅ“็‰Œ

        GET https://ktcigar.com/wp-json/xyz-api/v1/brands

        ไปฅไธŠ่ฏทๆฑ‚ๅฐ†่ฟ”ๅ›žๆ‰€ๆœ‰ๅฏ็”จ็š„ๅˆ†็ฑปๅ’Œๅ“็‰Œ๏ผŒไปฅๅŠๆฏไธชๅˆ†็ฑปๆˆ–ๅ“็‰Œไธ‹็š„ไบงๅ“ๆ•ฐ้‡ใ€‚่ฟ™ๆœ‰ๅŠฉไบŽๆ‚จไบ†่งฃๆˆ‘ไปฌ็š„ไบงๅ“็ป“ๆž„๏ผŒๅนถ้€‰ๆ‹ฉๅˆ้€‚็š„็ญ›้€‰ๆกไปถใ€‚

        ็ฌฌไธ‰ๆญฅ๏ผš่Žทๅ–ไบงๅ“ๅˆ—่กจ

        ๆœ‰ๅคš็งๆ–นๅผๅฏไปฅ่Žทๅ–ไบงๅ“ๅˆ—่กจ๏ผš

        ่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“๏ผˆๅˆ†้กต๏ผ‰

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?page=1&per_page=20

        ๅ‚ๆ•ฐ่ฏดๆ˜Ž๏ผš

        • page๏ผš้กต็ ๏ผŒไปŽ1ๅผ€ๅง‹
        • per_page๏ผšๆฏ้กตไบงๅ“ๆ•ฐ้‡๏ผŒ้ป˜่ฎค20๏ผŒๆœ€ๅคง100

        ๆŒ‰ไบงๅ“ๅˆ†็ฑป่Žทๅ–ไบงๅ“

        GET https://ktcigar.com/wp-json/xyz-api/v1/products/by-category?category=Cuban ๅคๅทด&page=1&per_page=20

        ๆŒ‰ๅ“็‰Œ่Žทๅ–ไบงๅ“

        GET https://ktcigar.com/wp-json/xyz-api/v1/products/by-brand?brand=ๅคงๅซๆœๅคซ DAVIDOFF&page=1&per_page=20

        ็ฌฌๅ››ๆญฅ๏ผš่Žทๅ–ๅ•ไธชไบงๅ“่ฏฆๆƒ…

        ๅฝ“ๆ‚จ็Ÿฅ้“ไบงๅ“IDๅŽ๏ผŒๅฏไปฅ่Žทๅ–ๅ•ไธชไบงๅ“็š„่ฏฆ็ป†ไฟกๆฏ๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products/1

        ๅ…ถไธญ1ๆ˜ฏไบงๅ“IDใ€‚

        ้ซ˜็บง็ญ›้€‰้€‰้กน

        ๆˆ‘ไปฌ็š„APIๆ”ฏๆŒๅคš็ง้ซ˜็บง็ญ›้€‰้€‰้กน๏ผŒๅธฎๅŠฉๆ‚จ็ฒพ็กฎๅฎšไฝๆ‰€้œ€ไบงๅ“๏ผš

        ๅญ—ๆฎต็ญ›้€‰

        ๆ‚จๅฏไปฅๆŒ‡ๅฎšๅช่ฟ”ๅ›ž็‰นๅฎšๅญ—ๆฎต๏ผŒๅ‡ๅฐ‘ไธๅฟ…่ฆ็š„ๆ•ฐๆฎไผ ่พ“๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?fields=id,sku,product_title,brand,recommended_retail_price

        ๆœ็ดขๅŠŸ่ƒฝ

        ๆ‚จๅฏไปฅ้€š่ฟ‡ๅ…ณ้”ฎ่ฏๆœ็ดขไบงๅ“ๆ ‡้ข˜ใ€SKUๆˆ–ๅ“็‰Œ๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?search=้›ช่Œ„

        ็‰น่‰ฒไบงๅ“็ญ›้€‰

        ๆŸฅๆ‰พ็‰น่‰ฒไบงๅ“๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?featured=1

        ไปทๆ ผ่Œƒๅ›ด็ญ›้€‰

        ๆŒ‰ไปทๆ ผ่Œƒๅ›ด็ญ›้€‰ไบงๅ“๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?min_price=10&max_price=100

        ๆŽ’ๅบ้€‰้กน

        ๆ‚จๅฏไปฅๆŒ‡ๅฎšๆŽ’ๅบๅญ—ๆฎตๅ’Œๆ–นๅ‘๏ผš

        GET https://ktcigar.com/wp-json/xyz-api/v1/products?sort_by=product_title&sort_dir=asc

        ๅฏ็”จๆŽ’ๅบๅญ—ๆฎต๏ผšid, product_title, brand, product_category, recommended_retail_price

        ๅˆ†้กตไธŽๅ“ๅบ”ๅคด

        ๆ‰€ๆœ‰ๅˆ—่กจๅ“ๅบ”้ƒฝๆ”ฏๆŒๅˆ†้กต๏ผŒๅนถๅœจHTTPๅ“ๅบ”ๅคดไธญๅŒ…ๅซๅˆ†้กตไฟกๆฏ๏ผš

        • X-WP-Total๏ผšๆ€ป้กน็›ฎๆ•ฐ
        • X-WP-TotalPages๏ผšๆ€ป้กตๆ•ฐ

        ๅฎŒๆ•ดPythonๆ•ฐๆฎ่Žทๅ–็คบไพ‹

        ไปฅไธ‹ๆ˜ฏไธ€ไธชๅฎŒๆ•ด็š„Python่„šๆœฌ๏ผŒๆผ”็คบๅฆ‚ไฝ•่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๆ•ฐๆฎๅนถไฟๅญ˜ๅˆฐๆœฌๅœฐ๏ผš

        # encoding: utf-8
        """
        KT้›ช่Œ„APIๆ•ฐๆฎ็ˆฌๅ–็คบไพ‹่„šๆœฌ
        ๆญค่„šๆœฌๆผ”็คบๅฆ‚ไฝ•่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๆ•ฐๆฎๅนถไฟๅญ˜ๅˆฐๆœฌๅœฐๆ•ฐๆฎๅบ“ๆˆ–ๆ–‡ไปถ
        """
        
        import requests
        import json
        import time
        import pandas as pd
        import sys
        import os
        from datetime import datetime
        
        # ้…็ฝฎไฟกๆฏ
        API_BASE_URL = "https://ktcigar.com/wp-json/xyz-api/v1"
        API_KEY = "ๆ‚จ็š„APIๅฏ†้’ฅ"  # ๆ›ฟๆขไธบๆ‚จ็š„ๅฎž้™…APIๅฏ†้’ฅ
        SAVE_DIRECTORY = "kt_cigar_data"  # ๆ•ฐๆฎไฟๅญ˜็›ฎๅฝ•
        
        # ไธบๆ‰€ๆœ‰่ฏทๆฑ‚่ฎพ็ฝฎ่ฏทๆฑ‚ๅคด
        HEADERS = {
            "X-API-Key": API_KEY,
            "User-Agent": "KT-Cigar-API-Client/1.0"
        }
        
        # ็กฎไฟๆ•ฐๆฎ็›ฎๅฝ•ๅญ˜ๅœจ
        if not os.path.exists(SAVE_DIRECTORY):
            os.makedirs(SAVE_DIRECTORY)
        
        def make_request(endpoint, params=None):
            """ๅ‘APIๅ‘้€่ฏทๆฑ‚ๅนถ่ฟ”ๅ›žๅ“ๅบ”"""
            url = f"{API_BASE_URL}/{endpoint}"
            
            try:
                response = requests.get(url, headers=HEADERS, params=params, timeout=10)
                
                # ๆฃ€ๆŸฅๆ˜ฏๅฆ่ฏทๆฑ‚ๆˆๅŠŸ
                if response.ok:
                    return response.json(), response.headers
                else:
                    print(f"่ฏทๆฑ‚ๅคฑ่ดฅ: {url}")
                    print(f"็Šถๆ€็ : {response.status_code}")
                    print(f"้”™่ฏฏ: {response.text}")
                    return None, None
            except Exception as e:
                print(f"่ฏทๆฑ‚ๅผ‚ๅธธ: {url}")
                print(f"้”™่ฏฏ: {str(e)}")
                return None, None
        
        def get_all_categories():
            """่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๅˆ†็ฑป"""
            print("ๆญฃๅœจ่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๅˆ†็ฑป...")
            data, _ = make_request("categories")
            
            if data:
                # ไฟๅญ˜ๅˆ†็ฑปๆ•ฐๆฎๅˆฐๆ–‡ไปถ
                filename = os.path.join(SAVE_DIRECTORY, "categories.json")
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(data, f, ensure_ascii=False, indent=2)
                
                print(f"ๆˆๅŠŸ่Žทๅ– {len(data)} ไธชไบงๅ“ๅˆ†็ฑป๏ผŒๅทฒไฟๅญ˜ๅˆฐ {filename}")
                return data
            else:
                print("่Žทๅ–ไบงๅ“ๅˆ†็ฑปๅคฑ่ดฅ")
                return []
        
        def get_all_brands():
            """่Žทๅ–ๆ‰€ๆœ‰ๅ“็‰Œ"""
            print("ๆญฃๅœจ่Žทๅ–ๆ‰€ๆœ‰ๅ“็‰Œ...")
            data, _ = make_request("brands")
            
            if data:
                # ไฟๅญ˜ๅ“็‰Œๆ•ฐๆฎๅˆฐๆ–‡ไปถ
                filename = os.path.join(SAVE_DIRECTORY, "brands.json")
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(data, f, ensure_ascii=False, indent=2)
                
                print(f"ๆˆๅŠŸ่Žทๅ– {len(data)} ไธชๅ“็‰Œ๏ผŒๅทฒไฟๅญ˜ๅˆฐ {filename}")
                return data
            else:
                print("่Žทๅ–ๅ“็‰Œๅคฑ่ดฅ")
                return []
        
        def get_products_by_category(category):
            """่Žทๅ–ๆŒ‡ๅฎšๅˆ†็ฑปไธ‹็š„ๆ‰€ๆœ‰ไบงๅ“"""
            print(f"ๆญฃๅœจ่Žทๅ–ๅˆ†็ฑป '{category}' ไธ‹็š„ไบงๅ“...")
            
            all_products = []
            page = 1
            total_pages = 1
            
            while page <= total_pages:
                # ่Žทๅ–ๅฝ“ๅ‰้กต็š„ไบงๅ“ๆ•ฐๆฎ
                params = {
                    "category": category,
                    "page": page,
                    "per_page": 100  # ๆฏ้กต่Žทๅ–ๆœ€ๅคงๆ•ฐ้‡็š„ไบงๅ“
                }
                
                data, headers = make_request("products", params)
                
                if data and isinstance(data, list):
                    all_products.extend(data)
                    
                    # ่Žทๅ–ๆ€ป้กตๆ•ฐ
                    if 'X-WP-TotalPages' in headers:
                        total_pages = int(headers['X-WP-TotalPages'])
                    
                    print(f"ๅทฒ่Žทๅ–็ฌฌ {page}/{total_pages} ้กต๏ผŒๆœฌ้กตๆœ‰ {len(data)} ไธชไบงๅ“")
                    page += 1
                    
                    # ๆทปๅŠ ๅฐๅปถ่ฟŸ๏ผŒ้ฟๅ…่ฏทๆฑ‚่ฟ‡ไบŽ้ข‘็น
                    time.sleep(0.5)
                else:
                    print(f"่Žทๅ–ๅˆ†็ฑป '{category}' ็š„ไบงๅ“ๅคฑ่ดฅๆˆ–่ฏฅๅˆ†็ฑปไธ‹ๆ— ไบงๅ“")
                    break
            
            # ไฟๅญ˜ๆญคๅˆ†็ฑปไธ‹็š„ไบงๅ“ๅˆฐๆ–‡ไปถ
            if all_products:
                safe_category = category.replace(" ", "_").replace("/", "_")
                filename = os.path.join(SAVE_DIRECTORY, f"products_category_{safe_category}.json")
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(all_products, f, ensure_ascii=False, indent=2)
                
                print(f"ๆˆๅŠŸ่Žทๅ–ๅˆ†็ฑป '{category}' ไธ‹็š„ {len(all_products)} ไธชไบงๅ“๏ผŒๅทฒไฟๅญ˜ๅˆฐ {filename}")
            
            return all_products
        
        def get_products_by_brand(brand):
            """่Žทๅ–ๆŒ‡ๅฎšๅ“็‰Œ็š„ๆ‰€ๆœ‰ไบงๅ“"""
            print(f"ๆญฃๅœจ่Žทๅ–ๅ“็‰Œ '{brand}' ็š„ไบงๅ“...")
            
            all_products = []
            page = 1
            total_pages = 1
            
            while page <= total_pages:
                # ่Žทๅ–ๅฝ“ๅ‰้กต็š„ไบงๅ“ๆ•ฐๆฎ
                params = {
                    "brand": brand,
                    "page": page,
                    "per_page": 100  # ๆฏ้กต่Žทๅ–ๆœ€ๅคงๆ•ฐ้‡็š„ไบงๅ“
                }
                
                data, headers = make_request("products", params)
                
                if data and isinstance(data, list):
                    all_products.extend(data)
                    
                    # ่Žทๅ–ๆ€ป้กตๆ•ฐ
                    if 'X-WP-TotalPages' in headers:
                        total_pages = int(headers['X-WP-TotalPages'])
                    
                    print(f"ๅทฒ่Žทๅ–็ฌฌ {page}/{total_pages} ้กต๏ผŒๆœฌ้กตๆœ‰ {len(data)} ไธชไบงๅ“")
                    page += 1
                    
                    # ๆทปๅŠ ๅฐๅปถ่ฟŸ๏ผŒ้ฟๅ…่ฏทๆฑ‚่ฟ‡ไบŽ้ข‘็น
                    time.sleep(0.5)
                else:
                    print(f"่Žทๅ–ๅ“็‰Œ '{brand}' ็š„ไบงๅ“ๅคฑ่ดฅๆˆ–่ฏฅๅ“็‰Œไธ‹ๆ— ไบงๅ“")
                    break
            
            # ไฟๅญ˜ๆญคๅ“็‰Œไธ‹็š„ไบงๅ“ๅˆฐๆ–‡ไปถ
            if all_products:
                safe_brand = brand.replace(" ", "_").replace("/", "_")
                filename = os.path.join(SAVE_DIRECTORY, f"products_brand_{safe_brand}.json")
                with open(filename, 'w', encoding='utf-8') as f:
                    json.dump(all_products, f, ensure_ascii=False, indent=2)
                
                print(f"ๆˆๅŠŸ่Žทๅ–ๅ“็‰Œ '{brand}' ็š„ {len(all_products)} ไธชไบงๅ“๏ผŒๅทฒไฟๅญ˜ๅˆฐ {filename}")
            
            return all_products
        
        def get_all_products():
            """่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“๏ผˆๅˆ†้กต่Žทๅ–๏ผ‰"""
            print("ๆญฃๅœจ่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“...")
            
            all_products = []
            page = 1
            total_pages = 1
            
            while page <= total_pages:
                params = {
                    "page": page,
                    "per_page": 100  # ๆฏ้กต่Žทๅ–ๆœ€ๅคงๆ•ฐ้‡็š„ไบงๅ“
                }
                
                data, headers = make_request("products", params)
                
                if data and isinstance(data, list):
                    all_products.extend(data)
                    
                    # ่Žทๅ–ๆ€ป้กตๆ•ฐ
                    if 'X-WP-TotalPages' in headers:
                        total_pages = int(headers['X-WP-TotalPages'])
                    
                    print(f"ๅทฒ่Žทๅ–็ฌฌ {page}/{total_pages} ้กต๏ผŒๆœฌ้กตๆœ‰ {len(data)} ไธชไบงๅ“")
                    page += 1
                    
                    # ๆทปๅŠ ๅฐๅปถ่ฟŸ๏ผŒ้ฟๅ…่ฏทๆฑ‚่ฟ‡ไบŽ้ข‘็น
                    time.sleep(0.5)
                else:
                    print("่Žทๅ–ไบงๅ“ๅคฑ่ดฅ")
                    break
            
            # ไฟๅญ˜ๆ‰€ๆœ‰ไบงๅ“ๅˆฐๆ–‡ไปถ
            if all_products:
                # ไฟๅญ˜ไธบJSONๆ ผๅผ
                json_filename = os.path.join(SAVE_DIRECTORY, "all_products.json")
                with open(json_filename, 'w', encoding='utf-8') as f:
                    json.dump(all_products, f, ensure_ascii=False, indent=2)
                
                # ไฟๅญ˜ไธบCSVๆ ผๅผ๏ผŒไพฟไบŽๅœจExcelไธญๆŸฅ็œ‹
                csv_filename = os.path.join(SAVE_DIRECTORY, "all_products.csv")
                df = pd.DataFrame(all_products)
                df.to_csv(csv_filename, index=False, encoding='utf-8-sig')  # ไฝฟ็”จutf-8-sig็ผ–็ ไปฅๆ”ฏๆŒExcelไธญ็š„ไธญๆ–‡
                
                print(f"ๆˆๅŠŸ่Žทๅ–ๆ‰€ๆœ‰ {len(all_products)} ไธชไบงๅ“")
                print(f"ๅทฒไฟๅญ˜ๅˆฐ {json_filename} ๅ’Œ {csv_filename}")
            
            return all_products
        
        def main():
            """ไธปๅ‡ฝๆ•ฐ๏ผŒๆ‰ง่กŒๅฎŒๆ•ด็š„ๆ•ฐๆฎ็ˆฌๅ–่ฟ‡็จ‹"""
            print("======= KT้›ช่Œ„APIๆ•ฐๆฎ็ˆฌๅ– =======")
            print(f"ๅผ€ๅง‹ๆ—ถ้—ด: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
            
            # ็ฌฌไธ€ๆญฅ๏ผš่Žทๅ–ๆ‰€ๆœ‰ๅˆ†็ฑปๅ’Œๅ“็‰Œ
            categories = get_all_categories()
            brands = get_all_brands()
            
            # ็ฌฌไบŒๆญฅ๏ผš่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“
            all_products = get_all_products()
            
            # ็ฌฌไธ‰ๆญฅ๏ผˆๅฏ้€‰๏ผ‰๏ผšๆŒ‰ๅˆ†็ฑป่Žทๅ–ไบงๅ“
            for category in categories:
                category_name = category['name']
                # ๆŸฅ็œ‹ๅˆ†็ฑปไธ‹ไบงๅ“ๆ•ฐ้‡๏ผŒๅฆ‚ๆžœ่พƒๅคšๅˆ™่Žทๅ–
                if category['product_count'] > 0:
                    products = get_products_by_category(category_name)
            
            # ็ฌฌๅ››ๆญฅ๏ผˆๅฏ้€‰๏ผ‰๏ผš่Žทๅ–้ƒจๅˆ†ๅคงๅ“็‰Œ็š„ไบงๅ“
            # ๆ นๆฎไบงๅ“ๆ•ฐ้‡ๆŽ’ๅบ๏ผŒ่Žทๅ–ๆœ€ๅคšไบงๅ“็š„ๅ‰5ไธชๅ“็‰Œ
            top_brands = sorted(brands, key=lambda x: x['product_count'], reverse=True)[:5]
            for brand in top_brands:
                brand_name = brand['name']
                products = get_products_by_brand(brand_name)
            
            print(f"็ป“ๆŸๆ—ถ้—ด: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
            print(f"ๆ‰€ๆœ‰ๆ•ฐๆฎๅทฒไฟๅญ˜ๅˆฐ็›ฎๅฝ•: {os.path.abspath(SAVE_DIRECTORY)}")
            print("======= ๆ•ฐๆฎ็ˆฌๅ–ๅฎŒๆˆ =======")
        
        if __name__ == "__main__":
            main()

        ่„šๆœฌ่ฏดๆ˜Ž

        ไธŠ่ฟฐPython่„šๆœฌๅฏไปฅ๏ผš

        • ่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๅˆ†็ฑปๅ’Œๅ“็‰Œไฟกๆฏ
        • ๅˆ†้กต่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๆ•ฐๆฎ๏ผˆๅ…ฑ4000ๅคšๆก๏ผ‰
        • ๆŒ‰ๅˆ†็ฑปๅ’Œๅ“็‰Œๅˆ†ๅˆซ่Žทๅ–ไบงๅ“
        • ๅฐ†ๆ•ฐๆฎไฟๅญ˜ไธบJSONๅ’ŒCSVๆ ผๅผ๏ผŒไพฟไบŽๅŽ็ปญไฝฟ็”จ
        • ๅค„็†่ฏทๆฑ‚้”™่ฏฏๅ’Œ้™ๅˆถ่ฏทๆฑ‚้ข‘็އ๏ผŒ้ฟๅ…ๅฏนๆœๅŠกๅ™จ้€ ๆˆ่ฟ‡ๅคงๅŽ‹ๅŠ›

        ไฝฟ็”จๆญค่„šๆœฌๅ‰๏ผŒ่ฏท็กฎไฟๅฎ‰่ฃ…ไปฅไธ‹PythonๅŒ…๏ผš

        pip install requests pandas

        ๅ…ถไป–็ผ–็จ‹่ฏญ่จ€็คบไพ‹

        PHP็คบไพ‹

        <?php
        // ่Žทๅ–ไบงๅ“ๅˆ—่กจ
        $api_key = "ๆ‚จ็š„APIๅฏ†้’ฅ";
        $response = wp_remote_get(
            'https://ktcigar.com/wp-json/xyz-api/v1/products?per_page=10&page=1', 
            array(
                'headers' => array(
                    'X-API-Key' => $api_key
                )
            )
        );
        
        if (!is_wp_error($response)) {
            $products = json_decode(wp_remote_retrieve_body($response), true);
            // ๅค„็†ไบงๅ“ๆ•ฐๆฎ...
        }
        ?>

        JavaScript็คบไพ‹

        // ่Žทๅ–ไบงๅ“ๅˆ—่กจ
        const apiKey = "ๆ‚จ็š„APIๅฏ†้’ฅ";
        fetch("https://ktcigar.com/wp-json/xyz-api/v1/products?per_page=10&page=1", {
            headers: {
                "X-API-Key": apiKey
            }
        })
        .then(response => response.json())
        .then(products => {
            // ๅค„็†ไบงๅ“ๆ•ฐๆฎ...
        })
        .catch(error => console.error('Error:', error));

        ๅธธ่ง้—ฎ้ข˜่งฃ็ญ”

        ๅฆ‚ไฝ•่Žทๅ–APIๅฏ†้’ฅ๏ผŸ

        ่ฏท่”็ณปๆˆ‘ไปฌ็š„ๅฎขๆˆทๆœๅŠกๅ›ข้˜Ÿ่Žทๅ–ๆ‚จ็š„ไธ“็”จAPIๅฏ†้’ฅใ€‚

        ๆœ‰ไฝฟ็”จ้™ๅˆถๅ—๏ผŸ

        ๆฏไธชAPIๅฏ†้’ฅๆœ‰ๆฏๅˆ†้’Ÿ่ฏทๆฑ‚ๆฌกๆ•ฐ้™ๅˆถ๏ผŒ่ฏทๅˆ็†ไฝฟ็”จใ€‚

        ๅฆ‚ไฝ•่Žทๅ–ๆ‰€ๆœ‰ไบงๅ“ๆ•ฐๆฎ๏ผŸ

        ็”ฑไบŽๆˆ‘ไปฌๆœ‰ๅคง้‡ไบงๅ“๏ผŒๅปบ่ฎฎไฝฟ็”จๅˆ†้กตๅŠŸ่ƒฝ้€ๆญฅ่Žทๅ–๏ผŒๆˆ–ๆŒ‰ๅˆ†็ฑป/ๅ“็‰Œ่Žทๅ–็‰นๅฎšไบงๅ“ใ€‚่ฏทๅ‚่€ƒไธŠ้ข็š„Python็คบไพ‹ไปฃ็ ใ€‚

        API่ฟ”ๅ›ž็š„้”™่ฏฏ็ ๆœ‰ๅ“ชไบ›๏ผŸ

        ๅธธ่ง้”™่ฏฏ็ ๅŒ…ๆ‹ฌ๏ผš

        • 401๏ผšๆ— ๆ•ˆๆˆ–็ผบๅฐ‘APIๅฏ†้’ฅ
        • 404๏ผšๆœชๆ‰พๅˆฐ่ฏทๆฑ‚็š„่ต„ๆบ
        • 429๏ผš่ถ…่ฟ‡้€Ÿ็އ้™ๅˆถ

        ่”็ณปๆˆ‘ไปฌ

        ๅฆ‚ๆœ‰ไปปไฝ•ๅ…ณไบŽAPIไฝฟ็”จ็š„้—ฎ้ข˜๏ผŒ่ฏท่”็ณปๆˆ‘ไปฌ็š„ๆŠ€ๆœฏๆ”ฏๆŒๅ›ข้˜Ÿใ€‚

        ๆณจๆ„๏ผšๆœฌAPIไป…ไพ›ๆŽˆๆƒ็”จๆˆทไฝฟ็”จ๏ผŒๆœช็ป่ฎธๅฏไธๅพ—ๅˆ†ไบซAPIๅฏ†้’ฅๆˆ–ๆปฅ็”จAPIๆœๅŠกใ€‚

        ๐Ÿ’ก AIๆœ็ดขๅฎŒๅ…จๆŒ‡ๅ—
        ๐Ÿ’ฐ ไปทๆ ผๅนณๆ›ฟ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๆ‰พไพฟๅฎœๆ›ฟไปฃ XX็š„ๅนณๆ›ฟ ่ทŸXXๅทฎไธๅคš ๆฏ”XXไพฟๅฎœ XXๅ˜…ๅนณๅƒน็‰ˆ ๅŒXXๅทฎๅ””ๅคš ๅนณ้ŽXX
        ไปทๆ ผ่Œƒๅ›ด 300-500ๅ— 1000ไปฅๅ†… 100ๅทฆๅณ 300-500่šŠ 1000่šŠๆจ“ไธ‹ 100่šŠๅทฆๅณ
        ๆ€งไปทๆฏ” ๆ€งไปทๆฏ”้ซ˜ ไพฟๅฎœๅฅฝๆŠฝ ็‰ฉ็พŽไปทๅป‰ ๆŠต็Žฉ ๅนณ้šๆญฃ ๅนณไฝ†ๅฅฝ้ฃŸ
        ่ดต/ไพฟๅฎœ ่ดตไธ€็‚น ไพฟๅฎœ็‚น ้ซ˜็ซฏ็š„ ่ฒดๅ•ฒ ๅนณๅ•ฒ ่ฑชๅ•ฒ
        ๅฎŒๆ•ดไพ‹ๅญ (็‚นๅ‡ปๅคๅˆถ):
        Cohibaๅทฎไธๅคš๏ผŒ300ๅ—ๅทฆๅณ Padronๅนณๆ›ฟ๏ผŒๆ€งไปทๆฏ”้ซ˜ 1000ไปฅๅ†…๏ผŒ็‰ฉ็พŽไปทๅป‰
        ๐Ÿ‘… ๅฃๆ„Ÿๅฏนๆฏ”
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ็ฑปไผผๅฃๆ„Ÿ ่ทŸXXๅทฎไธๅคš XX้ฃŽๆ ผ ๅƒXX ๅŒXXๅทฎๅ””ๅคš XX style ้ฃŸ่ฝไผผXX
        ๆ›ดๆต“/ๆ›ดๆทก ๆฏ”XXๆ›ดๆต“ ๆฏ”XXๆ›ดๆทก XXไฝ†้กบๆป‘ ๆฟƒ้ŽXX ๆทก้ŽXX XXไฝ†้ †ๅ•ฒ
        ๆ›ดๅฅฝ/ๅ‡็บง ๆฏ”XXๆ›ดๅฅฝ ๅ‡็บง็‰ˆXX XX้ซ˜็บง็‰ˆ ๅฅฝ้ŽXX ๅ‡็ดš็‰ˆXX XX้ซ˜็ดšๅ•ฒ
        ๆททๆญ้ฃŽๆ ผ ๅคๅทด้ฃŽๆ ผๅฐผๅŠ  XXๅ‘ณ้“YY Cuban style Nica XXๅ‘ณไฝ†YY
        ๅฃๆ„Ÿๅ…ณ้”ฎ่ฏ: ้›ชๆพๅ‘ณใ€ๅฅถๆฒนๅ‘ณใ€่ƒกๆค’ๅ‘ณใ€ๅทงๅ…‹ๅŠ›ๅ‘ณใ€ๅ’–ๅ•กๅ‘ณใ€ๅšๆžœๅ‘ณใ€ๆณฅๅœŸๅ‘ณใ€็šฎ้ฉๅ‘ณใ€ๆœจ้ฆ™ใ€็„ฆ็ณ–ใ€้ฆ™่‰ใ€่Šฑ้ฆ™ใ€ๆžœ้ฆ™
        ๅฎŒๆ•ดไพ‹ๅญ:
        ้›ชๆพๅ‘ณ๏ผŒๅฅถๆฒน้กบๆป‘ Montecristoๅทฎไธๅคšไฝ†ไพฟๅฎœ ๅคๅทด้ฃŽๆ ผๅฐผๅŠ ๏ผŒ300ๅ—
        ๐ŸŽ ้€็คผๅœบๅˆ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ้€่€ๆฟ ้€่€ๆฟ ๅ•†ๅŠก้ซ˜็ซฏ ๆœ‰้ขๅญ ้€่€็ดฐ ๅ…ฌๅธๆ‡‰้…ฌ ๅค ้ข
        ็บฆไผš/ๅฅณๅ‹ ้€ๅฅณๆœ‹ๅ‹ ็บฆไผš็”จ ๆตชๆผซ็‚น ๆ‹ๆ‹–็”จ ๆบๅฅณ gift ๆตชๆผซๅ•ฒ
        ๆœ‹ๅ‹่šไผš ๆœ‹ๅ‹่šไผš ๅ‡ ไธชไบบๆŠฝ friend ่šๆœƒ ๅนพๆขๅ‹ไธ€้ฝŠ
        ๅบ†็ฅ/ๅ•†ๅŠก ็”Ÿๆ—ฅ/็ป“ๅฉš ่ฐˆ็”Ÿๆ„ ็”Ÿๆ—ฅ/็ตๅฉš ๅ‚พ็”Ÿๆ„
        ๅฎŒๆ•ดไพ‹ๅญ:
        ้€่€็ป†๏ผŒ500-800๏ผŒๅคŸ้ข ้€ๅฅณๆœ‹ๅ‹๏ผŒๆตชๆผซ๏ผŒ็คผ็›’ ๆœ‹ๅ‹่šไผš๏ผŒ4-5ไบบ๏ผŒ300ๅ—
        ๐ŸŽ“ ็ป้ชŒๆฐดๅนณ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๆ–ฐๆ‰‹ ๆ–ฐๆ‰‹้€‚ๅˆ ๅ…ฅ้—จ็บง ไธๅˆบๆฟ€ ๆ–ฐๆ‰‹ๅ•ฑ็”จ ๅˆๅ“ฅๅ•ฑ ๅ””ๅ—†
        ๅฎนๆ˜“ๆŠฝ ๅฅฝๆŠฝ ไธๅ‘› ๆธฉๅ’Œ้กบ ๅฅฝ้ฃŸ ๆ˜“ๅ…ฅๅฃ ้ †ๅฃ
        ่€ๆ‰‹ ่€ๆ‰‹ ๆœ‰็ป้ชŒ ๅคๆ‚็‚น ่€ๅ˜ข ้ฃŸ้–‹ ่ค‡้›œๅ•ฒ
        ๆƒณ่ฏ•ๆ–ฐ ๆƒณ่ฏ•่ฏ•XX ๆฒกๆŠฝ่ฟ‡XX ๆƒณ่ฉฆไธ‹XX ๆœช้ฃŸ้ŽXX
        ๅฎŒๆ•ดไพ‹ๅญ:
        ๆ–ฐๆ‰‹ๅ•ฑ็”จ๏ผŒๆธฉๅ’Œ๏ผŒ200ๅ— ๅ…ฅ้—จ็บง๏ผŒไธๅ‘›๏ผŒConnecticut ่€ๆ‰‹๏ผŒๅคๆ‚๏ผŒLigeroๅคš
        ๐Ÿ’ช ๆต“ๅบฆๅผบๅบฆ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๆทก/ๆธฉๅ’Œ ๆธฉๅ’Œ/ๆทก ไธ้‡ ่ฝปๅบฆ ๆทกๅ•ฒ ๅ””้‡ ่ผ•ๅ•ฒ
        ้€‚ไธญ ้€‚ไธญ ไธญๅบฆ ๅนณ่กก ๅ•ฑๅ•ฑๅฅฝ ไธญๅบฆ ๅนณ่กก
        ๆต“/้‡ ๆต“/้‡ๅฃๅ‘ณ ๅผบๅŠฒ ๆต“็ƒˆ ๆฟƒ/้‡ๅฃๅ‘ณ ๅค ๅ‹ ๅ‹ๅ•ฒ
        Ligero Ligeroๅคš ้กถๅถ้‡ Ligeroๅคšๅ•ฒ top leaf้‡
        ๅผบๅบฆๅ…ณ้”ฎ่ฏ: mild่ฝปๅบฆใ€mediumไธญๅบฆใ€fullๆต“ๅŽšใ€extra-full่ถ…ๆต“
        ๅฎŒๆ•ดไพ‹ๅญ:
        ๅ•ฑๅ•ฑๅฅฝ๏ผŒๅฐผๅŠ ๏ผŒLigero้€‚ไธญ ๆธฉๅ’Œๆทก๏ผŒConnecticut๏ผŒๆ–ฐๆ‰‹ ๆต“้‡ๅฃๅ‘ณ๏ผŒMaduro๏ผŒ่€ๆ‰‹
        โฑ๏ธ ๅฐบๅฏธๆ—ถ้•ฟ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๅฟซๆŠฝ ๅฟซๆŠฝ 15-20ๅˆ†้’Ÿ ๅฐๆ”ฏ ๅฟซ้ฃŸ 15-20ๅˆ†้˜ ็ดฐๆ”ฏ
        ไธญ็ญ‰ 30-45ๅˆ†้’Ÿ robusto 30-45ๅˆ†้˜ robusto size
        ๆ…ขๆŠฝ 60ๅˆ†้’Ÿ+ Churchill ๅคงๆ”ฏ 60ๅˆ†้˜+ Churchill ๅคงๆž
        ็Žฏๅพ„/้•ฟๅบฆ 50็Žฏๅพ„ 38-42็ป† 140mm 50 ring 38-42ๅนผ 140mm
        ๅฐบๅฏธๅ็งฐ: Petit Coronaใ€Robustoใ€Toroใ€Churchillใ€Gordoใ€Lanceroใ€Coronaใ€Double Corona
        ๅฎŒๆ•ดไพ‹ๅญ:
        ๅฟซ้ฃŸ๏ผŒ20ๅˆ†้’Ÿ๏ผŒ็ดฐๆ”ฏ Robusto๏ผŒ50็Žฏๅพ„๏ผŒไธญ็ญ‰ ๅคงๆ”ฏ๏ผŒ60ๅˆ†้’ŸไปฅไธŠ๏ผŒChurchill
        ๐Ÿญ ไบงๅœฐๅทฅ่‰บ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๅ›ฝๅฎถ ๅคๅทด/ๅฐผๅŠ /ๅคš็ฑณ ้žๅคๅทด Cuba/Nica/ๅคš็ฑณ non-Cuban
        ๆ‰‹ๅทฅ ๆ‰‹ๅทฅ/ๆ‰‹ๅท ไผ ็ปŸๅทฅ่‰บ hand-rolled handmade
        ๅทฅๅŽ‚ XXๅทฅๅŽ‚ My FatherๅŽ‚ XXๅป  My Fatherๅป 
        ๅคๅทดๅธˆๅ‚… ๅคๅทดๅธˆๅ‚… ๅคๅทด้…ๆ–น ๅคๅทดๅธซๅ‚… Cuba recipe
        ไบงๅœฐๅ…ณ้”ฎ่ฏ: ๅคๅทดใ€ๅฐผๅŠ ๆ‹‰็“œใ€ๅคš็ฑณๅฐผๅŠ ใ€ๆดช้ƒฝๆ‹‰ๆ–ฏใ€ๅŽ„็“œๅคšๅฐ”ใ€ๅขจ่ฅฟๅ“ฅใ€ๅทด่ฅฟ
        ๅฎŒๆ•ดไพ‹ๅญ:
        ๅฐผๅŠ ๏ผŒMy FatherๅŽ‚๏ผŒๅคๅทดๅธˆๅ‚… ้žๅคๅทด๏ผŒๆ‰‹ๅทฅๅท๏ผŒ300ๅ— ๅคš็ฑณๅฐผๅŠ ๏ผŒไผ ็ปŸๅทฅ่‰บ
        ๐Ÿƒ ่Œ„่กฃ็ƒŸๅถ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ่Œ„่กฃ ๅบทๆถ…็‹„ๆ ผ/้ฉฌๆœ็ฝ— ๆต…่‰ฒ/ๆทฑ่‰ฒ Connecticut/Maduro ๆทบ่‰ฒ/ๆทฑ่‰ฒ
        ๅŽ„็“œๅคšๅฐ” ๅŽ„็“œๅคšๅฐ”่Œ„่กฃ ไบ‘้›พ็งๆค Ecuador wrapper ้›ฒ้œง็จฎ
        Corojo Corojo็ƒŸ็ง ๅคๅทด็ง Corojo seed Cuba็จฎ
        ๆฒนไบฎ/้™ˆๅŒ– ๆฒนไบฎ่Œ„่กฃ ้™ˆๅŒ–ๅฅฝ ๆฒนๆฝค ้™ณๅŒ–ๅฅฝ
        ่Œ„่กฃๅ…ณ้”ฎ่ฏ: Connecticutๅบทๆถ…็‹„ๆ ผใ€Maduro้ฉฌๆœ็ฝ—ใ€Natural่‡ช็„ถใ€Habanoๅ“ˆ็“ฆ้‚ฃใ€Corojoใ€Oscuroๆทฑ่‰ฒใ€Sumatra่‹้—จ็ญ”่…Šใ€Cameroonๅ–€้บฆ้š†
        ๅฎŒๆ•ดไพ‹ๅญ:
        Ecuadorๅบทๆถ…็‹„ๆ ผ๏ผŒLigeroๅฐ‘ Maduro๏ผŒๆฒนไบฎ๏ผŒ้™ˆๅŒ–4ๅนด ๆต…่‰ฒ๏ผŒไบ‘้›พ็งๆค๏ผŒๆธฉๅ’Œ
        โณ ้™ˆๅŒ–ๆ—ถ้—ด
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ้™ˆๅนด ้™ˆๅนด/XXๅนด ่€้›ช่Œ„ ้™ณๅนด/XXๅนด ่€ๅ˜ข aged
        ๆ–ฐ้ฒœ ๆ–ฐ้ฒœ/ๅˆšๅ‡บๅŽ‚ ๆฒก้™ˆๅŒ– ๆ–ฐ้ฎฎ/ๅ•ฑๅ•ฑๅ‡บ ๆœช้™ณๅŒ– fresh
        ๆŒ‡ๅฎšๅนดไปฝ ้™ˆๅŒ–2-4ๅนด Padron 1964 ้™ณๅŒ–2-4ๅนด Padron 1964
        ๆ”ถ่—็บง ้€‚ๅˆ้™ˆๅŒ– ๆ”พๅ‡ ๅนดๆ›ดๅฅฝ ๅ•ฑ้™ณๅŒ– ๆ”พๅนพๅนดๆ›ดๅฅฝ
        ๅฎŒๆ•ดไพ‹ๅญ:
        ้™ˆๅŒ–4ๅนด๏ผŒPadron๏ผŒๆต“้‡ ่€้›ช่Œ„๏ผŒ้€‚ๅˆๆ”ถ่— ๆ–ฐ้ฒœ๏ผŒๅˆšๅ‡บๅŽ‚๏ผŒๅฐ้ฒœ
        ๐Ÿฅƒ ๆญ้…ๅœบๆ™ฏ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๅจๅฃซๅฟŒ ้…ๅจๅฃซๅฟŒ ้…Macallan 18 ่ฅฏwhisky ้…Macallan 18
        ๅ’–ๅ•ก ้…ๅ’–ๅ•ก ๆ—ฉไธŠๅ–ๅ’–ๅ•ก ้…coffee ๆœๆ—ฉ้ฃฒๅ•ก
        ๅนฒ้‚‘ ้…ๅนฒ้‚‘/XO ็™ฝๅ…ฐๅœฐ ้…cognac/XO ็™ฝ่˜ญๅœฐ match
        ้คๅŽ/็บข้…’ ้คๅŽ/้ฅญๅŽ ้…็บข้…’ ้ฃŸๅฎŒ้ฃฏ ้…็ด…้…’ wine
        ๆญ้…้ฅฎๅ“: ๅจๅฃซๅฟŒใ€ๅนฒ้‚‘ใ€็™ฝๅ…ฐๅœฐใ€ๅ’–ๅ•กใ€ๆต“็ผฉๅ’–ๅ•กใ€็บข้…’ใ€ๆœ—ๅง†้…’ใ€ๆณข็‰น้…’ใ€้›ช่މ้…’
        ๅฎŒๆ•ดไพ‹ๅญ:
        ้…Macallan 18๏ผŒๆต“ๅŽš espresso๏ผŒๆ—ฉไธŠๅฟซ้ฃŸ ๅนฒ้‚‘XO๏ผŒ้คๅŽ๏ผŒๅคงๆ”ฏ
        ๐Ÿ† ๅ“็‰ŒๅทฅๅŽ‚
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๅ“็‰Œ Davidoff/Cohiba XXๅ“็‰Œ Davidoff/Cohiba XX็‰Œๅญ
        ็‰น่‰ฒ Davidoffๅธ้˜ปๆต‹่ฏ• Padronไธ็”จๆœบๅ™จ Davidoff suck test Padronๅ””็”จๆฉŸ
        ่ง„ๆจก ๅคงๅทฅๅŽ‚/ๅฐๆ‰น้‡ boutique็ฒพๅ“ ๅคงๅป /ๅฐๆ‰น้‡ boutique็ฒพๅ“
        ้›†ๅ›ข/ๅธˆๅ‚… LVMHๆ——ไธ‹ Josรฉ Pepin LVMHๆ——ไธ‹ Josรฉ Pepin
        ็ƒญ้—จๅ“็‰Œ: Cohiba้ซ˜ๅธŒ้œธใ€Davidoffๅคงๅซๆœๅคซใ€Padronๅธ•ๅพท้พ™ใ€Montecristo่’™็‰นใ€My Fatherๆˆ‘็š„็ˆถไบฒใ€Olivaใ€AJ Fernandezใ€Arturo Fuenteใ€Rocky Patelใ€Tatuaje
        ๅฎŒๆ•ดไพ‹ๅญ:
        Davidoff๏ผŒ300-500ๅ— Josรฉ Pepinไฝœๅ“๏ผŒๅฐผๅŠ  boutique็ฒพๅ“๏ผŒๅฐๆ‰น้‡
        ๐Ÿ“ฆ ๅŒ…่ฃ…่ง„ๆ ผ
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ๆ•ด็›’ 25ๆ”ฏ่ฃ…/ๆ•ด็›’ box of 25 25ๆ”ฏ่ฃ/ๆˆ็›’ box of 25
        ๅฐๅŒ…่ฃ… 6ๆ”ฏ/10ๆ”ฏ่ฃ… ๅฐ็›’ 6ๆ”ฏ/10ๆ”ฏ่ฃ ็ดฐ็›’ 6-pack
        ๅ•ๆ”ฏ/็คผ็›’ ๅ•ๆ”ฏ/่ฏ•่ฏ• ็คผ็›’/็คผๅ“่ฃ… ๅ–ฎๆ”ฏ/่ฉฆไธ‹ ็ฆฎ็›’ gift box
        ๅฎŒๆ•ดไพ‹ๅญ:
        Davidoff 6ๆ”ฏ่ฃ… ็คผ็›’๏ผŒ้€่€ๆฟ๏ผŒๅคŸ้ข ๅ•ๆ”ฏ่ฏ•่ฏ•๏ผŒๆ–ฐๆ‰‹
        ๐ŸŒŸ ็‰นๆฎŠ่ฆๆฑ‚
        ๆœ็ดขๆ„ๅ›พ ๆ™ฎ้€š่ฏ ๆธฏๅผ
        ้™้‡ ้™้‡็‰ˆ/้™ๅฎš ็‰นๅˆซ็‰ˆ ้™้‡ limited ็‰นๅˆฅ็‰ˆ special
        ็จ€ๆœ‰ ็จ€ๆœ‰/้šพๆ‰พ ็ฝ•่ง ็จ€ๆœ‰/้›ฃๆต ็ฝ•่ฆ‹ rare
        ๆ”ถ่—/็ƒญ้—จ ๆ”ถ่—็บง/ๆŠ•่ต„ ็ƒญ้—จ/็•…้”€ ๆ”ถ่—็ดš/ๆŠ•่ณ‡ ็†ฑ้–€/ๅฅฝ่ณฃ
        ๅฎŒๆ•ดไพ‹ๅญ:
        Padron 1964๏ผŒ้™้‡๏ผŒๆ”ถ่— ็จ€ๆœ‰๏ผŒ้šพๆ‰พ๏ผŒ้ซ˜็ซฏ ็ƒญ้—จ็•…้”€๏ผŒ500ๅ—
        ๐ŸŽฏ ็ป„ๅˆไฝฟ็”จๆŠ€ๅทง
        1๏ธโƒฃ 3-5ไธช่ฏๆœ€ไฝณ๏ผšๅ“็‰Œ+ไปทๆ ผ+ๅฃๆ„Ÿ
        2๏ธโƒฃ ๆททๆญไธๅŒ็ฑป:ไบงๅœฐ+่Œ„่กฃ+ๅœบๅˆ
        3๏ธโƒฃ XXๆ›ฟๆขๅ“็‰Œ/ๆ•ฐๅญ—/ๅ่ฏ
        4๏ธโƒฃ ็‚นๅ‡ปไปปไฝ•ๆ–‡ๅญ—่‡ชๅŠจๅคๅˆถ
        5๏ธโƒฃ ่‡ช็„ถ่ฏด่ฏ๏ผš็”จๆ—ฅๅธธ็”จ่ฏญ
        6๏ธโƒฃ ็›ดๆŽฅ่ฏ•็”จๅฎŒๆ•ดไพ‹ๅญ
        โœ“ ๅทฒๅคๅˆถ
        โ‹ฎโ‹ฎ
        540