feat: a lot of a lot

This commit is contained in:
2024-09-01 01:05:11 +03:00
parent 867dfbe597
commit 4ae03284a3
43 changed files with 700 additions and 13 deletions

4
external/marketplace/__init__.py vendored Normal file
View 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
View File

@@ -0,0 +1 @@
from .core import BaseMarketplaceApi

28
external/marketplace/base/core.py vendored Normal file
View 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
View 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
View File

@@ -0,0 +1 @@
from .core import OzonMarketplaceApi

15
external/marketplace/ozon/core.py vendored Normal file
View 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 ""

View File

@@ -0,0 +1 @@
from .core import WildberriesMarketplaceApi

View 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')

View File

View File

@@ -0,0 +1 @@
from .core import YandexMarketplaceApi

15
external/marketplace/yandex/core.py vendored Normal file
View 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 ""