В 2020 году я написал статью Аналитика для Telegram-ботов с достаточно простым решением, с 2 метриками и неоптимальным хранением данных. После появления рекламы в Telegram, аналитика стала ещё более необходима, так как теперь можно рекламировать ботов напрямую пользователям. Плюсы моего нового решения в сравнение с другими на рынке: оно бесплатно, легко внедряется, 20 метрик для аналитики, можно создавать свои метрики, данные хранятся только у вас, подходит для любого количества сообщений в месяц, хранит историю за всё время подключения, может хранить данные по любому количеству ботов в одном месте. Также это решение можно внедрить не только для чат-ботов Telegram, а и для любых других чат-ботов(Slack, Discord, Vk и так далее).

Библиотеку назвал LoraBot. Аналитика подключается в вашего бота как сторонняя библиотека, а все данные хранятся в PostgreSQL. Базу вы можете развернуть на своем сервере с помощью docker-compose файла, который лежит в репозитории. Если вы имеете свою базу данных или хотите развернуть её в облаке как SaaS, вам необходимо самому создать пользователя, запустить файл create_tables.sql и прописать доступы в .env файл. Также в репозитории вы можете найти Telegram, Slack, Discord, Vk чат-ботов с уже внедренной аналитикой и способом получать аналитику от LoraBot.

Как внедрить аналитику в своего чат-бота?

  1. Вам необходимо скачать LoraBot как zip или используя git:

    git clone https://github.com/aleksspevak/lorabot.git
  2. Запустите базу данных для LoraBot с помощью следующей команды:
    Если у вас не установлен docker-compose, вы можете прочитать как устанавливать тут: https://docs.docker.com/compose/install/

    docker-compose up -d
  3. Установите необходимые для LoraBot библиотеки:

    pip3 install -r requirements.txt
  4. Установите пароль для доступа к аналитике в файле .env:

    ANALYTICS_PASSWORD=lorabot
  5. Инициализируйте LoraBot в вашем боте:

    from lorabot import LoraBot
    lora_bot = LoraBot("your bot's name")
  6. Установите функции сбора данных LoraBot, чтобы начать получать информацию для аналитики:

    #для отслеживания новых пользователей
    lora_bot.user(USER_ID)
    #для отслеживания команд, сообщений из меню и обычных сообщений
    lora_bot.message(TEXT, TEXT_TYPE, USER_ID)
    #для отслеживания событий
    lora_bot.event(EVENT, EVENT_TYPE, USER_ID)
    #для отслеживания отзывов о боте
    lora_bot.review(REVIEW, USER_ID)
    #для отслеживания оценок бота
    lora_bot.assessment(RATING_IN_INT_FORMAT, USER_ID)
  7. Чтобы получить аналитику, сделайте какое-нибудь условное ветвление, например, в примере telegram_bot.py поставлено условие получения сообщения с ключевым словом, после этого проверяется пароль и после этого владелец бота получает доступ к аналитике:

Аналитические метрики

Пример визуализации данных, которые возвращает LoraBot
Пример визуализации данных, которые возвращает LoraBot

По ссылке вы можете найти все метрики, которые анализируются в LoraBot. Обратите внимание, что некоторые метрики имеют параметры для установки периода аналитики, объема возвращаемых данных или для установки типа сообщений/событий.Также некоторые функции возвращают только текстовую информацию, но есть функции, которые возвращают и визуализацию данных, и текстовую информацию. Вот несколько примеров того, как возвращать информацию из аналитики в Telegram-боте:

#Возвращает общую информацию о пользователях бота(только текст)
info = lora_bot.analyze_total(START_PERIOD, END_PERIOD)
bot.send_message(message.chat.id, info)
#Возвращает информацию о ежедневных активных пользователях(график + текст)
photo, info = lora_bot.analyze_dau(START_PERIOD, END_PERIOD)
bot.send_message(message.chat.id, info)
bot.send_photo(message.chat.id, photo)

Всего в LoraBot 20 метрик и их можно разделить на следующие группы:

Также есть отдельная функция, в которую вы можете передать свой SQL-запрос прямо из бота. Она будет полезна для создания кастомных метрик.

Схема базы данных, где хранится информация по пользователям, сообщениям, событиям и отзывам:

Заключение

Думаю на данной статье я закрою для себя эту тему, на данный момент решение оттестировано у меня в течение месяца и результат меня удовлетворил. Надеюсь данное решение поможет и вам.

P.S. Аналитика это конечно хорошо, но если вам необходимо, чтобы ваш бот работал без ручного запуска, оберните его в Dockerfile, как советуется в этой статье Свой Telegram бот для отслеживания uptime своих серверов на python и docker, и запускайте его в том же docker-compose файле, где запускается и база данных. Хостить бота на сервер станет гораздо проще.

Комментарии (2)


  1. Valien
    10.03.2022 20:10

    НЕЛЬЗЯ давать писать сырые sql запросы. Почитайте про SQL injection.
    Потом почитайте про ORM или про не ORM, например gino.
    А ещё делать `import *` - плохой тон.
    И не забудьте про pylint, flake8 или редактор кода который покажет всякие мелочи вроде неиспользуемых импортов .
    А в docker-compose можно помимо базы ещё и бота сразу запихнуть как сервис. А ещё grafana для визуализации логов и loki для их сборки. Тогда и библиотеки можно не писать свои.


    1. alekskram Автор
      10.03.2022 20:48

      По поводу SQL запросов:
      Функция не обязательно должна принимать запрос из бота, вы можете просто изначально написать свой и потом просто выводить данные. Она для создания дополнительных метрик в первую очередь. Но в целом, даже если оставить возможность запускать SQL из бота, для этого человек должен знать и ключевое слово для запуска аналитики, и пароль. Мне кажется если взломать пароль условно можно, то вместе с ключевым словом(его можно задать совершенно любым), задача уже выглядит как практически нереальной.
      По поводу ORM:
      Я знаком с ним, хоть и не приходится использовать его в работе. Я его не использовал, чтобы была возможно писать сложные запросы с оконными функциями и чтобы можно было быстро делать кастомные метрики.
      По поводу import *:
      В примерах в бота импортирован конкретно класс, не совсем понимаю о чём вы
      По поводу запихнуть бота в докер:
      Я про это упомянул в конце, моя статья была не об этом и мне кажется что любой человек знакомый с docker сделает это вполне успешно сам.
      По поводу grafana и loki:
      Суть в чём, что с помощью моей библиотеки можно не использовать множество решений, настраивать их, а потом создавать все метрики с нуля,. Можно просто успешно подключить библиотеку, запустить базу и начать сразу получать аналитику)
      То что вы предлагаете - это несовсем быстрое и универсальное решение.