- Объединены три проекта в один репозиторий - LichessWebServices - REST API для статистики - LichessClientTG_bot - Telegram бот с поддержкой множества пользователей - LichessWebView - Веб-интерфейс для просмотра пользователей и игроков - Добавлен общий docker-compose.yml для запуска всех сервисов - Добавлен скрипт start.sh для удобного запуска - Добавлен README с полным описанием проекта
388 lines
11 KiB
Markdown
388 lines
11 KiB
Markdown
# Lichess Statistics API - Документация
|
||
|
||
## Описание
|
||
|
||
Lichess Statistics API предоставляет REST API для получения детальной статистики игроков платформы Lichess. API позволяет получать информацию о играх, рейтингах и решении задач (пазлов) за различные периоды времени.
|
||
|
||
## Возможности
|
||
|
||
- 📊 **Статистика игр** по режимам (Bullet, Blitz, Rapid)
|
||
- 🧩 **Статистика решения задач** (пазлов)
|
||
- 📅 **Статистика за разные периоды** (сегодня, вчера, неделя)
|
||
- 🎯 **Отслеживание изменений рейтинга**
|
||
- 📈 **Подробная аналитика результатов игр**
|
||
|
||
## Режимы игр
|
||
|
||
- **Bullet**: Быстрые игры (1-3 минуты)
|
||
- **Blitz**: Блиц игры (3-10 минут)
|
||
- **Rapid**: Рапид игры (10+ минут)
|
||
|
||
## Базовый URL
|
||
|
||
```
|
||
http://localhost:8001
|
||
```
|
||
|
||
## Эндпоинты
|
||
|
||
### 1. Информация об API
|
||
|
||
#### GET /
|
||
Возвращает основную информацию об API и доступных эндпоинтах.
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"message": "Lichess Statistics API",
|
||
"version": "1.0.0",
|
||
"description": "REST API для получения статистики игроков Lichess",
|
||
"endpoints": {
|
||
"today": "/stats/{username}/today",
|
||
"yesterday": "/stats/{username}/yesterday",
|
||
"week": "/stats/{username}/week"
|
||
},
|
||
"documentation": "/docs",
|
||
"openapi_schema": "/openapi.json"
|
||
}
|
||
```
|
||
|
||
### 2. Health Check
|
||
|
||
#### GET /health
|
||
Проверка состояния сервиса.
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"status": "healthy",
|
||
"timestamp": "2024-01-15T10:30:00Z",
|
||
"service": "Lichess Statistics API"
|
||
}
|
||
```
|
||
|
||
### 3. Статистика за сегодня
|
||
|
||
#### GET /stats/{username}/today
|
||
Получает статистику игрока за сегодняшний день.
|
||
|
||
**Параметры:**
|
||
- `username` (string, обязательный) - имя пользователя на Lichess
|
||
|
||
**Пример запроса:**
|
||
```bash
|
||
curl http://localhost:8001/stats/magnus/today
|
||
```
|
||
|
||
**Пример ответа:**
|
||
```json
|
||
{
|
||
"message": "Статистика за сегодняшний день",
|
||
"data": {
|
||
"username": "magnus",
|
||
"tasks": {
|
||
"total": 15,
|
||
"solved": 12,
|
||
"unsolved": 3
|
||
},
|
||
"games": {
|
||
"bullet": {
|
||
"games_played": 8,
|
||
"rating_change": 15,
|
||
"final_rating": 2850,
|
||
"wins": 5,
|
||
"losses": 2,
|
||
"draws": 1
|
||
},
|
||
"blitz": {
|
||
"games_played": 3,
|
||
"rating_change": -5,
|
||
"final_rating": 2750,
|
||
"wins": 1,
|
||
"losses": 2,
|
||
"draws": 0
|
||
},
|
||
"rapid": {
|
||
"games_played": 0,
|
||
"rating_change": 0,
|
||
"final_rating": 0,
|
||
"wins": 0,
|
||
"losses": 0,
|
||
"draws": 0
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4. Статистика за вчера
|
||
|
||
#### GET /stats/{username}/yesterday
|
||
Получает статистику игрока за вчерашний день.
|
||
|
||
**Параметры:**
|
||
- `username` (string, обязательный) - имя пользователя на Lichess
|
||
|
||
**Пример запроса:**
|
||
```bash
|
||
curl http://localhost:8001/stats/magnus/yesterday
|
||
```
|
||
|
||
### 5. Статистика за неделю
|
||
|
||
#### GET /stats/{username}/week
|
||
Получает агрегированную статистику игрока за последние 7 дней.
|
||
|
||
**Параметры:**
|
||
- `username` (string, обязательный) - имя пользователя на Lichess
|
||
|
||
**Пример запроса:**
|
||
```bash
|
||
curl http://localhost:8001/stats/magnus/week
|
||
```
|
||
|
||
### 6. Статистика игр за период
|
||
|
||
#### GET /games/{username}/period
|
||
Получает детальную статистику игр пользователя за указанный период времени.
|
||
|
||
**Параметры:**
|
||
- `username` (string, обязательный) - имя пользователя на Lichess
|
||
- `since` (integer, обязательный) - начало периода (Unix timestamp в миллисекундах)
|
||
- `until` (integer, обязательный) - конец периода (Unix timestamp в миллисекундах)
|
||
- `rated_only` (boolean, опциональный) - только рейтинговые игры (по умолчанию true - рекомендуется)
|
||
|
||
**Пример запроса:**
|
||
```bash
|
||
# Статистика за последние 7 дней
|
||
curl "http://localhost:8001/games/magnus/period?since=1640995200000&until=1641081600000"
|
||
|
||
# Только рейтинговые игры
|
||
curl "http://localhost:8001/games/magnus/period?since=1640995200000&until=1641081600000&rated_only=true"
|
||
|
||
# Все игры (включая нерейтинговые)
|
||
curl "http://localhost:8001/games/magnus/period?since=1640995200000&until=1641081600000&rated_only=false"
|
||
```
|
||
|
||
**Пример ответа:**
|
||
```json
|
||
{
|
||
"message": "Статистика игр за период",
|
||
"username": "magnus",
|
||
"period_start": 1640995200000,
|
||
"period_end": 1641081600000,
|
||
"games_count": 25,
|
||
"data": {
|
||
"bullet": {
|
||
"games_played": 10,
|
||
"wins": 6,
|
||
"losses": 3,
|
||
"draws": 1,
|
||
"rating_change": 15
|
||
},
|
||
"blitz": {
|
||
"games_played": 8,
|
||
"wins": 5,
|
||
"losses": 2,
|
||
"draws": 1,
|
||
"rating_change": 12
|
||
},
|
||
"rapid": {
|
||
"games_played": 5,
|
||
"wins": 3,
|
||
"losses": 1,
|
||
"draws": 1,
|
||
"rating_change": 8
|
||
},
|
||
"classical": {
|
||
"games_played": 2,
|
||
"wins": 1,
|
||
"losses": 1,
|
||
"draws": 0,
|
||
"rating_change": 0
|
||
},
|
||
"correspondence": {
|
||
"games_played": 0,
|
||
"wins": 0,
|
||
"losses": 0,
|
||
"draws": 0,
|
||
"rating_change": 0
|
||
},
|
||
"total": {
|
||
"games_played": 25,
|
||
"wins": 15,
|
||
"losses": 7,
|
||
"draws": 3,
|
||
"rating_change": 35
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 7. Статистика решения задач за период
|
||
|
||
#### GET /puzzle/period
|
||
Получает статистику решения задач (пазлов) за указанный период времени. Требует авторизации через Bearer токен.
|
||
|
||
**Параметры:**
|
||
- `since` (integer, обязательный) - начало периода (Unix timestamp в миллисекундах)
|
||
- `until` (integer, обязательный) - конец периода (Unix timestamp в миллисекундах)
|
||
- `max` (integer, опциональный) - максимальное количество задач для получения (по умолчанию 50, максимум 1000)
|
||
- `Authorization` (header, обязательный) - Bearer токен авторизации
|
||
|
||
**Важно:** Параметр `max` ограничивает количество активностей, получаемых от Lichess API. Если в указанном периоде было больше задач, чем указано в `max`, то будут показаны только последние N активностей. Для получения полной статистики рекомендуется увеличить значение `max` или использовать значение по умолчанию (50).
|
||
|
||
**Пример запроса:**
|
||
```bash
|
||
# Статистика за последние 7 дней
|
||
curl -H "Authorization: Bearer your_token_here" \
|
||
"http://localhost:8001/puzzle/period?since=1640995200000&until=1641081600000"
|
||
|
||
# Больше задач
|
||
curl -H "Authorization: Bearer your_token_here" \
|
||
"http://localhost:8001/puzzle/period?since=1640995200000&until=1641081600000&max=100"
|
||
```
|
||
|
||
**Пример ответа:**
|
||
```json
|
||
{
|
||
"message": "Статистика решения задач за период",
|
||
"period_start": 1640995200000,
|
||
"period_end": 1641081600000,
|
||
"max_puzzles": 50,
|
||
"puzzles_in_period": 15,
|
||
"data": {
|
||
"total_attempts": 15,
|
||
"solved": 12,
|
||
"failed": 3,
|
||
"success_rate": 80.0
|
||
}
|
||
}
|
||
```
|
||
|
||
**Получение токена:**
|
||
1. Зайдите на https://lichess.org/account/oauth/token/create
|
||
2. Создайте новый токен с правами на чтение активности
|
||
3. Используйте токен в заголовке Authorization
|
||
|
||
## Модели данных
|
||
|
||
### TaskStats
|
||
Статистика решения задач (пазлов):
|
||
```json
|
||
{
|
||
"total": 15, // Общее количество решенных задач
|
||
"solved": 12, // Количество правильно решенных задач
|
||
"unsolved": 3 // Количество нерешенных или неправильно решенных задач
|
||
}
|
||
```
|
||
|
||
### GameModeStats
|
||
Статистика игр для конкретного режима:
|
||
```json
|
||
{
|
||
"games_played": 8, // Общее количество сыгранных игр
|
||
"rating_change": 15, // Изменение рейтинга (может быть отрицательным)
|
||
"final_rating": 2850, // Текущий рейтинг игрока
|
||
"wins": 5, // Количество побед
|
||
"losses": 2, // Количество поражений
|
||
"draws": 1 // Количество ничьих
|
||
}
|
||
```
|
||
|
||
### GamesStats
|
||
Статистика игр по всем режимам:
|
||
```json
|
||
{
|
||
"bullet": { /* GameModeStats */ },
|
||
"blitz": { /* GameModeStats */ },
|
||
"rapid": { /* GameModeStats */ }
|
||
}
|
||
```
|
||
|
||
### UserStats
|
||
Полная статистика пользователя:
|
||
```json
|
||
{
|
||
"username": "magnus",
|
||
"tasks": { /* TaskStats */ },
|
||
"games": { /* GamesStats */ }
|
||
}
|
||
```
|
||
|
||
### ActivityResponse
|
||
Ответ API с результатами запроса:
|
||
```json
|
||
{
|
||
"message": "Статистика за сегодняшний день",
|
||
"data": { /* UserStats или null */ }
|
||
}
|
||
```
|
||
|
||
## Коды ошибок
|
||
|
||
- **200** - Успешный запрос
|
||
- **404** - Пользователь не найден или неактивен
|
||
- **500** - Внутренняя ошибка сервера
|
||
|
||
## Примеры ошибок
|
||
|
||
### Пользователь не найден
|
||
```json
|
||
{
|
||
"message": "Пользователь magnus не найден или неактивен"
|
||
}
|
||
```
|
||
|
||
### Внутренняя ошибка сервера
|
||
```json
|
||
{
|
||
"detail": "Внутренняя ошибка сервера: Connection timeout"
|
||
}
|
||
```
|
||
|
||
## Swagger UI
|
||
|
||
Интерактивная документация доступна по адресу:
|
||
```
|
||
http://localhost:8001/docs
|
||
```
|
||
|
||
## OpenAPI Schema
|
||
|
||
Схема OpenAPI доступна по адресу:
|
||
```
|
||
http://localhost:8001/openapi.json
|
||
```
|
||
|
||
## Запуск в Docker
|
||
|
||
```bash
|
||
# Сборка и запуск
|
||
docker compose up --build -d
|
||
|
||
# Проверка статуса
|
||
docker compose ps
|
||
|
||
# Просмотр логов
|
||
docker compose logs
|
||
|
||
# Остановка
|
||
docker compose down
|
||
```
|
||
|
||
## Разработка
|
||
|
||
### Установка зависимостей
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### Запуск в режиме разработки
|
||
```bash
|
||
uvicorn main:app --host 0.0.0.0 --port 8001 --reload
|
||
```
|
||
|
||
## Лицензия
|
||
|
||
MIT License
|