fix: use csrf_user_token from cookies as auth token

This commit is contained in:
root 2026-03-29 21:52:19 +00:00
parent e478807aa4
commit 4c98d27e72
3 changed files with 38 additions and 32 deletions

View File

@ -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": [

View File

@ -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")
raise KworkAuthError(f"Login failed: no userId in cookies. Response: {response_data}")
# Extract web_auth_token from response
web_token = response_data.get("web_auth_token") or cookies.get("web_auth_token")
# 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 - это настройки интересов пользователя:
- Предпочитаемые категории
- Ключевые слова для мониторинга
- Фильтры для поиска