47 lines
1.6 KiB
Python
Executable File
47 lines
1.6 KiB
Python
Executable File
import json
|
||
import requests
|
||
from typing import Any, Dict, Tuple
|
||
|
||
class KanboardAPI:
|
||
"""Базовый класс для работы с Kanboard через JSON-RPC."""
|
||
|
||
def __init__(self, url: str, user: str, token: str):
|
||
self.url: str = url
|
||
self.auth: Tuple[str, str] = (user, token)
|
||
self.request_id: int = 0
|
||
|
||
def call(self, method: str, params: Any = None) -> Any:
|
||
"""Выполнить JSON-RPC запрос с кодировкой UTF-8."""
|
||
self.request_id += 1
|
||
payload: Dict[str, Any] = {
|
||
"jsonrpc": "2.0",
|
||
"method": method,
|
||
"id": self.request_id,
|
||
"params": params or {}
|
||
}
|
||
|
||
try:
|
||
json_data: bytes = json.dumps(payload, ensure_ascii=False).encode('utf-8')
|
||
except Exception as e:
|
||
raise ValueError(f"Ошибка кодирования JSON: {e}")
|
||
|
||
headers = {'Content-Type': 'application/json; charset=utf-8'}
|
||
|
||
try:
|
||
response = requests.post(self.url, data=json_data, auth=self.auth, headers=headers)
|
||
response.raise_for_status()
|
||
response.encoding = 'utf-8'
|
||
except requests.exceptions.RequestException as e:
|
||
raise ConnectionError(f"Сетевая ошибка при вызове API {method}: {e}")
|
||
|
||
try:
|
||
result = response.json()
|
||
except json.JSONDecodeError as e:
|
||
raise ValueError(f"Ошибка декодирования JSON: {e}. Ответ: {response.text[:100]}...")
|
||
|
||
if 'error' in result:
|
||
raise Exception(f"API Error: {result['error']}")
|
||
|
||
return result.get('result')
|
||
|