feat: публичный доступ к токену и credentials

Добавлены property для доступа к учётным данным:

- client.token — web auth token (публичный, не _token)
- client.cookies — session cookies (копия, не оригинал)
- client.credentials — dict с token и cookies для сохранения

Пример использования:
    # Сохранение
    client = await KworkClient.login('user', 'pass')
    token = client.token  # или client.credentials

    # Восстановление
    client = KworkClient(token=token)

Обновлена документация в docs/index.md с примерами.
This commit is contained in:
root 2026-03-23 04:44:55 +00:00
parent 6ad63ee3e0
commit 13ef256b3d
2 changed files with 76 additions and 3 deletions

View File

@ -42,14 +42,26 @@ async with await KworkClient.login("username", "password") as client:
# Client automatically closes # Client automatically closes
``` ```
### Restore from token ### Save and restore session
```python ```python
# Save token after login # Save credentials after login
token = client._token client = await KworkClient.login("username", "password")
# Option 1: Save token only
token = client.token
# Option 2: Save full credentials (token + cookies)
creds = client.credentials
import json
with open("session.json", "w") as f:
json.dump(creds, f)
# Later, restore session # Later, restore session
client = KworkClient(token=token) client = KworkClient(token=token)
# or
client = KworkClient(**creds)
user_info = await client.user.get_info() user_info = await client.user.get_info()
``` ```

View File

@ -131,6 +131,67 @@ class KworkClient:
# Initialize HTTP client # Initialize HTTP client
self._client: Optional[httpx.AsyncClient] = None self._client: Optional[httpx.AsyncClient] = None
@property
def token(self) -> Optional[str]:
"""
Web auth token для аутентификации.
Returns:
Токен или None если клиент не аутентифицирован.
Example:
# Сохранение токена для последующего использования
client = await KworkClient.login("user", "pass")
token = client.token
# Позже: восстановление сессии
client = KworkClient(token=token)
"""
return self._token
@property
def cookies(self) -> dict[str, str]:
"""
Session cookies.
Returns:
Словарь cookies включая web_auth_token.
Example:
# Сохранение полной сессии
client = await KworkClient.login("user", "pass")
creds = client.credentials
# Восстановление
client = KworkClient(**creds)
"""
return self._cookies.copy()
@property
def credentials(self) -> dict[str, Optional[str]]:
"""
Учётные данные для восстановления сессии.
Returns:
Словарь с token и cookies для передачи в KworkClient().
Example:
# Сохранение
client = await KworkClient.login("user", "pass")
import json
with open("session.json", "w") as f:
json.dump(client.credentials, f)
# Восстановление
with open("session.json") as f:
creds = json.load(f)
client = KworkClient(**creds)
"""
return {
"token": self._token,
"cookies": self._cookies.copy() if self._cookies else None,
}
@classmethod @classmethod
async def login( async def login(
cls, cls,