Создание единого проекта Lichess Statistics Ecosystem

- Объединены три проекта в один репозиторий
- LichessWebServices - REST API для статистики
- LichessClientTG_bot - Telegram бот с поддержкой множества пользователей
- LichessWebView - Веб-интерфейс для просмотра пользователей и игроков
- Добавлен общий docker-compose.yml для запуска всех сервисов
- Добавлен скрипт start.sh для удобного запуска
- Добавлен README с полным описанием проекта
This commit is contained in:
vrubelroman 2025-10-26 20:23:26 +03:00
commit a08fc8c962
32 changed files with 4990 additions and 0 deletions

View file

@ -0,0 +1,388 @@
# 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