From 13ef256b3da6bada4f5565c90fb394d63b508155 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Mar 2026 04:44:55 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=20?= =?UTF-8?q?=D0=BA=20=D1=82=D0=BE=D0=BA=D0=B5=D0=BD=D1=83=20=D0=B8=20creden?= =?UTF-8?q?tials?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены 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 с примерами. --- docs/index.md | 18 ++++++++++-- src/kwork_api/client.py | 61 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/docs/index.md b/docs/index.md index 8c780aa..15f2c89 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,14 +42,26 @@ async with await KworkClient.login("username", "password") as client: # Client automatically closes ``` -### Restore from token +### Save and restore session ```python -# Save token after login -token = client._token +# Save credentials after login +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 client = KworkClient(token=token) +# or +client = KworkClient(**creds) + user_info = await client.user.get_info() ``` diff --git a/src/kwork_api/client.py b/src/kwork_api/client.py index 446a0fe..62c51c2 100644 --- a/src/kwork_api/client.py +++ b/src/kwork_api/client.py @@ -131,6 +131,67 @@ class KworkClient: # Initialize HTTP client 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 async def login( cls,