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": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 13,
"id": "f28552f1-618c-4853-92e2-566554a2de2c", "id": "f28552f1-618c-4853-92e2-566554a2de2c",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@ -12,7 +12,7 @@
"True" "True"
] ]
}, },
"execution_count": 1, "execution_count": 13,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
@ -28,7 +28,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 14,
"id": "953d142e-a575-41b7-927d-8cd1546d2747", "id": "953d142e-a575-41b7-927d-8cd1546d2747",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [

View File

@ -51,8 +51,8 @@ class KworkClient:
Аутентификация: Аутентификация:
Клиент использует двухэтапную аутентификацию Kwork: Клиент использует двухэтапную аутентификацию Kwork:
1. POST /signIn получение session cookies 1. POST /signIn - получение session cookies
2. POST /getWebAuthToken получение web_auth_token 2. POST /getWebAuthToken - получение web_auth_token
Примеры использования: Примеры использования:
# Вход по логину/паролю # Вход по логину/паролю
@ -99,7 +99,7 @@ class KworkClient:
token: Web auth token, полученный через `getWebAuthToken` или `login()`. token: Web auth token, полученный через `getWebAuthToken` или `login()`.
Если указан, автоматически добавляется в cookies. Если указан, автоматически добавляется в cookies.
cookies: Session cookies из предыдущей аутентификации. cookies: Session cookies из предыдущей аутентификации.
Обычно не требуется устанавливаются автоматически из token. Обычно не требуется - устанавливаются автоматически из token.
timeout: Таймаут HTTP запросов в секундах. По умолчанию 30 секунд. timeout: Таймаут HTTP запросов в секундах. По умолчанию 30 секунд.
base_url: Кастомный базовый URL. Используется только для тестирования. base_url: Кастомный базовый URL. Используется только для тестирования.
@ -197,8 +197,8 @@ class KworkClient:
Аутентификация по логину и паролю. Аутентификация по логину и паролю.
Выполняет двухэтапный процесс аутентификации Kwork: Выполняет двухэтапный процесс аутентификации Kwork:
1. POST /signIn проверка учётных данных, получение session cookies 1. POST /signIn - проверка учётных данных, получение session cookies
2. POST /getWebAuthToken обмен cookies на web_auth_token 2. POST /getWebAuthToken - обмен cookies на web_auth_token
Полученный токен и cookies сохраняются в клиенте для последующих запросов. Полученный токен и cookies сохраняются в клиенте для последующих запросов.
@ -264,19 +264,25 @@ class KworkClient:
raise KworkAuthError(f"Login failed: {response.status_code}") raise KworkAuthError(f"Login failed: {response.status_code}")
response_data = response.json() response_data = response.json()
# Extract userId from response or cookies
cookies = dict(response.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: 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: 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 # Create new client with token
return cls(token=web_token, cookies=cookies, timeout=timeout) return cls(token=web_token, cookies=cookies, timeout=timeout)
@ -430,14 +436,14 @@ class KworkClient:
Args: Args:
page: Номер страницы для пагинации (начиная с 1). page: Номер страницы для пагинации (начиная с 1).
category_id: ID категории для фильтрации. category_id: ID категории для фильтрации.
Если None все категории. Если None - все категории.
sort: Опция сортировки. Варианты: sort: Опция сортировки. Варианты:
- "recommend" по рекомендации (по умолчанию) - "recommend" - по рекомендации (по умолчанию)
- "price_asc" по возрастанию цены - "price_asc" - по возрастанию цены
- "price_desc" по убыванию цены - "price_desc" - по убыванию цены
- "rating" по рейтингу - "rating" - по рейтингу
- "reviews" по количеству отзывов - "reviews" - по количеству отзывов
- "newest" по дате создания - "newest" - по дате создания
Returns: Returns:
CatalogResponse содержащий: CatalogResponse содержащий:
@ -571,7 +577,7 @@ class KworkClient:
Args: Args:
page: Номер страницы (начиная с 1). page: Номер страницы (начиная с 1).
category_id: ID категории для фильтрации. category_id: ID категории для фильтрации.
Если None все категории. Если None - все категории.
Returns: Returns:
ProjectsResponse содержащий: ProjectsResponse содержащий:
@ -609,7 +615,7 @@ class KworkClient:
независимо от их статуса (открыт, в работе, завершён). независимо от их статуса (открыт, в работе, завершён).
Returns: Returns:
Список проектов где текущий пользователь заказчик. Список проектов где текущий пользователь - заказчик.
Example: Example:
orders = await client.projects.get_payer_orders() orders = await client.projects.get_payer_orders()
@ -627,7 +633,7 @@ class KworkClient:
назначен исполнителем. назначен исполнителем.
Returns: Returns:
Список проектов где текущий пользователь исполнитель. Список проектов где текущий пользователь - исполнитель.
Example: Example:
work = await client.projects.get_worker_orders() work = await client.projects.get_worker_orders()
@ -691,11 +697,11 @@ class KworkClient:
""" """
Получить отзывы пользователя. Получить отзывы пользователя.
Если user_id не указан возвращает отзывы текущего пользователя. Если user_id не указан - возвращает отзывы текущего пользователя.
Если указан отзывы другого пользователя по ID. Если указан - отзывы другого пользователя по ID.
Args: Args:
user_id: ID пользователя. Если None текущий пользователь. user_id: ID пользователя. Если None - текущий пользователь.
page: Номер страницы для пагинации (начиная с 1). page: Номер страницы для пагинации (начиная с 1).
Returns: Returns:
@ -811,7 +817,7 @@ class KworkClient:
""" """
Получить доступные дополнительные функции (features). Получить доступные дополнительные функции (features).
Features это платные дополнения к кворкам: Features - это платные дополнения к кворкам:
- Увеличенные сроки - Увеличенные сроки
- Дополнительные правки - Дополнительные правки
- Приоритетная поддержка - Приоритетная поддержка
@ -996,7 +1002,7 @@ class KworkClient:
""" """
Получить пользовательские предпочтения (wants). Получить пользовательские предпочтения (wants).
Wants это настройки интересов пользователя: Wants - это настройки интересов пользователя:
- Предпочитаемые категории - Предпочитаемые категории
- Ключевые слова для мониторинга - Ключевые слова для мониторинга
- Фильтры для поиска - Фильтры для поиска