Skip to main content

English · Русский

lzt-eventus-sdk

Async-клиент к management API движка lzt-eventus. Подписки, опрос событий, проверка подписи вебхука.

Сам движок здесь не живёт — этот пакет только разговаривает с ним по HTTP.

from lzt_eventus_sdk import EventType, ManagementClient, SubscriptionTransport

client = ManagementClient("http://127.0.0.1:27543", api_key="<admin-key>")

sub = await client.create_subscription(
    transport=SubscriptionTransport.POLLING,
    endpoint="autobuy",
    event_types=[EventType.NEW_LOT, EventType.PRICE_DROPPED],
)

Установка

pip install lzt-eventus-sdk         # базовый пакет
pip install "lzt-eventus-sdk[ws]"   # + websockets, нужен только для WSSource

Python 3.12+. Единственная рантайм-зависимость — httpx>=0.27.

Какой транспорт брать

Транспорт Когда Что нужно на вашей стороне
POLLING по умолчанию, за NAT, без публичного адреса ничего — вы сами ходите за событиями
WEBHOOK у вас есть публичный HTTPS-эндпоинт приёмник + проверка подписи
SSE долгий однонаправленный поток в браузер или демон держать соединение
WEBSOCKET двусторонний канал [ws] extra + держать соединение

Webhook: создать подписку

Секрет подписи возвращается один раз при создании — второй раз его не покажут, сохраните сразу.

from lzt_eventus_sdk import CategoryScope, EventType, ManagementClient, SubscriptionTransport

client = ManagementClient("http://127.0.0.1:27543", api_key="<admin-key>")

sub = await client.create_subscription(
    transport=SubscriptionTransport.WEBHOOK,
    endpoint="https://you.example/hook",
    event_types=[EventType.NEW_LOT],
    scope=CategoryScope(category="steam"),
    backfill=False,
)
print(sub.id, sub.secret)   # secret — только сейчас

Webhook: приёмник

from fastapi import FastAPI, Request, Response
from lzt_eventus_sdk import SIGNATURE_HEADER, verify_webhook

app = FastAPI()
SECRET = "<секрет из sub.secret>"


@app.post("/hook")
async def hook(request: Request) -> Response:
    body = await request.body()
    if not verify_webhook(SECRET, body, request.headers.get(SIGNATURE_HEADER)):
        return Response(status_code=401)
    ...
    return Response(status_code=204)

Заголовки — константы пакета, не строки в вашем коде: SIGNATURE_HEADER (X-LZT-Signature, формат sha256=<hex>), EVENT_ID_HEADER, EVENT_TYPE_HEADER, IDEMPOTENCY_HEADER.

Polling: цикл

confirm_read идемпотентен — повторный вызов с тем же up_to_seq ничего не сдвинет и не сломает.

batch = await client.poll_pending(sub.id, limit=100)

for item in batch.items:
    handle(item.event_type, item.data)

if batch.items:
    await client.confirm_read(sub.id, batch.items[-1].seq)

PendingBatch несёт items, next_seq, last_read_seq, drained, committed — по drained видно, кончилась ли очередь.

Dispatcher и Router

Роутер раскладывает события по хендлерам, источник качает их из движка.

import asyncio

from lzt_eventus_sdk import AccountContext, Dispatcher, EventType, Router
from lzt_eventus_sdk.sources import PollingSource

router = Router()


@router.on(EventType.NEW_LOT)
async def on_new_lot(event) -> None:
    print(event.data["item_id"])


dispatcher = Dispatcher(router)
source = PollingSource(AccountContext(client, sub.id, label="main"))

asyncio.run(dispatcher.run(source))

Готовые middleware: ErrorBoundaryMiddleware (не роняет цикл на ошибке хендлера), IdempotencyMiddleware (дедуп по id события), LoggingMiddleware. Свой — подкласс BaseMiddleware.

Публичный API

Что Одна строка
ManagementClient(base_url, api_key, *, timeout=10.0, httpx_client=None) клиент management API
create_subscription(*, transport, endpoint, event_types, scope=None, ctx=None, backfill=False) создать подписку, вернёт SubscriptionCreated
poll_pending(subscription_id, *, event_type=None, limit=100, read_all=False) забрать пачку событий
confirm_read(subscription_id, up_to_seq) подтвердить прочитанное, вернёт подтверждённый last_seq
get_subscription · list_subscriptions · deactivate_subscription чтение и отключение подписок
verify_webhook(secret, body, presented) · sign_webhook · signature_header подпись и её проверка
SubscriptionTransport · EventType · MarketCategory StrEnum вместо строковых литералов
NoScope · CategoryScope(category=...) · AccountScope(account_alias=...) во что сузить подписку
Dispatcher · Router · AccountContext раскладка событий по хендлерам
PollingSource · SSESource · WSSource · WebhookReceiver четыре источника событий
MemoryStorage · CursorStore · IdempotencyStore курсор и дедуп; свой бэкенд — подкласс BaseStorage

Переменных окружения пакет не читает: всё передаётся в конструктор.

Разработка

pip install "lzt-eventus-sdk[dev]"
ruff check . && mypy src/lzt_eventus_sdk && pytest -q

Тесты гоняются на записанных ответах движка (tests/fixtures/), живой инстанс не нужен.

Экосистема

lzt-eventus — сам движок · pylzt — SDK маркета · auto-lzt — no-code автоматизации · весь стенд

Лицензия

MIT

Release files for lzt-eventus-sdk 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lzt-eventus-sdk 0.1.1
File Size Uploaded
lzt_eventus_sdk-0.1.1.tar.gz 73.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lzt-eventus-sdk 0.1.1
File Interpreter ABI Platform
lzt_eventus_sdk-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 112.4 kB

Release files / lzt_eventus_sdk-0.1.1.tar.gz

Download URL lzt_eventus_sdk-0.1.1.tar.gz
Size 73.4 kB
Tags Source
SHA-256 checksum
How to use checksums
35a75c7e66c155cd1fcc487bae5b17b08dcecab639186e373ea19be1a2f731ab
BLAKE2b-256 checksum
How to use checksums
4377e09cc2b105eda8b052e654e37707598b1ba43b0cc61243b1813287a705c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / lzt_eventus_sdk-0.1.1-py3-none-any.whl

Download URL lzt_eventus_sdk-0.1.1-py3-none-any.whl
Size 39.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ff83fcfcbb9dceb36f35909015a973410e46227e17136f4a7ee7f67732a6b0f9
BLAKE2b-256 checksum
How to use checksums
a5b43ae8d21b3c1428f78ae7f973ac1706af6922dbe03721a88cbe1926e6b5cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page