Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ jobs:
- name: auto PR schema
# отмена джобы исключается (поэтому и не always)
if: success() || failure()
uses: Miskler/pytest-jsonschema-snapshot-bot@v12
uses: Miskler/pytest-jsonschema-snapshot-bot@v14
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
1 change: 0 additions & 1 deletion docs/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@ sphinx
sphinx-autoapi
jsoncrack-for-sphinx
furo
enum-tools
sphinx_toolbox
3 changes: 1 addition & 2 deletions docs/source/_api/fixprice_api.manager.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,4 @@

.. autosummary::

PWTimeoutError

PWTimeoutError
1 change: 0 additions & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ def _get_version() -> str:
"sphinx.ext.linkcode",
"sphinx.ext.doctest",
"sphinx.ext.duration",
"enum_tools.autoenum",
"jsoncrack_for_sphinx",
# "myst_parser", # если понадобится Markdown/MyST — просто раскомментируй
]
Expand Down
47 changes: 47 additions & 0 deletions example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import asyncio
from fixprice_api import FixPriceAPI, CatalogSort
from PIL import Image


async def main():
async with FixPriceAPI() as api:
# 1. Получаем дерево категорий
tree_data = (await api.Catalog.tree()).json()
first_alias = tree_data[next(iter(tree_data))]["alias"]
print(f"Первая категория: {first_alias}")

# 2. Список товаров в категории
products = (
await api.Catalog.products_list(
category_alias=first_alias,
page=1,
limit=24,
sort=CatalogSort.POPULARITY,
)
).json()
first_product_id = products[0]["id"]
first_product_url = products[0]["url"]
print(f"Первый товар: {products[0]['title']!s:.60s} ({first_product_id})")

# 3. Геолокация (влияет на каталог и баланс)
cities = (await api.Geolocation.cities_list(country_id=2)).json() # Россия
api.city_id = cities[0]["id"]
print(f"Текущий city_id: {api.city_id}")

# 4. Проверка наличия товара по магазинам
balance = (await api.Catalog.Product.balance(product_id=first_product_id)).json()
print(f"Проверено магазинов: {len(balance)}")

# 5. Подробное инфо о товаре
info = (await api.Catalog.Product.info(url=first_product_url)).json()
print(f"Подробно о товаре: {list(info.keys())}")

# 6. Загрузка изображения
image_url = products[0]["images"][0]["src"]
image_stream = await api.General.download_image(image_url)
with Image.open(image_stream) as img:
print(f"Image format: {img.format}, size: {img.size}")


if __name__ == "__main__":
asyncio.run(main())
4 changes: 2 additions & 2 deletions fixprice_api/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .manager import FixPriceAPI
from .abstraction import CatalogSort
from .manager import FixPriceAPI

__all__ = ["FixPriceAPI", "CatalogSort"]
__version__ = "0.2.4"
__version__ = "0.2.4.1"
5 changes: 2 additions & 3 deletions fixprice_api/endpoints/advertising.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
"""Реклама"""

from human_requests import autotest
from human_requests.abstraction import FetchResponse, HttpMethod
from typing import TYPE_CHECKING

from human_requests import ApiChild
from human_requests import ApiChild, autotest
from human_requests.abstraction import FetchResponse, HttpMethod

if TYPE_CHECKING:
from fixprice_api.manager import FixPriceAPI
Expand Down
14 changes: 8 additions & 6 deletions fixprice_api/endpoints/catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
from __future__ import annotations

import json
from dataclasses import dataclass
from types import MethodType
from typing import TYPE_CHECKING, Optional, overload

from human_requests import ApiChild, ApiParent, api_child_field, autotest
from human_requests.abstraction import FetchResponse, HttpMethod
from playwright.async_api import Response as PWResponse
from dataclasses import dataclass
from typing import Optional, TYPE_CHECKING, overload

from .. import abstraction
from human_requests import autotest
from human_requests.abstraction import FetchResponse, HttpMethod
from human_requests import ApiChild, ApiParent, api_child_field

if TYPE_CHECKING:
from fixprice_api.manager import FixPriceAPI
Expand Down Expand Up @@ -173,7 +173,9 @@ async def info(
""")

nuxt_data = (
json.loads(raw_json)["data"][0]["categoryData"]["product"]
json.loads(raw_json)["useState"]["uniquePseudoAsyncDataStateKey"][
"product"
]
if raw_json
else None
)
Expand Down
6 changes: 3 additions & 3 deletions fixprice_api/endpoints/general.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Общий (не класифицируемый) функционал"""

from typing import TYPE_CHECKING
from io import BytesIO
from human_requests.abstraction import Proxy
from aiohttp_retry import ExponentialRetry, RetryClient
from typing import TYPE_CHECKING

from aiohttp_retry import ExponentialRetry, RetryClient
from human_requests import ApiChild
from human_requests.abstraction import Proxy

if TYPE_CHECKING:
from fixprice_api.manager import FixPriceAPI
Expand Down
5 changes: 2 additions & 3 deletions fixprice_api/endpoints/geolocation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
from __future__ import annotations

from dataclasses import dataclass
from human_requests import autotest
from human_requests.abstraction import FetchResponse, HttpMethod
from typing import TYPE_CHECKING

from human_requests import ApiChild, ApiParent, api_child_field
from human_requests import ApiChild, ApiParent, api_child_field, autotest
from human_requests.abstraction import FetchResponse, HttpMethod

if TYPE_CHECKING:
from fixprice_api.manager import FixPriceAPI
Expand Down
28 changes: 14 additions & 14 deletions fixprice_api/manager.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
from typing import Any, Literal
from dataclasses import dataclass, field
from collections import defaultdict
from human_requests import HumanBrowser, HumanContext, HumanPage
from human_requests.abstraction import Proxy, FetchResponse, HttpMethod
from human_requests.network_analyzer.anomaly_sniffer import (
HeaderAnomalySniffer,
WaitHeader,
WaitSource,
)
from dataclasses import dataclass, field
from typing import Any, Literal

from camoufox import AsyncCamoufox, DefaultAddons
from human_requests import (ApiParent, HumanBrowser, HumanContext, HumanPage,
api_child_field)
from human_requests.abstraction import FetchResponse, HttpMethod, Proxy
from human_requests.network_analyzer.anomaly_sniffer import (
HeaderAnomalySniffer, WaitHeader, WaitSource)

from human_requests import ApiParent, api_child_field
from .endpoints.catalog import ClassCatalog
from .endpoints.geolocation import ClassGeolocation
from .endpoints.advertising import ClassAdvertising
from .endpoints.catalog import ClassCatalog
from .endpoints.general import ClassGeneral
from .endpoints.geolocation import ClassGeolocation


@dataclass
Expand Down Expand Up @@ -76,7 +74,7 @@ async def _warmup(self) -> None:
**self.browser_opts,
block_images=True,
i_know_what_im_doing=True,
exclude_addons=[DefaultAddons.UBO]
exclude_addons=[DefaultAddons.UBO],
).start()

self.session = HumanBrowser.replace(br)
Expand All @@ -103,7 +101,9 @@ async def _warmup(self) -> None:
)

if self.test_mode:
btn = self.page.locator("div.selected-city > div.buttons > button.button.normal").first
btn = self.page.locator(
"div.selected-city > div.buttons > button.button.normal"
).first
await btn.wait_for(state="visible", timeout=self.timeout_ms)
await btn.click(timeout=self.timeout_ms)

Expand Down
Loading
Loading