9.5 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": "Кастомная кнопка"
}
4. Статистика по типам кнопок
GET /menu-layout/stats/by-type?days=30
Возвращает:
- Статистику кликов по каждому типу кнопок (builtin, callback, url, mini_app)
- Общее количество кликов по типам
Пример:
stats = await MenuLayoutService.get_stats_by_button_type(db, days=30)
# Возвращает:
# [
# {"button_type": "builtin", "clicks_total": 500, "unique_users": 100},
# {"button_type": "callback", "clicks_total": 200, "unique_users": 50},
# ...
# ]
5. Статистика по часам дня
GET /menu-layout/stats/by-hour?button_id=menu_balance&days=30
Параметры:
button_id(optional) - ID кнопки для фильтрацииdays(default: 30) - период в днях
Возвращает:
- Распределение кликов по часам дня (0-23)
Пример:
stats = await MenuLayoutService.get_clicks_by_hour(db, button_id="menu_balance", days=30)
# Возвращает:
# [
# {"hour": 9, "count": 50},
# {"hour": 10, "count": 75},
# ...
# ]
6. Статистика по дням недели
GET /menu-layout/stats/by-weekday?button_id=menu_balance&days=30
Возвращает:
- Распределение кликов по дням недели (0=понедельник, 6=воскресенье)
Пример:
stats = await MenuLayoutService.get_clicks_by_weekday(db, button_id="menu_balance", days=30)
# Возвращает:
# [
# {"weekday": 0, "weekday_name": "Понедельник", "count": 100},
# {"weekday": 1, "weekday_name": "Вторник", "count": 120},
# ...
# ]
7. Топ пользователей по кликам
GET /menu-layout/stats/top-users?button_id=menu_balance&limit=10&days=30
Параметры:
button_id(optional) - ID кнопки для фильтрацииlimit(default: 10) - количество пользователейdays(default: 30) - период в днях
Возвращает:
- Список пользователей с наибольшим количеством кликов
Пример:
top_users = await MenuLayoutService.get_top_users(db, button_id="menu_balance", limit=10, days=30)
# Возвращает:
# [
# {"user_id": 123456789, "clicks_count": 50, "last_click_at": datetime(...)},
# ...
# ]
8. Сравнение периодов
GET /menu-layout/stats/compare?button_id=menu_balance¤t_days=7&previous_days=7
Параметры:
button_id(optional) - ID кнопки для фильтрацииcurrent_days(default: 7) - период текущего сравненияprevious_days(default: 7) - период предыдущего сравнения
Возвращает:
- Сравнение текущего и предыдущего периода
- Изменение в абсолютных числах и процентах
- Тренд (up/down/stable)
Пример:
comparison = await MenuLayoutService.get_period_comparison(
db, button_id="menu_balance", current_days=7, previous_days=7
)
# Возвращает:
# {
# "current_period": {"clicks": 100, "days": 7, ...},
# "previous_period": {"clicks": 80, "days": 7, ...},
# "change": {"absolute": 20, "percent": 25.0, "trend": "up"}
# }
9. Последовательности кликов пользователя
GET /menu-layout/stats/users/{user_id}/sequences?limit=50
Параметры:
user_id(path) - ID пользователяlimit(default: 50) - максимальное количество записей
Возвращает:
- Хронологическую последовательность кликов пользователя
Пример:
sequences = await MenuLayoutService.get_user_click_sequences(db, user_id=123456789, limit=50)
# Возвращает:
# [
# {"button_id": "menu_balance", "button_text": "💰 Баланс", "clicked_at": datetime(...)},
# {"button_id": "menu_subscription", "button_text": "📊 Подписка", "clicked_at": datetime(...)},
# ...
# ]
Важные замечания
- Автоматическое логирование: Все клики по кнопкам логируются автоматически через
ButtonStatsMiddleware - Требуется авторизация: API эндпоинты для получения статистики требуют токен авторизации (
require_api_token) - button_id: Используется
callback_dataкнопки как идентификатор - Производительность: Логирование выполняется асинхронно в фоне и не блокирует обработку запросов
- Активация: Middleware работает только если
MENU_LAYOUT_ENABLED=Trueв настройках - Временные зоны: Все временные метрики используют локальное время сервера