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 автоматизации · весь стенд
Лицензия
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)
| File | Size | Uploaded | |
|---|---|---|---|
| lzt_eventus_sdk-0.1.1.tar.gz | 73.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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}
|