210 lines
8.5 KiB
Markdown
210 lines
8.5 KiB
Markdown
# Система отслеживания активности пользователей
|
||
|
||
## Описание
|
||
|
||
Система автоматически отслеживает активность пользователей и блокирует неактивных более 30 дней для исключения из рассылок.
|
||
|
||
## Компоненты
|
||
|
||
### 1. База данных
|
||
|
||
**Новое поле в таблице `users`:**
|
||
- `last_activity` - дата и время последней активности пользователя
|
||
- Автоматически обновляется при каждом взаимодействии с ботом
|
||
|
||
**Миграция:**
|
||
- Файл: `migrations/versions/20260215_1201_08_1f1631301809_add_last_activity_to_users.py`
|
||
- Добавляет поле `last_activity` и заполняет его значением `created_at` для существующих пользователей
|
||
|
||
### 2. ActivityService
|
||
|
||
**Файл:** `src/core/activity_service.py`
|
||
|
||
**Основные методы:**
|
||
|
||
- `update_user_activity(session, telegram_id)` - обновить последнюю активность пользователя
|
||
- `get_inactive_users(session, days=30)` - получить список неактивных пользователей
|
||
- `mark_inactive_users(session, days=30)` - пометить неактивных как заблокированных
|
||
- `reactivate_user(session, telegram_id)` - реактивировать пользователя при новой активности
|
||
- `check_and_mark_inactive_users()` - проверка для планировщика
|
||
|
||
**Параметры:**
|
||
- `INACTIVITY_PERIOD_DAYS = 30` - период неактивности по умолчанию
|
||
|
||
### 3. ActivityMiddleware
|
||
|
||
**Файл:** `src/middlewares/activity.py`
|
||
|
||
Автоматически:
|
||
- Обновляет `last_activity` при каждом сообщении или callback
|
||
- Реактивирует пользователей, помеченных как неактивные
|
||
|
||
### 4. Планировщик задач
|
||
|
||
**Файл:** `src/core/scheduler.py`
|
||
|
||
**Расписание:**
|
||
- Проверка неактивных пользователей: каждый день в 03:00
|
||
|
||
**Задачи:**
|
||
- `check_inactive_users` - находит и блокирует неактивных пользователей
|
||
|
||
### 5. Интеграция с рассылками
|
||
|
||
**Модификации в `broadcast_services.py`:**
|
||
```python
|
||
# При получении списка пользователей для рассылки
|
||
# автоматически исключаются все заблокированные,
|
||
# включая заблокированных за неактивность (error_type='inactive')
|
||
```
|
||
|
||
### 6. Админ-панель
|
||
|
||
**Новая секция "Неактивные пользователи":**
|
||
|
||
**Доступ:** Админ-панель → Массовая рассылка → ⏰ Неактивные пользователи
|
||
|
||
**Функции:**
|
||
- Просмотр статистики неактивных пользователей
|
||
- Количество заблокированных за неактивность
|
||
- Список первых 10 неактивных с указанием дней неактивности
|
||
- Кнопка "🔄 Проверить сейчас" - запуск проверки вручную
|
||
|
||
## Логика работы
|
||
|
||
### Отслеживание активности
|
||
|
||
1. Пользователь отправляет сообщение или нажимает callback
|
||
2. `ActivityMiddleware` перехватывает событие
|
||
3. Обновляется `last_activity` в базе данных
|
||
4. Если пользователь был заблокирован за неактивность - реактивируется
|
||
|
||
### Автоматическая блокировка
|
||
|
||
1. Каждый день в 03:00 запускается задача `check_inactive_users`
|
||
2. Система находит пользователей с `last_activity > 30 дней`
|
||
3. Для каждого создается запись в `blocked_users`:
|
||
- `error_type = 'inactive'`
|
||
- `error_message = 'User inactive for 30 days'`
|
||
- `is_active = True`
|
||
4. Эти пользователи исключаются из будущих рассылок
|
||
|
||
### Реактивация
|
||
|
||
1. Неактивный пользователь снова взаимодействует с ботом
|
||
2. `ActivityMiddleware` обновляет `last_activity`
|
||
3. Запись в `blocked_users` деактивируется (`is_active = False`)
|
||
4. Пользователь снова получит рассылки
|
||
|
||
## Настройка
|
||
|
||
### Изменение периода неактивности
|
||
|
||
В файле `src/core/activity_service.py`:
|
||
|
||
```python
|
||
class ActivityService:
|
||
# Изменить количество дней
|
||
INACTIVITY_PERIOD_DAYS = 30 # Например, 60 дней
|
||
```
|
||
|
||
### Изменение времени проверки
|
||
|
||
В файле `src/core/scheduler.py`:
|
||
|
||
```python
|
||
self.scheduler.add_job(
|
||
self._check_inactive_users,
|
||
trigger=CronTrigger(hour=3, minute=0), # Изменить час и минуты
|
||
...
|
||
)
|
||
```
|
||
|
||
## Требования
|
||
|
||
**Добавлена зависимость:**
|
||
- `apscheduler==3.10.4` в `requirements.txt`
|
||
|
||
## Логирование
|
||
|
||
Все действия системы логируются:
|
||
- Обновление активности пользователей
|
||
- Пометка неактивных пользователей
|
||
- Реактивация пользователей
|
||
- Запуск и остановка планировщика
|
||
|
||
**Примеры логов:**
|
||
```
|
||
INFO - Пользователь 123456789 помечен как неактивный (последняя активность: 2026-01-15)
|
||
INFO - Пользователь 123456789 реактивирован
|
||
INFO - Проверка неактивных пользователей завершена. Помечено: 5
|
||
```
|
||
|
||
## База данных
|
||
|
||
### Структура BlockedUser для неактивных
|
||
|
||
```sql
|
||
INSERT INTO blocked_users (
|
||
telegram_id,
|
||
error_type,
|
||
error_message,
|
||
is_active
|
||
) VALUES (
|
||
123456789,
|
||
'inactive',
|
||
'User inactive for 30 days',
|
||
true
|
||
);
|
||
```
|
||
|
||
## Тестирование
|
||
|
||
### Ручной запуск проверки
|
||
|
||
1. Зайти в Админ-панель
|
||
2. Массовая рассылка → Неактивные пользователи
|
||
3. Нажать "🔄 Проверить сейчас"
|
||
4. Система покажет количество помеченных пользователей
|
||
|
||
### Проверка middleware
|
||
|
||
Отправьте любое сообщение боту или нажмите callback - поле `last_activity` должно обновиться в БД.
|
||
|
||
### SQL запросы для проверки
|
||
|
||
```sql
|
||
-- Неактивные более 30 дней
|
||
SELECT * FROM users
|
||
WHERE last_activity < NOW() - INTERVAL '30 days'
|
||
AND is_registered = true;
|
||
|
||
-- Заблокированные за неактивность
|
||
SELECT * FROM blocked_users
|
||
WHERE error_type = 'inactive'
|
||
AND is_active = true;
|
||
|
||
-- Проверка last_activity
|
||
SELECT telegram_id, username, first_name, last_activity
|
||
FROM users
|
||
ORDER BY last_activity DESC
|
||
LIMIT 10;
|
||
```
|
||
|
||
## Преимущества
|
||
|
||
1. **Автоматизация** - не требует ручного вмешательства
|
||
2. **Гибкость** - легко настроить период неактивности
|
||
3. **Реактивация** - пользователи автоматически возвращаются в рассылки при активности
|
||
4. **Контроль** - админ может видеть статистику и запускать проверку вручную
|
||
5. **Оптимизация** - не отправляются сообщения неактивным пользователям
|
||
6. **Логирование** - все действия фиксируются
|
||
|
||
## Возможные улучшения
|
||
|
||
1. Настраиваемый период через админ-панель
|
||
2. Email уведомления администратору о заблокированных пользователях
|
||
3. Отправка уведомления пользователю перед блокировкой
|
||
4. Разные периоды для разных типов пользователей
|
||
5. Статистика активности по дням/неделям/месяцам
|