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