feat: a lot of a lot
This commit is contained in:
		
							
								
								
									
										4
									
								
								external/marketplace/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								external/marketplace/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
from .wildberries import WildberriesMarketplaceApi
 | 
			
		||||
from .ozon import OzonMarketplaceApi
 | 
			
		||||
from .yandex import YandexMarketplaceApi
 | 
			
		||||
from .factory import MarketplaceApiFactory
 | 
			
		||||
							
								
								
									
										1
									
								
								external/marketplace/base/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								external/marketplace/base/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
from .core import BaseMarketplaceApi
 | 
			
		||||
							
								
								
									
										28
									
								
								external/marketplace/base/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								external/marketplace/base/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
from abc import ABC, abstractmethod
 | 
			
		||||
 | 
			
		||||
import aiohttp
 | 
			
		||||
 | 
			
		||||
from models import Marketplace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BaseMarketplaceApi(ABC):
 | 
			
		||||
    marketplace: Marketplace
 | 
			
		||||
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def __init__(self, marketplace: Marketplace):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    async def _method(self, http_method, method, **kwargs):
 | 
			
		||||
        async with aiohttp.ClientSession(headers=self.get_headers) as session:
 | 
			
		||||
            async with session.request(http_method, self.base_url + method, **kwargs) as response:
 | 
			
		||||
                return await response.json()
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def get_headers(self) -> dict:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    @abstractmethod
 | 
			
		||||
    def base_url(self) -> str:
 | 
			
		||||
        pass
 | 
			
		||||
							
								
								
									
										19
									
								
								external/marketplace/factory.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								external/marketplace/factory.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
from enums.base_marketplace import BaseMarketplace
 | 
			
		||||
from external.marketplace.ozon.core import OzonMarketplaceApi
 | 
			
		||||
from external.marketplace.wildberries.core import WildberriesApiUrl, WildberriesMarketplaceApi
 | 
			
		||||
from external.marketplace.yandex.core import YandexMarketplaceApi
 | 
			
		||||
from models import Marketplace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MarketplaceApiFactory:
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def get_marketplace_api(marketplace: Marketplace):
 | 
			
		||||
        match marketplace.base_marketplace_key:
 | 
			
		||||
            case BaseMarketplace.WILDBERRIES:
 | 
			
		||||
                return WildberriesMarketplaceApi(marketplace)
 | 
			
		||||
            case BaseMarketplace.OZON:
 | 
			
		||||
                return OzonMarketplaceApi(marketplace)
 | 
			
		||||
            case BaseMarketplace.YANDEX_MARKET:
 | 
			
		||||
                return YandexMarketplaceApi(marketplace)
 | 
			
		||||
            case _:
 | 
			
		||||
                raise ValueError(f"Unsupported marketplace: {marketplace.base_marketplace_key}")
 | 
			
		||||
							
								
								
									
										1
									
								
								external/marketplace/ozon/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								external/marketplace/ozon/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
from .core import OzonMarketplaceApi
 | 
			
		||||
							
								
								
									
										15
									
								
								external/marketplace/ozon/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								external/marketplace/ozon/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
from external.marketplace.base.core import BaseMarketplaceApi
 | 
			
		||||
from models import Marketplace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OzonMarketplaceApi(BaseMarketplaceApi):
 | 
			
		||||
    def __init__(self, marketplace: Marketplace):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def get_headers(self) -> dict:
 | 
			
		||||
        return {}
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def base_url(self) -> str:
 | 
			
		||||
        return ""
 | 
			
		||||
							
								
								
									
										1
									
								
								external/marketplace/wildberries/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								external/marketplace/wildberries/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
from .core import WildberriesMarketplaceApi
 | 
			
		||||
							
								
								
									
										86
									
								
								external/marketplace/wildberries/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								external/marketplace/wildberries/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
			
		||||
import time
 | 
			
		||||
from enum import StrEnum
 | 
			
		||||
from typing import AsyncIterator
 | 
			
		||||
 | 
			
		||||
from async_timeout import timeout
 | 
			
		||||
 | 
			
		||||
from external.marketplace.base.core import BaseMarketplaceApi
 | 
			
		||||
