diff --git a/Untitled.ipynb b/Untitled.ipynb index c841c93..e677803 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "id": "f28552f1-618c-4853-92e2-566554a2de2c", "metadata": {}, "outputs": [ @@ -12,7 +12,7 @@ "True" ] }, - "execution_count": 1, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 14, "id": "953d142e-a575-41b7-927d-8cd1546d2747", "metadata": {}, "outputs": [ diff --git a/src/kwork_api/__pycache__/client.cpython-312.pyc b/src/kwork_api/__pycache__/client.cpython-312.pyc index 43a1a1d..fb883fa 100644 Binary files a/src/kwork_api/__pycache__/client.cpython-312.pyc and b/src/kwork_api/__pycache__/client.cpython-312.pyc differ diff --git a/src/kwork_api/client.py b/src/kwork_api/client.py index 16b5c37..b380e3d 100644 --- a/src/kwork_api/client.py +++ b/src/kwork_api/client.py @@ -51,8 +51,8 @@ class KworkClient: Аутентификация: Клиент использует двухэтапную аутентификацию Kwork: - 1. POST /signIn — получение session cookies - 2. POST /getWebAuthToken — получение web_auth_token + 1. POST /signIn - получение session cookies + 2. POST /getWebAuthToken - получение web_auth_token Примеры использования: # Вход по логину/паролю @@ -99,7 +99,7 @@ class KworkClient: token: Web auth token, полученный через `getWebAuthToken` или `login()`. Если указан, автоматически добавляется в cookies. cookies: Session cookies из предыдущей аутентификации. - Обычно не требуется — устанавливаются автоматически из token. + Обычно не требуется - устанавливаются автоматически из token. timeout: Таймаут HTTP запросов в секундах. По умолчанию 30 секунд. base_url: Кастомный базовый URL. Используется только для тестирования. @@ -197,8 +197,8 @@ class KworkClient: Аутентификация по логину и паролю. Выполняет двухэтапный процесс аутентификации Kwork: - 1. POST /signIn — проверка учётных данных, получение session cookies - 2. POST /getWebAuthToken — обмен cookies на web_auth_token + 1. POST /signIn - проверка учётных данных, получение session cookies + 2. POST /getWebAuthToken - обмен cookies на web_auth_token Полученный токен и cookies сохраняются в клиенте для последующих запросов. @@ -264,19 +264,25 @@ class KworkClient: raise KworkAuthError(f"Login failed: {response.status_code}") response_data = response.json() - - # Extract userId from response or cookies cookies = dict(response.cookies) - user_id = response_data.get("user_id") or cookies.get("userId") - + + # Debug: print response for troubleshooting + import logging + logger = logging.getLogger(__name__) + logger.debug(f"Login response: {response_data}") + logger.debug(f"Login cookies: {cookies}") + + # Extract userId from cookies + user_id = cookies.get("userId") + if not user_id: - raise KworkAuthError("Login failed: no userId in response") - - # Extract web_auth_token from response - web_token = response_data.get("web_auth_token") or cookies.get("web_auth_token") + raise KworkAuthError(f"Login failed: no userId in cookies. Response: {response_data}") + # Extract auth token from cookies (Kwork uses csrf_user_token or slrememberme) + web_token = cookies.get("csrf_user_token") or cookies.get("slrememberme") + if not web_token: - raise KworkAuthError("No web_auth_token in response") + raise KworkAuthError(f"No auth token in cookies. Cookies: {cookies}") # Create new client with token return cls(token=web_token, cookies=cookies, timeout=timeout) @@ -430,14 +436,14 @@ class KworkClient: Args: page: Номер страницы для пагинации (начиная с 1). category_id: ID категории для фильтрации. - Если None — все категории. + Если None - все категории. sort: Опция сортировки. Варианты: - - "recommend" — по рекомендации (по умолчанию) - - "price_asc" — по возрастанию цены - - "price_desc" — по убыванию цены - - "rating" — по рейтингу - - "reviews" — по количеству отзывов - - "newest" — по дате создания + - "recommend" - по рекомендации (по умолчанию) + - "price_asc" - по возрастанию цены + - "price_desc" - по убыванию цены + - "rating" - по рейтингу + - "reviews" - по количеству отзывов + - "newest" - по дате создания Returns: CatalogResponse содержащий: @@ -571,7 +577,7 @@ class KworkClient: Args: page: Номер страницы (начиная с 1). category_id: ID категории для фильтрации. - Если None — все категории. + Если None - все категории. Returns: ProjectsResponse содержащий: @@ -609,7 +615,7 @@ class KworkClient: независимо от их статуса (открыт, в работе, завершён). Returns: - Список проектов где текущий пользователь — заказчик. + Список проектов где текущий пользователь - заказчик. Example: orders = await client.projects.get_payer_orders() @@ -627,7 +633,7 @@ class KworkClient: назначен исполнителем. Returns: - Список проектов где текущий пользователь — исполнитель. + Список проектов где текущий пользователь - исполнитель. Example: work = await client.projects.get_worker_orders() @@ -691,11 +697,11 @@ class KworkClient: """ Получить отзывы пользователя. - Если user_id не указан — возвращает отзывы текущего пользователя. - Если указан — отзывы другого пользователя по ID. + Если user_id не указан - возвращает отзывы текущего пользователя. + Если указан - отзывы другого пользователя по ID. Args: - user_id: ID пользователя. Если None — текущий пользователь. + user_id: ID пользователя. Если None - текущий пользователь. page: Номер страницы для пагинации (начиная с 1). Returns: @@ -811,7 +817,7 @@ class KworkClient: """ Получить доступные дополнительные функции (features). - Features — это платные дополнения к кворкам: + Features - это платные дополнения к кворкам: - Увеличенные сроки - Дополнительные правки - Приоритетная поддержка @@ -996,7 +1002,7 @@ class KworkClient: """ Получить пользовательские предпочтения (wants). - Wants — это настройки интересов пользователя: + Wants - это настройки интересов пользователя: - Предпочитаемые категории - Ключевые слова для мониторинга - Фильтры для поиска