5.1 KiB
Использование API статистики кнопок меню
Обзор
Система статистики кликов по кнопкам меню позволяет отслеживать, какие кнопки чаще всего нажимают пользователи.
API Эндпоинты
1. Логирование клика по кнопке
POST /menu-layout/stats/log-click
Параметры:
button_id(str) - ID кнопкиuser_id(int, optional) - ID пользователя (telegram_id)callback_data(str, optional) - callback_data кнопкиbutton_type(str, optional) - тип кнопки:builtin,callback,url,mini_appbutton_text(str, optional) - текст кнопки на момент клика
Пример:
await MenuLayoutService.log_button_click(
db,
button_id="menu_balance",
user_id=123456789,
callback_data="menu_balance",
button_type="builtin",
button_text="💰 Баланс"
)
2. Получение статистики по конкретной кнопке
GET /menu-layout/stats/buttons/{button_id}?days=30
Возвращает:
clicks_total- общее количество кликовclicks_today- клики сегодняclicks_week- клики за неделюclicks_month- клики за месяцunique_users- уникальные пользователиlast_click_at- последний кликclicks_by_day- клики по дням
Пример:
stats = await MenuLayoutService.get_button_stats(db, "menu_balance", days=30)
# Возвращает:
# {
# "button_id": "menu_balance",
# "clicks_total": 150,
# "clicks_today": 5,
# "clicks_week": 25,
# "clicks_month": 150,
# "unique_users": 45,
# "last_click_at": datetime(...)
# }
3. Получение общей статистики по всем кнопкам
GET /menu-layout/stats?days=30
Возвращает:
items- список статистики по каждой кнопкеtotal_clicks- общее количество кликовperiod_start- начало периодаperiod_end- конец периода
Пример:
all_stats = await MenuLayoutService.get_all_buttons_stats(db, days=30)
total = await MenuLayoutService.get_total_clicks(db, days=30)
Автоматическое логирование
✅ Логирование кликов происходит автоматически!
Все клики по кнопкам автоматически логируются через ButtonStatsMiddleware. Middleware перехватывает все CallbackQuery события и логирует их в базу данных.
Как это работает
-
При каждом клике по кнопке middleware автоматически:
- Извлекает
callback_data(используется какbutton_id) - Получает
user_idиз события - Определяет тип кнопки (
builtin,callback,url) - Извлекает текст кнопки из клавиатуры (если доступен)
- Логирует в базу данных асинхронно (не блокирует обработку)
- Извлекает
-
Middleware активируется автоматически, если
MENU_LAYOUT_ENABLED=True -
Логирование происходит в фоновом режиме и не влияет на производительность
Ручное логирование (опционально)
Если нужно логировать клики вручную (например, для внешних интеграций), можно использовать API:
# Через сервис
await MenuLayoutService.log_button_click(
db,
button_id="custom_button",
user_id=user_id,
callback_data="custom_callback",
button_type="callback",
button_text="Кастомная кнопка"
)
# Или через API эндпоинт
POST /menu-layout/stats/log-click
{
"button_id": "custom_button",
"user_id": 123456789,
"callback_data": "custom_callback",
"button_type": "callback",
"button_text": "Кастомная кнопка"
}
Важные замечания
- Автоматическое логирование: Все клики по кнопкам логируются автоматически через
ButtonStatsMiddleware - Требуется авторизация: API эндпоинты для получения статистики требуют токен авторизации (
require_api_token) - button_id: Используется
callback_dataкнопки как идентификатор - Производительность: Логирование выполняется асинхронно в фоне и не блокирует обработку запросов
- Активация: Middleware работает только если
MENU_LAYOUT_ENABLED=Trueв настройках