from models import Marketplace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WildberriesApiUrl(StrEnum):
 | 
			
		||||
    CONTENT = 'https://content-api.wildberries.ru'
 | 
			
		||||
    DISCOUNTS_PRICES = 'https://discounts-prices-api.wildberries.ru'
 | 
			
		||||
    SUPPLIES = 'https://supplies-api.wildberries.ru'
 | 
			
		||||
    MARKETPLACE = 'https://marketplace-api.wildberries.ru'
 | 
			
		||||
    STATISTICS = 'https://statistics-api.wildberries.ru'
 | 
			
		||||
    SELLER_ANALYTICS = 'https://seller-analytics-api.wildberries.ru'
 | 
			
		||||
    ADVERT = 'https://advert-api.wildberries.ru'
 | 
			
		||||
    RECOMMEND = 'https://recommend-api.wildberries.ru'
 | 
			
		||||
    FEEDBACKS = 'https://feedbacks-api.wildberries.ru'
 | 
			
		||||
    COMMON = 'https://common-api.wildberries.ru'
 | 
			
		||||
    BUYER_CHAT = 'https://buyer-chat-api.wildberries.ru'
 | 
			
		||||
    RETURNS = 'https://returns-api.wildberries.ru'
 | 
			
		||||
    DOCUMENTS = 'https://documents-api.wildberries.ru'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WildberriesMarketplaceApi(BaseMarketplaceApi):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, marketplace: Marketplace):
 | 
			
		||||
        token = marketplace.auth_data.get('Authorization')
 | 
			
		||||
        if not token:
 | 
			
		||||
            raise ValueError(
 | 
			
		||||
                f"Authorization token is missing for Marketplace ID: {marketplace.id}. "
 | 
			
		||||
                "Please check the marketplace credentials."
 | 
			
		||||
            )
 | 
			
		||||
        self.token = token
 | 
			
		||||
        self.headers = {'Authorization': token}
 | 
			
		||||
        self.marketplace = marketplace
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def get_headers(self) -> dict:
 | 
			
		||||
        return self.headers
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def base_url(self) -> str:
 | 
			
		||||
        return ""
 | 
			
		||||
 | 
			
		||||
    async def get_products(self, data: dict) -> dict:
 | 
			
		||||
        method = WildberriesApiUrl.CONTENT + '/content/v2/get/cards/list'
 | 
			
		||||
        response = await self._method('POST', method, json=data)
 | 
			
		||||
        return response
 | 
			
		||||
 | 
			
		||||
    async def get_all_products(self) -> AsyncIterator[dict]:
 | 
			
		||||
        limit = 100
 | 
			
		||||
        updated_at = None
 | 
			
		||||
        nm_id = None
 | 
			
		||||
        while True:
 | 
			
		||||
            data = {
 | 
			
		||||
                'settings': {
 | 
			
		||||
                    'cursor': {
 | 
			
		||||
                        'limit': limit,
 | 
			
		||||
                        'updatedAt': updated_at,
 | 
			
		||||
                        'nmID': nm_id
 | 
			
		||||
                    },
 | 
			
		||||
                    'filter': {
 | 
			
		||||
                        'withPhoto': -1
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            start = time.time()
 | 
			
		||||
            response = await self.get_products(data)
 | 
			
		||||
            print(f'Request elapsed: {round(time.time() - start, 2)}')
 | 
			
		||||
            if not response:
 | 
			
		||||
                break
 | 
			
		||||
            cards = response.get('cards')
 | 
			
		||||
            if not cards:
 | 
			
		||||
                break
 | 
			
		||||
            for card in cards:
 | 
			
		||||
                yield card
 | 
			
		||||
 | 
			
		||||
            cursor = response.get('cursor')
 | 
			
		||||
            total = cursor.get('total')
 | 
			
		||||
            if total < limit:
 | 
			
		||||
                break
 | 
			
		||||
            updated_at = cursor.get('updatedAt')
 | 
			
		||||
            nm_id = cursor.get('nmID')
 | 
			
		||||
							
								
								
									
										0
									
								
								external/marketplace/wildberries/schemas.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								external/marketplace/wildberries/schemas.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								external/marketplace/yandex/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								external/marketplace/yandex/__init__.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
from .core import YandexMarketplaceApi
 | 
			
		||||
							
								
								
									
										15
									
								
								external/marketplace/yandex/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								external/marketplace/yandex/core.py
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
from external.marketplace.base.core import BaseMarketplaceApi
 | 
			
		||||
from models import Marketplace
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class YandexMarketplaceApi(BaseMarketplaceApi):
 | 
			
		||||
    def __init__(self, marketplace: Marketplace):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def get_headers(self) -> dict:
 | 
			
		||||
        return {}
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def base_url(self) -> str:
 | 
			
		||||
        return ""
 | 
			
		||||
		Reference in New Issue
	
	Block a user