You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`avito-py` — Python SDK для работы с Avito API через единый объектный фасад `AvitoClient`.
8
+
`avito-py` — синхронный Python SDK для работы с Avito API через единый объектный фасад `AvitoClient`.
9
9
10
10
Цели SDK:
11
11
@@ -14,6 +14,8 @@
14
14
- дать единый вход в доменные сценарии вида `avito.ad(...).get()` и `avito.chat(...).send_message(...)`;
15
15
- покрыть все swagger-документы из каталога [docs](docs).
16
16
17
+
SDK является синхронным. Любая асинхронная поддержка, если она появится, будет жить в отдельном namespace `avito.aio` и никогда не будет смешана с sync-классами в одном модуле.
18
+
17
19
Каталог [docs](docs) рассматривается как upstream API contract. Эти файлы не редактируются вручную при развитии SDK: публичные модели, мапперы и тесты должны подстраиваться под documented shape из `docs/*`.
По умолчанию настройки читаются из переменных окружения с префиксом `AVITO_`.
49
51
50
-
Официальный способ конфигурации SDK:
52
+
## Инициализация клиента
53
+
54
+
SDK предоставляет три нормативных способа создания клиента — от самого простого к самому явному.
55
+
56
+
### 1. Из переменных окружения
57
+
58
+
```python
59
+
from avito import AvitoClient
60
+
61
+
with AvitoClient.from_env() as avito:
62
+
...
63
+
```
64
+
65
+
### 2. Напрямую через `client_id` / `client_secret`
66
+
67
+
Короткий путь без промежуточных объектов:
68
+
69
+
```python
70
+
from avito import AvitoClient
71
+
72
+
with AvitoClient(client_id="client-id", client_secret="client-secret") as avito:
73
+
...
74
+
```
75
+
76
+
### 3. Полная конфигурация через `AvitoSettings`
51
77
52
78
```python
53
79
from avito import AuthSettings, AvitoClient, AvitoSettings
@@ -60,17 +86,14 @@ settings = AvitoSettings(
60
86
client_secret="client-secret",
61
87
),
62
88
)
63
-
client = AvitoClient(settings)
64
-
```
65
89
66
-
Инициализация из окружения и `.env`:
90
+
with AvitoClient(settings) as avito:
91
+
...
92
+
```
67
93
68
-
```python
69
-
from avito import AvitoClient, AvitoSettings
94
+
Все опциональные параметры конструктора — keyword-only. `AvitoClient` иммутабелен: `base_url`, таймауты, retry-политика и `auth` не меняются у живого клиента — вместо этого создаётся новый клиент.
@@ -170,13 +193,15 @@ print(campaign.campaign.title if campaign.campaign else None)
170
193
print(campaigns.total_count)
171
194
```
172
195
196
+
Write-операции продвижения, поддерживающие сухой прогон, принимают `dry_run: bool = False`. При `dry_run=True` SDK валидирует параметры, строит тот же payload, что и в реальном вызове, но не выполняет сетевой запрос и возвращает `PromotionActionResult` со статусом `preview`/`validated`.
197
+
173
198
### Заказы и доставка
174
199
175
200
```python
176
201
from avito import AvitoClient
177
202
from avito.orders import OrderLabelsRequest, StockInfoRequest
@@ -215,37 +240,13 @@ with AvitoClient() as avito:
215
240
records = avito.call_tracking_call(10).download()
216
241
```
217
242
218
-
## Пагинация
219
-
220
-
Публичные list-операции, которые поддерживают lazy pagination, возвращают обычные SDK-результаты, а поле `items` в них ведет себя как list-like коллекция `PaginatedList`.
221
-
222
-
Текущий стабильный контракт:
223
-
224
-
- первая страница загружается сразу, остальные страницы подгружаются только при чтении элементов за ее пределами;
225
-
- доступ к уже загруженным элементам не делает повторных запросов;
226
-
- частичная итерация и slicing загружают только необходимые страницы;
227
-
- явная полная материализация выполняется через `items.materialize()`.
228
-
229
-
Пример:
230
-
231
-
```python
232
-
from avito import AvitoClient
233
-
234
-
with AvitoClient() as avito:
235
-
result = avito.ad(user_id=123).list(status="active", limit=50)
236
-
237
-
first = result.items[0]
238
-
preview = result.items[:10]
239
-
all_items = result.items.materialize()
240
-
```
241
-
242
243
### Автотека
243
244
244
245
```python
245
246
from avito import AvitoClient
246
247
from avito.autoteka import CatalogResolveRequest, PreviewReportRequest, VinRequest
@@ -279,14 +280,55 @@ with AvitoClient() as avito:
279
280
tariff = avito.tariff().get_tariff_info()
280
281
```
281
282
283
+
## Пагинация
284
+
285
+
Публичные list-операции, которые поддерживают lazy pagination, возвращают обычные SDK-результаты, а поле `items` в них типизировано как `PaginatedList[T]` и ведёт себя как list-like коллекция.
286
+
287
+
Стабильный публичный контракт:
288
+
289
+
- первая страница загружается сразу, остальные подгружаются только при чтении элементов за её пределами;
290
+
- доступ к уже загруженным элементам не делает повторных запросов;
291
+
- частичная итерация и slicing загружают только необходимые страницы;
292
+
- пустая коллекция не приводит к дополнительным запросам;
293
+
- ошибка на последующей странице поднимается в момент её чтения;
294
+
- явная полная материализация выполняется через `items.materialize()` и загружает всё ровно один раз.
295
+
296
+
Пример:
297
+
298
+
```python
299
+
from avito import AvitoClient
300
+
301
+
with AvitoClient.from_env() as avito:
302
+
result = avito.ad(user_id=123).list(status="active", limit=50)
303
+
304
+
first = result.items[0]
305
+
preview = result.items[:10]
306
+
all_items = result.items.materialize()
307
+
```
308
+
309
+
## Ошибки
310
+
311
+
Все исключения SDK наследуются от `AvitoError` и импортируются из `avito.core.exceptions`. HTTP-коды отображаются в конкретные типы:
312
+
313
+
-`400`, `422` → `ValidationError`
314
+
-`401` → `AuthenticationError`
315
+
-`403` → `AuthorizationError`
316
+
-`409` → `ConflictError`
317
+
-`429` → `RateLimitError`
318
+
- прочие `5xx` и нераспознанные ответы → `UpstreamApiError`
319
+
- транспортные сбои → `TransportError`
320
+
- ошибки маппинга ответа → `ResponseMappingError`
321
+
322
+
`AuthenticationError` (401) и `AuthorizationError` (403) — семантически разные ошибки и **не** состоят в отношении наследования. Тексты сообщений написаны на русском языке. Секреты (access token, `client_secret`, `Authorization`) автоматически санитайзятся из сообщений и metadata.
323
+
282
324
## Отладка интеграции
283
325
284
326
SDK не раскрывает сырой transport в основном API, но даёт безопасный debug snapshot без секретов:
0 commit comments