8.5 KiB
8.5 KiB
Система отслеживания активности пользователей
Описание
Система автоматически отслеживает активность пользователей и блокирует неактивных более 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:
# При получении списка пользователей для рассылки
# автоматически исключаются все заблокированные,
# включая заблокированных за неактивность (error_type='inactive')
6. Админ-панель
Новая секция "Неактивные пользователи":
Доступ: Админ-панель → Массовая рассылка → ⏰ Неактивные пользователи
Функции:
- Просмотр статистики неактивных пользователей
- Количество заблокированных за неактивность
- Список первых 10 неактивных с указанием дней неактивности
- Кнопка "🔄 Проверить сейчас" - запуск проверки вручную
Логика работы
Отслеживание активности
- Пользователь отправляет сообщение или нажимает callback
ActivityMiddlewareперехватывает событие- Обновляется
last_activityв базе данных - Если пользователь был заблокирован за неактивность - реактивируется
Автоматическая блокировка
- Каждый день в 03:00 запускается задача
check_inactive_users - Система находит пользователей с
last_activity > 30 дней - Для каждого создается запись в
blocked_users:error_type = 'inactive'error_message = 'User inactive for 30 days'is_active = True
- Эти пользователи исключаются из будущих рассылок
Реактивация
- Неактивный пользователь снова взаимодействует с ботом
ActivityMiddlewareобновляетlast_activity- Запись в
blocked_usersдеактивируется (is_active = False) - Пользователь снова получит рассылки
Настройка
Изменение периода неактивности
В файле src/core/activity_service.py:
class ActivityService:
# Изменить количество дней
INACTIVITY_PERIOD_DAYS = 30 # Например, 60 дней
Изменение времени проверки
В файле src/core/scheduler.py:
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 для неактивных
INSERT INTO blocked_users (
telegram_id,
error_type,
error_message,
is_active
) VALUES (
123456789,
'inactive',
'User inactive for 30 days',
true
);
Тестирование
Ручной запуск проверки
- Зайти в Админ-панель
- Массовая рассылка → Неактивные пользователи
- Нажать "🔄 Проверить сейчас"
- Система покажет количество помеченных пользователей
Проверка middleware
Отправьте любое сообщение боту или нажмите callback - поле last_activity должно обновиться в БД.
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;
Преимущества
- Автоматизация - не требует ручного вмешательства
- Гибкость - легко настроить период неактивности
- Реактивация - пользователи автоматически возвращаются в рассылки при активности
- Контроль - админ может видеть статистику и запускать проверку вручную
- Оптимизация - не отправляются сообщения неактивным пользователям
- Логирование - все действия фиксируются
Возможные улучшения
- Настраиваемый период через админ-панель
- Email уведомления администратору о заблокированных пользователях
- Отправка уведомления пользователю перед блокировкой
- Разные периоды для разных типов пользователей
- Статистика активности по дням/неделям/месяцам