From bdd44dd990123ca7b029cae078800352128840d6 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Mar 2026 04:30:10 +0000 Subject: [PATCH] =?UTF-8?q?docs:=20100%=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20docstrings=20=E2=80=94=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D0=B7=D0=B0=D0=B4=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Полная документация всей кодовой базы: client.py: - KworkClient — основной класс, аутентификация, примеры - CatalogAPI — каталог кворков (get_list, get_details, get_details_extra) - ProjectsAPI — биржа проектов (get_list, get_payer_orders, get_worker_orders) - UserAPI — пользователь (get_info, get_reviews, get_favorite_kworks) - ReferenceAPI — справочники (cities, countries, timezones, features, badges) - NotificationsAPI — уведомления (get_list, fetch, get_dialogs, get_blocked_dialogs) - OtherAPI — прочее (wants, settings, offline, и т.д.) - Все property accessor'ы models.py: - KworkUser, KworkCategory, Kwork, KworkDetails - PaginationInfo, CatalogResponse - Project, ProjectsResponse - Review, ReviewsResponse - Notification, NotificationsResponse, Dialog - AuthResponse, ErrorDetail, APIErrorResponse - City, Country, TimeZone, Feature, Badge - DataResponse errors.py: - KworkError (базовое) - KworkAuthError, KworkApiError - KworkNotFoundError, KworkRateLimitError - KworkValidationError, KworkNetworkError Все docstrings на русском языке с примерами использования. --- .gitignore | 1 + api_reference.md | 2561 ---------------------------------------------- 2 files changed, 1 insertion(+), 2561 deletions(-) delete mode 100644 api_reference.md diff --git a/.gitignore b/.gitignore index 45ddf0a..c70e9ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ site/ +api_reference.md diff --git a/api_reference.md b/api_reference.md deleted file mode 100644 index 7f21263..0000000 --- a/api_reference.md +++ /dev/null @@ -1,2561 +0,0 @@ -# Table of Contents - -* [kwork\_api](#kwork_api) - * [KworkClient](#kwork_api.KworkClient) - * [KworkError](#kwork_api.KworkError) - * [KworkAuthError](#kwork_api.KworkAuthError) - * [KworkApiError](#kwork_api.KworkApiError) - * [\_\_version\_\_](#kwork_api.__version__) - * [\_\_all\_\_](#kwork_api.__all__) -* [kwork\_api.client](#kwork_api.client) - * [logging](#kwork_api.client.logging) - * [Any](#kwork_api.client.Any) - * [Optional](#kwork_api.client.Optional) - * [httpx](#kwork_api.client.httpx) - * [HttpUrl](#kwork_api.client.HttpUrl) - * [KworkApiError](#kwork_api.client.KworkApiError) - * [KworkAuthError](#kwork_api.client.KworkAuthError) - * [KworkError](#kwork_api.client.KworkError) - * [KworkNetworkError](#kwork_api.client.KworkNetworkError) - * [KworkNotFoundError](#kwork_api.client.KworkNotFoundError) - * [KworkRateLimitError](#kwork_api.client.KworkRateLimitError) - * [KworkValidationError](#kwork_api.client.KworkValidationError) - * [APIErrorResponse](#kwork_api.client.APIErrorResponse) - * [AuthResponse](#kwork_api.client.AuthResponse) - * [Badge](#kwork_api.client.Badge) - * [CatalogResponse](#kwork_api.client.CatalogResponse) - * [City](#kwork_api.client.City) - * [Country](#kwork_api.client.Country) - * [DataResponse](#kwork_api.client.DataResponse) - * [Dialog](#kwork_api.client.Dialog) - * [Feature](#kwork_api.client.Feature) - * [Kwork](#kwork_api.client.Kwork) - * [KworkDetails](#kwork_api.client.KworkDetails) - * [NotificationsResponse](#kwork_api.client.NotificationsResponse) - * [Project](#kwork_api.client.Project) - * [ProjectsResponse](#kwork_api.client.ProjectsResponse) - * [Review](#kwork_api.client.Review) - * [ReviewsResponse](#kwork_api.client.ReviewsResponse) - * [TimeZone](#kwork_api.client.TimeZone) - * [logger](#kwork_api.client.logger) - * [KworkClient](#kwork_api.client.KworkClient) - * [BASE\_URL](#kwork_api.client.KworkClient.BASE_URL) - * [LOGIN\_URL](#kwork_api.client.KworkClient.LOGIN_URL) - * [TOKEN\_URL](#kwork_api.client.KworkClient.TOKEN_URL) - * [\_\_init\_\_](#kwork_api.client.KworkClient.__init__) - * [login](#kwork_api.client.KworkClient.login) - * [close](#kwork_api.client.KworkClient.close) - * [\_\_aenter\_\_](#kwork_api.client.KworkClient.__aenter__) - * [\_\_aexit\_\_](#kwork_api.client.KworkClient.__aexit__) - * [CatalogAPI](#kwork_api.client.KworkClient.CatalogAPI) - * [ProjectsAPI](#kwork_api.client.KworkClient.ProjectsAPI) - * [UserAPI](#kwork_api.client.KworkClient.UserAPI) - * [ReferenceAPI](#kwork_api.client.KworkClient.ReferenceAPI) - * [NotificationsAPI](#kwork_api.client.KworkClient.NotificationsAPI) - * [OtherAPI](#kwork_api.client.KworkClient.OtherAPI) - * [catalog](#kwork_api.client.KworkClient.catalog) - * [projects](#kwork_api.client.KworkClient.projects) - * [user](#kwork_api.client.KworkClient.user) - * [reference](#kwork_api.client.KworkClient.reference) - * [notifications](#kwork_api.client.KworkClient.notifications) - * [other](#kwork_api.client.KworkClient.other) -* [kwork\_api.models](#kwork_api.models) - * [datetime](#kwork_api.models.datetime) - * [Any](#kwork_api.models.Any) - * [Optional](#kwork_api.models.Optional) - * [BaseModel](#kwork_api.models.BaseModel) - * [Field](#kwork_api.models.Field) - * [KworkUser](#kwork_api.models.KworkUser) - * [id](#kwork_api.models.KworkUser.id) - * [username](#kwork_api.models.KworkUser.username) - * [avatar\_url](#kwork_api.models.KworkUser.avatar_url) - * [is\_online](#kwork_api.models.KworkUser.is_online) - * [rating](#kwork_api.models.KworkUser.rating) - * [KworkCategory](#kwork_api.models.KworkCategory) - * [id](#kwork_api.models.KworkCategory.id) - * [name](#kwork_api.models.KworkCategory.name) - * [slug](#kwork_api.models.KworkCategory.slug) - * [parent\_id](#kwork_api.models.KworkCategory.parent_id) - * [Kwork](#kwork_api.models.Kwork) - * [id](#kwork_api.models.Kwork.id) - * [title](#kwork_api.models.Kwork.title) - * [description](#kwork_api.models.Kwork.description) - * [price](#kwork_api.models.Kwork.price) - * [currency](#kwork_api.models.Kwork.currency) - * [category\_id](#kwork_api.models.Kwork.category_id) - * [seller](#kwork_api.models.Kwork.seller) - * [images](#kwork_api.models.Kwork.images) - * [rating](#kwork_api.models.Kwork.rating) - * [reviews\_count](#kwork_api.models.Kwork.reviews_count) - * [created\_at](#kwork_api.models.Kwork.created_at) - * [updated\_at](#kwork_api.models.Kwork.updated_at) - * [KworkDetails](#kwork_api.models.KworkDetails) - * [full\_description](#kwork_api.models.KworkDetails.full_description) - * [requirements](#kwork_api.models.KworkDetails.requirements) - * [delivery\_time](#kwork_api.models.KworkDetails.delivery_time) - * [revisions](#kwork_api.models.KworkDetails.revisions) - * [features](#kwork_api.models.KworkDetails.features) - * [faq](#kwork_api.models.KworkDetails.faq) - * [PaginationInfo](#kwork_api.models.PaginationInfo) - * [current\_page](#kwork_api.models.PaginationInfo.current_page) - * [total\_pages](#kwork_api.models.PaginationInfo.total_pages) - * [total\_items](#kwork_api.models.PaginationInfo.total_items) - * [items\_per\_page](#kwork_api.models.PaginationInfo.items_per_page) - * [has\_next](#kwork_api.models.PaginationInfo.has_next) - * [has\_prev](#kwork_api.models.PaginationInfo.has_prev) - * [CatalogResponse](#kwork_api.models.CatalogResponse) - * [kworks](#kwork_api.models.CatalogResponse.kworks) - * [pagination](#kwork_api.models.CatalogResponse.pagination) - * [filters](#kwork_api.models.CatalogResponse.filters) - * [sort\_options](#kwork_api.models.CatalogResponse.sort_options) - * [Project](#kwork_api.models.Project) - * [id](#kwork_api.models.Project.id) - * [title](#kwork_api.models.Project.title) - * [description](#kwork_api.models.Project.description) - * [budget](#kwork_api.models.Project.budget) - * [budget\_type](#kwork_api.models.Project.budget_type) - * [category\_id](#kwork_api.models.Project.category_id) - * [customer](#kwork_api.models.Project.customer) - * [status](#kwork_api.models.Project.status) - * [created\_at](#kwork_api.models.Project.created_at) - * [updated\_at](#kwork_api.models.Project.updated_at) - * [bids\_count](#kwork_api.models.Project.bids_count) - * [skills](#kwork_api.models.Project.skills) - * [ProjectsResponse](#kwork_api.models.ProjectsResponse) - * [projects](#kwork_api.models.ProjectsResponse.projects) - * [pagination](#kwork_api.models.ProjectsResponse.pagination) - * [Review](#kwork_api.models.Review) - * [id](#kwork_api.models.Review.id) - * [rating](#kwork_api.models.Review.rating) - * [comment](#kwork_api.models.Review.comment) - * [author](#kwork_api.models.Review.author) - * [kwork\_id](#kwork_api.models.Review.kwork_id) - * [created\_at](#kwork_api.models.Review.created_at) - * [ReviewsResponse](#kwork_api.models.ReviewsResponse) - * [reviews](#kwork_api.models.ReviewsResponse.reviews) - * [pagination](#kwork_api.models.ReviewsResponse.pagination) - * [average\_rating](#kwork_api.models.ReviewsResponse.average_rating) - * [Notification](#kwork_api.models.Notification) - * [id](#kwork_api.models.Notification.id) - * [type](#kwork_api.models.Notification.type) - * [title](#kwork_api.models.Notification.title) - * [message](#kwork_api.models.Notification.message) - * [is\_read](#kwork_api.models.Notification.is_read) - * [created\_at](#kwork_api.models.Notification.created_at) - * [link](#kwork_api.models.Notification.link) - * [NotificationsResponse](#kwork_api.models.NotificationsResponse) - * [notifications](#kwork_api.models.NotificationsResponse.notifications) - * [unread\_count](#kwork_api.models.NotificationsResponse.unread_count) - * [Dialog](#kwork_api.models.Dialog) - * [id](#kwork_api.models.Dialog.id) - * [participant](#kwork_api.models.Dialog.participant) - * [last\_message](#kwork_api.models.Dialog.last_message) - * [unread\_count](#kwork_api.models.Dialog.unread_count) - * [updated\_at](#kwork_api.models.Dialog.updated_at) - * [AuthResponse](#kwork_api.models.AuthResponse) - * [success](#kwork_api.models.AuthResponse.success) - * [user\_id](#kwork_api.models.AuthResponse.user_id) - * [username](#kwork_api.models.AuthResponse.username) - * [web\_auth\_token](#kwork_api.models.AuthResponse.web_auth_token) - * [message](#kwork_api.models.AuthResponse.message) - * [ErrorDetail](#kwork_api.models.ErrorDetail) - * [code](#kwork_api.models.ErrorDetail.code) - * [message](#kwork_api.models.ErrorDetail.message) - * [field](#kwork_api.models.ErrorDetail.field) - * [APIErrorResponse](#kwork_api.models.APIErrorResponse) - * [success](#kwork_api.models.APIErrorResponse.success) - * [errors](#kwork_api.models.APIErrorResponse.errors) - * [message](#kwork_api.models.APIErrorResponse.message) - * [City](#kwork_api.models.City) - * [id](#kwork_api.models.City.id) - * [name](#kwork_api.models.City.name) - * [country\_id](#kwork_api.models.City.country_id) - * [Country](#kwork_api.models.Country) - * [id](#kwork_api.models.Country.id) - * [name](#kwork_api.models.Country.name) - * [code](#kwork_api.models.Country.code) - * [cities](#kwork_api.models.Country.cities) - * [TimeZone](#kwork_api.models.TimeZone) - * [id](#kwork_api.models.TimeZone.id) - * [name](#kwork_api.models.TimeZone.name) - * [offset](#kwork_api.models.TimeZone.offset) - * [Feature](#kwork_api.models.Feature) - * [id](#kwork_api.models.Feature.id) - * [name](#kwork_api.models.Feature.name) - * [description](#kwork_api.models.Feature.description) - * [price](#kwork_api.models.Feature.price) - * [type](#kwork_api.models.Feature.type) - * [Badge](#kwork_api.models.Badge) - * [id](#kwork_api.models.Badge.id) - * [name](#kwork_api.models.Badge.name) - * [description](#kwork_api.models.Badge.description) - * [icon\_url](#kwork_api.models.Badge.icon_url) - * [DataResponse](#kwork_api.models.DataResponse) - * [success](#kwork_api.models.DataResponse.success) - * [data](#kwork_api.models.DataResponse.data) - * [message](#kwork_api.models.DataResponse.message) -* [kwork\_api.errors](#kwork_api.errors) - * [Any](#kwork_api.errors.Any) - * [Optional](#kwork_api.errors.Optional) - * [KworkError](#kwork_api.errors.KworkError) - * [\_\_init\_\_](#kwork_api.errors.KworkError.__init__) - * [\_\_str\_\_](#kwork_api.errors.KworkError.__str__) - * [KworkAuthError](#kwork_api.errors.KworkAuthError) - * [\_\_init\_\_](#kwork_api.errors.KworkAuthError.__init__) - * [\_\_str\_\_](#kwork_api.errors.KworkAuthError.__str__) - * [KworkApiError](#kwork_api.errors.KworkApiError) - * [\_\_init\_\_](#kwork_api.errors.KworkApiError.__init__) - * [\_\_str\_\_](#kwork_api.errors.KworkApiError.__str__) - * [KworkNotFoundError](#kwork_api.errors.KworkNotFoundError) - * [\_\_init\_\_](#kwork_api.errors.KworkNotFoundError.__init__) - * [KworkRateLimitError](#kwork_api.errors.KworkRateLimitError) - * [\_\_init\_\_](#kwork_api.errors.KworkRateLimitError.__init__) - * [KworkValidationError](#kwork_api.errors.KworkValidationError) - * [\_\_init\_\_](#kwork_api.errors.KworkValidationError.__init__) - * [\_\_str\_\_](#kwork_api.errors.KworkValidationError.__str__) - * [KworkNetworkError](#kwork_api.errors.KworkNetworkError) - * [\_\_init\_\_](#kwork_api.errors.KworkNetworkError.__init__) - * [\_\_str\_\_](#kwork_api.errors.KworkNetworkError.__str__) - - - -# Module kwork\_api - -Kwork.ru API Client - -Unofficial Python client for Kwork.ru API. - -**Example**: - - from kwork_api import KworkClient - - # Login with credentials - client = await KworkClient.login("username", "password") - - # Or restore from token - client = KworkClient(token="your_web_auth_token") - - # Get catalog - catalog = await client.catalog.get_list(page=1) - - - -## KworkClient - - - -## KworkError - - - -## KworkAuthError - - - -## KworkApiError - - - -#### \_\_version\_\_ - - - -#### \_\_all\_\_ - - - -# Module kwork\_api.client - -Kwork API Client. - -Main client class with authentication and all API endpoints. - - - -## logging - - - -## Any - - - -## Optional - - - -## httpx - - - -## HttpUrl - - - -## KworkApiError - - - -## KworkAuthError - - - -## KworkError - - - -## KworkNetworkError - - - -## KworkNotFoundError - - - -## KworkRateLimitError - - - -## KworkValidationError - - - -## APIErrorResponse - - - -## AuthResponse - - - -## Badge - - - -## CatalogResponse - - - -## City - - - -## Country - - - -## DataResponse - - - -## Dialog - - - -## Feature - - - -## Kwork - - - -## KworkDetails - - - -## NotificationsResponse - - - -## Project - - - -## ProjectsResponse - - - -## Review - - - -## ReviewsResponse - - - -## TimeZone - - - -#### logger - - - -## KworkClient - -```python -class KworkClient() -``` - -Асинхронный клиент для Kwork.ru API. - -Предоставляет доступ ко всем основным эндпоинтам Kwork API: -- Каталог кворков и поиск -- Биржа проектов (фриланс заказы) -- Пользовательские данные и отзывы -- Уведомления и сообщения -- Справочные данные (города, страны, категории) - -Аутентификация: -Клиент использует двухэтапную аутентификацию Kwork: -1. POST /signIn — получение session cookies -2. POST /getWebAuthToken — получение web_auth_token - -Примеры использования: -# Вход по логину/паролю -async with await KworkClient.login("username", "password") as client: -catalog = await client.catalog.get_list(page=1) - -# Восстановление сессии по токену -client = KworkClient(token="saved_web_auth_token") -user_info = await client.user.get_info() - -# Работа с проектами -projects = await client.projects.get_list(page=1) -my_orders = await client.projects.get_payer_orders() - -**Attributes**: - -- `catalog` - Доступ к каталогу кворков -- `projects` - Доступ к бирже проектов -- `user` - Пользовательские эндпоинты -- `reference` - Справочные данные -- `notifications` - Уведомления и сообщения -- `other` - Прочие эндпоинты - - -**Notes**: - - Клиент поддерживает context manager для автоматического закрытия соединения. - Рекомендуется использовать `async with` для корректного освобождения ресурсов. - - - -#### BASE\_URL - - - -#### LOGIN\_URL - - - -#### TOKEN\_URL - - - -#### KworkClient.\_\_init\_\_ - -```python -def __init__(token: Optional[str] = None, - cookies: Optional[dict[str, str]] = None, - timeout: float = 30.0, - base_url: Optional[str] = None) -``` - -Инициализация клиента. - -Создаёт неаутентифицированный клиент или восстанавливает сессию -по ранее полученному токену. - -**Arguments**: - -- `token` - Web auth token, полученный через `getWebAuthToken` или `login()`. - Если указан, автоматически добавляется в cookies. -- `cookies` - Session cookies из предыдущей аутентификации. - Обычно не требуется — устанавливаются автоматически из token. -- `timeout` - Таймаут HTTP запросов в секундах. По умолчанию 30 секунд. -- `base_url` - Кастомный базовый URL. Используется только для тестирования. - - -**Example**: - - # Новый клиент без аутентификации - client = KworkClient() - - # Восстановление сессии - client = KworkClient(token="eyJ0eXAiOiJKV1QiLCJhbGc...") - - # Клиент с кастомным таймаутом - client = KworkClient(timeout=60.0) - - -**Notes**: - - Для полноценной работы API требуется аутентификация. - Используйте `login()` или передайте сохранённый token. - - - -#### KworkClient.login - -```python -@classmethod -async def login(cls, - username: str, - password: str, - timeout: float = 30.0) -> "KworkClient" -``` - -Аутентификация по логину и паролю. - -Выполняет двухэтапный процесс аутентификации Kwork: -1. POST /signIn — проверка учётных данных, получение session cookies -2. POST /getWebAuthToken — обмен cookies на web_auth_token - -Полученный токен и cookies сохраняются в клиенте для последующих запросов. - -**Arguments**: - -- `username` - Логин или email аккаунта Kwork. -- `password` - Пароль аккаунта Kwork. -- `timeout` - Таймаут запросов в секундах. Применяется к каждому этапу. - - -**Returns**: - - Полностью аутентифицированный экземпляр KworkClient, - готовый к работе с API. - - -**Raises**: - -- `KworkAuthError` - Если логин/пароль неверны или токен не получен. -- `KworkNetworkError` - Если произошла ошибка сети. - - -**Example**: - - # Базовое использование - client = await KworkClient.login("myuser", "mypassword") - - # С кастомным таймаутом - client = await KworkClient.login("user", "pass", timeout=60.0) - - # Сохранение токена для повторного использования - token = client._token - # Позже: client = KworkClient(token=token) - - Security: - Пароль не сохраняется в клиенте. Только token и cookies. - Рекомендуется сохранять token для повторного использования - вместо хранения пароля. - - -**Notes**: - - Токен имеет ограниченное время жизни. При получении 401 ошибки - необходимо выполнить повторный login(). - - - -#### KworkClient.close - -```python -async def close() -> None -``` - -Close HTTP client. - - - -#### KworkClient.\_\_aenter\_\_ - -```python -async def __aenter__() -> "KworkClient" -``` - - - -#### KworkClient.\_\_aexit\_\_ - -```python -async def __aexit__(*args: Any) -> None -``` - - - -## CatalogAPI - -```python -class CatalogAPI() -``` - -API каталога кворков. - -Предоставляет доступ к каталогу услуг Kwork: -- Поиск и фильтрация кворков -- Получение детальной информации -- Категории и сортировка - -**Example**: - - # Получить первую страницу каталога - catalog = await client.catalog.get_list(page=1) - - # Фильтрация по категории - catalog = await client.catalog.get_list(category_id=5) - - # Детали конкретного кворка - details = await client.catalog.get_details(kwork_id=12345) - - - -#### CatalogAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### CatalogAPI.get\_list - -```python -async def get_list(page: int = 1, - category_id: Optional[int] = None, - sort: str = "recommend") -> CatalogResponse -``` - -Получить список кворков из каталога. - -Основной эндпоинт для поиска и просмотра кворков. -Возвращает пагинированный список с возможностью фильтрации. - -**Arguments**: - -- `page` - Номер страницы для пагинации (начиная с 1). -- `category_id` - ID категории для фильтрации. - Если None — все категории. -- `sort` - Опция сортировки. Варианты: - - "recommend" — по рекомендации (по умолчанию) - - "price_asc" — по возрастанию цены - - "price_desc" — по убыванию цены - - "rating" — по рейтингу - - "reviews" — по количеству отзывов - - "newest" — по дате создания - - -**Returns**: - - CatalogResponse содержащий: - - kworks: список кворков на странице - - pagination: информация о пагинации - - filters: доступные фильтры - - sort_options: доступные опции сортировки - - -**Example**: - - # Первая страница, сортировка по цене - response = await client.catalog.get_list( - page=1, - sort="price_asc" - ) - - for kwork in response.kworks: -- `print(f"{kwork.title}` - {kwork.price} RUB") - - # Пагинация - if response.pagination and response.pagination.has_next: - next_page = await client.catalog.get_list(page=2) - - - -#### CatalogAPI.get\_details - -```python -async def get_details(kwork_id: int) -> KworkDetails -``` - -Получить полную информацию о кворке. - -Возвращает расширенную информацию о кворке включая: -- Полное описание и требования -- Сроки выполнения и количество правок -- Дополнительные опции (features) -- FAQ от продавца - -**Arguments**: - -- `kwork_id` - Уникальный идентификатор кворка. - - -**Returns**: - - KworkDetails с полной информацией о кворке. - - -**Raises**: - -- `KworkNotFoundError` - Если кворк с таким ID не найден. - - -**Example**: - - details = await client.catalog.get_details(12345) -- `print(f"Название` - {details.title}") -- `print(f"Цена` - {details.price} {details.currency}") -- `print(f"Срок` - {details.delivery_time} дней") -- `print(f"Правки` - {details.revisions}") - - - -#### CatalogAPI.get\_details\_extra - -```python -async def get_details_extra(kwork_id: int) -> dict[str, Any] -``` - -Получить дополнительные детали кворка. - -Возвращает расширенную информацию, которая не включена -в основной ответ get_details(). Может содержать: -- Дополнительные изображения -- Видео обзоры -- Детали пакетов услуг -- Статистику продаж - -**Arguments**: - -- `kwork_id` - Уникальный идентификатор кворка. - - -**Returns**: - - Словарь с дополнительными данными. Структура зависит - от конкретного кворка и не гарантируется стабильной. - - -**Notes**: - - Этот эндпоинт возвращает "сырые" данные без валидации. - Структура ответа может измениться без предупреждения. - - - -## ProjectsAPI - -```python -class ProjectsAPI() -``` - -API биржи проектов (фриланс заказы). - -Предоставляет доступ к заказам на фриланс: -- Просмотр открытых проектов -- Заказы где вы заказчик (payer) -- Заказы где вы исполнитель (worker) - -**Example**: - - # Новые проекты - projects = await client.projects.get_list(page=1) - - # Мои заказы как заказчика - my_orders = await client.projects.get_payer_orders() - - # Мои заказы как исполнителя - my_work = await client.projects.get_worker_orders() - - - -#### ProjectsAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### ProjectsAPI.get\_list - -```python -async def get_list(page: int = 1, - category_id: Optional[int] = None) -> ProjectsResponse -``` - -Получить список проектов с биржи. - -Основной эндпоинт для просмотра доступных заказов. -Возвращает пагинированный список проектов. - -**Arguments**: - -- `page` - Номер страницы (начиная с 1). -- `category_id` - ID категории для фильтрации. - Если None — все категории. - - -**Returns**: - - ProjectsResponse содержащий: - - projects: список проектов на странице - - pagination: информация о пагинации - - -**Example**: - - # Все новые проекты - response = await client.projects.get_list(page=1) - - for project in response.projects: -- `print(f"{project.title}` - {project.budget} {project.budget_type}") - - # Только категория "Разработка" - dev_projects = await client.projects.get_list( - page=1, - category_id=5 - ) - - - -#### ProjectsAPI.get\_payer\_orders - -```python -async def get_payer_orders() -> list[Project] -``` - -Получить заказы где вы являетесь заказчиком. - -Возвращает все проекты, созданные текущим пользователем, -независимо от их статуса (открыт, в работе, завершён). - -**Returns**: - - Список проектов где текущий пользователь — заказчик. - - -**Example**: - - orders = await client.projects.get_payer_orders() - for order in orders: - print(f"Заказ #{order.id}: {order.status}") - - - -#### ProjectsAPI.get\_worker\_orders - -```python -async def get_worker_orders() -> list[Project] -``` - -Получить заказы где вы являетесь исполнителем. - -Возвращает все проекты, где текущий пользователь -назначен исполнителем. - -**Returns**: - - Список проектов где текущий пользователь — исполнитель. - - -**Example**: - - work = await client.projects.get_worker_orders() - active = [p for p in work if p.status == "in_progress"] - print(f"Активных заказов: {len(active)}") - - - -## UserAPI - -```python -class UserAPI() -``` - -Пользовательское API. - -Предоставляет доступ к данным текущего пользователя: -- Профиль и информация об аккаунте -- Отзывы (полученные и оставленные) -- Избранные кворки - -**Example**: - - # Информация о пользователе - info = await client.user.get_info() - - # Мои отзывы - reviews = await client.user.get_reviews() - - # Избранные кворки - favorites = await client.user.get_favorite_kworks() - - - -#### UserAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### UserAPI.get\_info - -```python -async def get_info() -> dict[str, Any] -``` - -Получить информацию о текущем пользователе. - -Возвращает основные данные аккаунта: -- ID, username, email -- Баланс, рейтинг -- Статус верификации -- Настройки профиля - -**Returns**: - - Словарь с информацией о пользователе. - Структура зависит от ответа API. - - -**Example**: - - info = await client.user.get_info() -- `print(f"User` - {info.get('username')}") -- `print(f"Balance` - {info.get('balance')} RUB") - - - -#### UserAPI.get\_reviews - -```python -async def get_reviews(user_id: Optional[int] = None, - page: int = 1) -> ReviewsResponse -``` - -Получить отзывы пользователя. - -Если user_id не указан — возвращает отзывы текущего пользователя. -Если указан — отзывы другого пользователя по ID. - -**Arguments**: - -- `user_id` - ID пользователя. Если None — текущий пользователь. -- `page` - Номер страницы для пагинации (начиная с 1). - - -**Returns**: - - ReviewsResponse содержащий: - - reviews: список отзывов на странице - - pagination: информация о пагинации - - average_rating: средний рейтинг - - -**Example**: - - # Мои отзывы - my_reviews = await client.user.get_reviews() - - # Отзывы другого пользователя - user_reviews = await client.user.get_reviews(user_id=12345) - - # С пагинацией - page2 = await client.user.get_reviews(page=2) - - - -#### UserAPI.get\_favorite\_kworks - -```python -async def get_favorite_kworks() -> list[Kwork] -``` - -Получить список избранных кворков. - -Возвращает все кворки, добавленные пользователем в избранное. - -**Returns**: - - Список избранных кворков. - - -**Example**: - - favorites = await client.user.get_favorite_kworks() - for kwork in favorites: -- `print(f"{kwork.title}` - {kwork.price} RUB") - - - -## ReferenceAPI - -```python -class ReferenceAPI() -``` - -Справочное API. - -Предоставляет доступ к справочным данным Kwork: -- Города, страны, часовые пояса -- Доступные функции и дополнения -- Значки пользователей - -Эти данные редко меняются и могут быть закэшированы. - -**Example**: - - # Все страны - countries = await client.reference.get_countries() - - # Все города - cities = await client.reference.get_cities() - - # Доступные фичи - features = await client.reference.get_features() - - - -#### ReferenceAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### ReferenceAPI.get\_cities - -```python -async def get_cities() -> list[City] -``` - -Получить список всех городов. - -**Returns**: - - Список всех городов из справочника Kwork. - - -**Example**: - - cities = await client.reference.get_cities() - moscow = next(c for c in cities if c.name == "Москва") - - - -#### ReferenceAPI.get\_countries - -```python -async def get_countries() -> list[Country] -``` - -Получить список всех стран. - -**Returns**: - - Список всех стран с кодами и городами. - - -**Example**: - - countries = await client.reference.get_countries() - russia = next(c for c in countries if c.code == "RU") - - - -#### ReferenceAPI.get\_timezones - -```python -async def get_timezones() -> list[TimeZone] -``` - -Получить список всех часовых поясов. - -**Returns**: - - Список часовых поясов с названиями и смещениями. - - -**Example**: - - timezones = await client.reference.get_timezones() - msks = next(tz for tz in timezones if "Moscow" in tz.name) - - - -#### ReferenceAPI.get\_features - -```python -async def get_features() -> list[Feature] -``` - -Получить доступные дополнительные функции (features). - -Features — это платные дополнения к кворкам: -- Увеличенные сроки -- Дополнительные правки -- Приоритетная поддержка -- и т.д. - -**Returns**: - - Список доступных features с названиями и ценами. - - -**Example**: - - features = await client.reference.get_features() - for f in features: -- `print(f"{f.name}` - {f.price} RUB") - - - -#### ReferenceAPI.get\_public\_features - -```python -async def get_public_features() -> list[Feature] -``` - -Получить публичные функции. - -Аналогично get_features(), но возвращает только -публично доступные опции. - -**Returns**: - - Список публичных features. - - - -#### ReferenceAPI.get\_badges\_info - -```python -async def get_badges_info() -> list[Badge] -``` - -Получить информацию о значках пользователей. - -Значки (badges) отображают достижения и статусы: -- "Профессионал" -- "Быстрый ответ" -- "Надёжный продавец" -- и т.д. - -**Returns**: - - Список значков с описаниями и иконками. - - -**Example**: - - badges = await client.reference.get_badges_info() - for badge in badges: -- `print(f"{badge.name}` - {badge.description}") - - - -## NotificationsAPI - -```python -class NotificationsAPI() -``` - -API уведомлений и сообщений. - -Предоставляет доступ к системе уведомлений Kwork: -- Список уведомлений -- Получение новых уведомлений -- Диалоги с пользователями -- Заблокированные диалоги - -**Example**: - - # Все уведомления - notifications = await client.notifications.get_list() - - # Новые уведомления - new = await client.notifications.fetch() - - # Диалоги - dialogs = await client.notifications.get_dialogs() - - - -#### NotificationsAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### NotificationsAPI.get\_list - -```python -async def get_list() -> NotificationsResponse -``` - -Получить список всех уведомлений. - -Возвращает все уведомления пользователя с информацией -о прочтении. - -**Returns**: - - NotificationsResponse содержащий: - - notifications: список уведомлений - - unread_count: количество непрочитанных - - -**Example**: - - notifs = await client.notifications.get_list() -- `print(f"Непрочитанных` - {notifs.unread_count}") - - for n in notifs.notifications: - if not n.is_read: -- `print(f"Новое` - {n.title}") - - - -#### NotificationsAPI.fetch - -```python -async def fetch() -> NotificationsResponse -``` - -Получить новые уведомления. - -Отличается от get_list() тем, что возвращает только -уведомления, появившиеся с момента последнего запроса. -Также может обновлять счётчик непрочитанных. - -**Returns**: - - NotificationsResponse с новыми уведомлениями. - - -**Example**: - - new_notifs = await client.notifications.fetch() - if new_notifs.unread_count > 0: - print(f"У вас {new_notifs.unread_count} новых уведомлений!") - - - -#### NotificationsAPI.get\_dialogs - -```python -async def get_dialogs() -> list[Dialog] -``` - -Получить список диалогов (чатов). - -Возвращает все активные диалоги пользователя с другими -пользователями Kwork. - -**Returns**: - - Список диалогов с последней перепиской. - - -**Example**: - - dialogs = await client.notifications.get_dialogs() - for d in dialogs: - print(f"С {d.participant.username}: {d.last_message}") - - - -#### NotificationsAPI.get\_blocked\_dialogs - -```python -async def get_blocked_dialogs() -> list[Dialog] -``` - -Получить список заблокированных диалогов. - -Возвращает диалоги с пользователями, которые были -заблокированы текущим пользователем. - -**Returns**: - - Список заблокированных диалогов. - - -**Example**: - - blocked = await client.notifications.get_blocked_dialogs() -- `print(f"Заблокировано` - {len(blocked)} пользователей") - - - -## OtherAPI - -```python -class OtherAPI() -``` - -Прочее API. - -Вспомогательные эндпоинты которые не вошли в другие категории: -- Пользовательские настройки и предпочтения (wants) -- Статусы кворков и заказов -- Персональные предложения (offers) -- Настройки профиля -- Статус онлайн/оффлайн - -**Example**: - - # Пользовательские предпочтения - wants = await client.other.get_wants() - - # Статус кворков - status = await client.other.get_kworks_status() - - # Установить статус оффлайн - await client.other.go_offline() - - - -#### OtherAPI.\_\_init\_\_ - -```python -def __init__(client: "KworkClient") -``` - - - -#### OtherAPI.get\_wants - -```python -async def get_wants() -> dict[str, Any] -``` - -Получить пользовательские предпочтения (wants). - -Wants — это настройки интересов пользователя: -- Предпочитаемые категории -- Ключевые слова для мониторинга -- Фильтры для поиска - -**Returns**: - - Словарь с настройками предпочтений. - - -**Example**: - - wants = await client.other.get_wants() - print(wants) - - - -#### OtherAPI.get\_wants\_status - -```python -async def get_wants_status() -> dict[str, Any] -``` - -Получить статус предпочтений. - -**Returns**: - - Статус wants с метаданными. - - - -#### OtherAPI.get\_kworks\_status - -```python -async def get_kworks_status() -> dict[str, Any] -``` - -Получить статусы кворков пользователя. - -Возвращает информацию о статусах всех кворков -текущего пользователя (активен, на модерации, и т.д.). - -**Returns**: - - Словарь со статусами кворков. - - -**Example**: - - status = await client.other.get_kworks_status() - print(status) - - - -#### OtherAPI.get\_offers - -```python -async def get_offers() -> dict[str, Any] -``` - -Получить персональные предложения. - -**Returns**: - - Список персональных предложений от Kwork. - - - -#### OtherAPI.get\_exchange\_info - -```python -async def get_exchange_info() -> dict[str, Any] -``` - -Получить информацию об обмене валюты. - -**Returns**: - - Информация о курсах валют и обмене. - - - -#### OtherAPI.get\_channel - -```python -async def get_channel() -> dict[str, Any] -``` - -Получить информацию о канале пользователя. - -**Returns**: - - Данные канала (если есть). - - - -#### OtherAPI.get\_in\_app\_notification - -```python -async def get_in_app_notification() -> dict[str, Any] -``` - -Получить внутриприложенное уведомление. - -**Returns**: - - Данные in-app уведомления. - - - -#### OtherAPI.get\_security\_user\_data - -```python -async def get_security_user_data() -> dict[str, Any] -``` - -Получить данные безопасности пользователя. - -**Returns**: - - Информация о безопасности аккаунта. - - - -#### OtherAPI.is\_dialog\_allow - -```python -async def is_dialog_allow(user_id: int) -> bool -``` - -Проверить возможность начала диалога с пользователем. - -**Arguments**: - -- `user_id` - ID пользователя для проверки. - - -**Returns**: - - True если диалог разрешён, False иначе. - - -**Example**: - - allowed = await client.other.is_dialog_allow(12345) - if allowed: - print("Можно написать сообщение") - - - -#### OtherAPI.get\_viewed\_kworks - -```python -async def get_viewed_kworks() -> list[Kwork] -``` - -Получить просмотренные кворки. - -Возвращает список кворков, которые пользователь -просматривал ранее. - -**Returns**: - - Список просмотренных кворков. - - -**Example**: - - viewed = await client.other.get_viewed_kworks() -- `print(f"Просмотрено` - {len(viewed)} кворков") - - - -#### OtherAPI.get\_favorite\_categories - -```python -async def get_favorite_categories() -> list[int] -``` - -Получить ID избранных категорий. - -**Returns**: - - Список ID категорий, добавленных в избранное. - - -**Example**: - - cats = await client.other.get_favorite_categories() - print(f"Избранные категории: {cats}") - - - -#### OtherAPI.update\_settings - -```python -async def update_settings(settings: dict[str, Any]) -> dict[str, Any] -``` - -Обновить настройки пользователя. - -**Arguments**: - -- `settings` - Словарь с настройками для обновления. - Структура зависит от конкретных настроек. - - -**Returns**: - - Ответ API с подтверждением обновления. - - -**Example**: - - await client.other.update_settings({ -- `"email_notifications"` - True, -- `"language"` - "ru" - }) - - - -#### OtherAPI.go\_offline - -```python -async def go_offline() -> dict[str, Any] -``` - -Установить статус пользователя "оффлайн". - -Скрывает онлайн-статус от других пользователей. - -**Returns**: - - Подтверждение изменения статуса. - - -**Example**: - - await client.other.go_offline() - - - -#### OtherAPI.get\_actor - -```python -async def get_actor() -> dict[str, Any] -``` - -Получить информацию об актёре (текущем пользователе). - -**Returns**: - - Данные актёра/пользователя. - - - -#### KworkClient.catalog - -```python -@property -def catalog() -> CatalogAPI -``` - -API каталога кворков. - -**Returns**: - - CatalogAPI для работы с каталогом. - - - -#### KworkClient.projects - -```python -@property -def projects() -> ProjectsAPI -``` - -API биржи проектов. - -**Returns**: - - ProjectsAPI для работы с проектами. - - - -#### KworkClient.user - -```python -@property -def user() -> UserAPI -``` - -Пользовательское API. - -**Returns**: - - UserAPI для работы с профилем. - - - -#### KworkClient.reference - -```python -@property -def reference() -> ReferenceAPI -``` - -Справочное API. - -**Returns**: - - ReferenceAPI для справочных данных. - - - -#### KworkClient.notifications - -```python -@property -def notifications() -> NotificationsAPI -``` - -API уведомлений. - -**Returns**: - - NotificationsAPI для уведомлений и сообщений. - - - -#### KworkClient.other - -```python -@property -def other() -> OtherAPI -``` - -Прочее API. - -**Returns**: - - OtherAPI для вспомогательных эндпоинтов. - - - -# Module kwork\_api.models - -Pydantic models for Kwork API responses. - -All models follow the structure found in the HAR dump analysis. - - - -## datetime - - - -## Any - - - -## Optional - - - -## BaseModel - - - -## Field - - - -## KworkUser - -```python -class KworkUser(BaseModel) -``` - -User information. - - - -#### id - - - -#### username - - - -#### avatar\_url - - - -#### is\_online - - - -#### rating - - - -## KworkCategory - -```python -class KworkCategory(BaseModel) -``` - -Category information. - - - -#### id - - - -#### name - - - -#### slug - - - -#### parent\_id - - - -## Kwork - -```python -class Kwork(BaseModel) -``` - -Kwork (service) information. - - - -#### id - - - -#### title - - - -#### description - - - -#### price - - - -#### currency - - - -#### category\_id - - - -#### seller - - - -#### images - - - -#### rating - - - -#### reviews\_count - - - -#### created\_at - - - -#### updated\_at - - - -## KworkDetails - -```python -class KworkDetails(Kwork) -``` - -Extended kwork details. - - - -#### full\_description - - - -#### requirements - - - -#### delivery\_time - -in days - - - -#### revisions - - - -#### features - - - -#### faq - - - -## PaginationInfo - -```python -class PaginationInfo(BaseModel) -``` - -Pagination metadata. - - - -#### current\_page - - - -#### total\_pages - - - -#### total\_items - - - -#### items\_per\_page - - - -#### has\_next - - - -#### has\_prev - - - -## CatalogResponse - -```python -class CatalogResponse(BaseModel) -``` - -Catalog response with kworks and pagination. - - - -#### kworks - - - -#### pagination - - - -#### filters - - - -#### sort\_options - - - -## Project - -```python -class Project(BaseModel) -``` - -Project (freelance order) information. - - - -#### id - - - -#### title - - - -#### description - - - -#### budget - - - -#### budget\_type - -fixed, hourly - - - -#### category\_id - - - -#### customer - - - -#### status - -open, in_progress, completed, cancelled - - - -#### created\_at - - - -#### updated\_at - - - -#### bids\_count - - - -#### skills - - - -## ProjectsResponse - -```python -class ProjectsResponse(BaseModel) -``` - -Projects list response. - - - -#### projects - - - -#### pagination - - - -## Review - -```python -class Review(BaseModel) -``` - -Review information. - - - -#### id - - - -#### rating - - - -#### comment - - - -#### author - - - -#### kwork\_id - - - -#### created\_at - - - -## ReviewsResponse - -```python -class ReviewsResponse(BaseModel) -``` - -Reviews list response. - - - -#### reviews - - - -#### pagination - - - -#### average\_rating - - - -## Notification - -```python -class Notification(BaseModel) -``` - -Notification information. - - - -#### id - - - -#### type - -message, order, system, etc. - - - -#### title - - - -#### message - - - -#### is\_read - - - -#### created\_at - - - -#### link - - - -## NotificationsResponse - -```python -class NotificationsResponse(BaseModel) -``` - -Notifications list response. - - - -#### notifications - - - -#### unread\_count - - - -## Dialog - -```python -class Dialog(BaseModel) -``` - -Dialog (chat) information. - - - -#### id - - - -#### participant - - - -#### last\_message - - - -#### unread\_count - - - -#### updated\_at - - - -## AuthResponse - -```python -class AuthResponse(BaseModel) -``` - -Authentication response. - - - -#### success - - - -#### user\_id - - - -#### username - - - -#### web\_auth\_token - - - -#### message - - - -## ErrorDetail - -```python -class ErrorDetail(BaseModel) -``` - -Error detail from API. - - - -#### code - - - -#### message - - - -#### field - - - -## APIErrorResponse - -```python -class APIErrorResponse(BaseModel) -``` - -Standard API error response. - - - -#### success - - - -#### errors - - - -#### message - - - -## City - -```python -class City(BaseModel) -``` - -City information. - - - -#### id - - - -#### name - - - -#### country\_id - - - -## Country - -```python -class Country(BaseModel) -``` - -Country information. - - - -#### id - - - -#### name - - - -#### code - - - -#### cities - - - -## TimeZone - -```python -class TimeZone(BaseModel) -``` - -Timezone information. - - - -#### id - - - -#### name - - - -#### offset - -e.g., "+03:00" - - - -## Feature - -```python -class Feature(BaseModel) -``` - -Feature/addon information. - - - -#### id - - - -#### name - - - -#### description - - - -#### price - - - -#### type - -extra, premium, etc. - - - -## Badge - -```python -class Badge(BaseModel) -``` - -User badge information. - - - -#### id - - - -#### name - - - -#### description - - - -#### icon\_url - - - -## DataResponse - -```python -class DataResponse(BaseModel) -``` - -Generic data response wrapper. - - - -#### success - - - -#### data - - - -#### message - - - -# Module kwork\_api.errors - -Kwork API exceptions. - -All exceptions provide clear error messages for debugging. - - - -## Any - - - -## Optional - - - -## KworkError - -```python -class KworkError(Exception) -``` - -Base exception for all Kwork API errors. - - - -#### KworkError.\_\_init\_\_ - -```python -def __init__(message: str, response: Optional[Any] = None) -``` - - - -#### KworkError.\_\_str\_\_ - -```python -def __str__() -> str -``` - - - -## KworkAuthError - -```python -class KworkAuthError(KworkError) -``` - -Authentication/authorization error. - - - -#### KworkAuthError.\_\_init\_\_ - -```python -def __init__(message: str = "Authentication failed", - response: Optional[Any] = None) -``` - - - -#### KworkAuthError.\_\_str\_\_ - -```python -def __str__() -> str -``` - - - -## KworkApiError - -```python -class KworkApiError(KworkError) -``` - -API request error (4xx, 5xx). - - - -#### KworkApiError.\_\_init\_\_ - -```python -def __init__(message: str, - status_code: Optional[int] = None, - response: Optional[Any] = None) -``` - - - -#### KworkApiError.\_\_str\_\_ - -```python -def __str__() -> str -``` - - - -## KworkNotFoundError - -```python -class KworkNotFoundError(KworkApiError) -``` - -Resource not found (404). - - - -#### KworkNotFoundError.\_\_init\_\_ - -```python -def __init__(resource: str, response: Optional[Any] = None) -``` - - - -## KworkRateLimitError - -```python -class KworkRateLimitError(KworkApiError) -``` - -Rate limit exceeded (429). - - - -#### KworkRateLimitError.\_\_init\_\_ - -```python -def __init__(message: str = "Rate limit exceeded", - response: Optional[Any] = None) -``` - - - -## KworkValidationError - -```python -class KworkValidationError(KworkApiError) -``` - -Validation error (400). - - - -#### KworkValidationError.\_\_init\_\_ - -```python -def __init__(message: str = "Validation failed", - fields: Optional[dict[str, list[str]]] = None, - response: Optional[Any] = None) -``` - - - -#### KworkValidationError.\_\_str\_\_ - -```python -def __str__() -> str -``` - - - -## KworkNetworkError - -```python -class KworkNetworkError(KworkError) -``` - -Network/connection error. - - - -#### KworkNetworkError.\_\_init\_\_ - -```python -def __init__(message: str = "Network error", response: Optional[Any] = None) -``` - - - -#### KworkNetworkError.\_\_str\_\_ - -```python -def __str__() -> str -``` -