fix: use csrf_user_token from cookies as auth token
This commit is contained in:
parent
e478807aa4
commit
4c98d27e72
@ -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": [
|
||||||
|
|||||||
Binary file not shown.
@ -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 - это настройки интересов пользователя:
|
||||||
- Предпочитаемые категории
|
- Предпочитаемые категории
|
||||||
- Ключевые слова для мониторинга
|
- Ключевые слова для мониторинга
|
||||||
- Фильтры для поиска
|
- Фильтры для поиска
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user