Приветствую, читатель! Хочу рассказать о том, как удалось прикрутить гугл аналитику к Telegram боту на aiogram.

В качестве примера будет использоваться python + aiogram, но здесь описывается взаимодействие с api аналитики посредством обычных http запросов. Так что статья актуальна для любого языка.

Немного теории

Дело в том, что гугл объявил о закрытии Universal Analytics и полном переходе на Google Analytics 4. Погуглив стало ясно что инфы про новую аналитику крайне мало, а о её работе с питоном инфы в принципе нет.

Первая проблема связанна с тем, что гугл аналитика предназначена для того что бы отслеживать сайты посредством встраивания трекера во фронтэнд или приложение с SDK.

Бот находится по адресу t.me/BSC_TokenExplorer_Bot (Он позволяет проверять баланс крипто-кошелька в сети BSC, но сейчас не об этом). Его можно добавить как "сайт", но встроить счетчик аналитики просто так не выйдет, так как фронтэндом является сам телеграм, а мы лишь пишем бекэнд и взаимодействуем через Telegram bot API.

Очевидно, из-за этого обстоятельства нам не подходят стандартные способы сбора аналитики. А так же любые библиотеки, которыми так славится питон, являются устаревшими из-за перехода на новую версию.

На помощь приходит Measurement Protocol API. Эта функция всё еще находится в бете, но гугл обещает не вносить значительных изменений на данном этапе, однако существуют ограничения, которые планируют исправить к моменту релиза.

Здесь стоит обратить внимание, что Measurement Protocol существовал и ранее, но его значительно изменили, и теперь есть две версии документации, вот актуальная.

Перейдем к коду

Для того что бы зафиксировать событие нам нужно оправить следующие данные:

{
    'client_id': уникальный_айди_пользователя,
  	'events': [{
        'name': название_события,
     }],
}

На этот хост:

f'https://www.google-analytics.com/mp/collect?measurement_id={MEASUREMENT_ID}&api_secret={API_SECRET}'

Где:

  • MEASUREMENT_ID - идентификатор потока данных (G- код)

  • API_SECRET - значение секретного ключа, который нужно создать во вкладке Measurement Protocol API.

Таким образом удалось собрать данные о нажатии кнопки:

Но возникла следующая проблема: нет записей о количестве активных пользователей. Решением стало вручную отправлять параметр времени взаимодействия в каждом ивенте.

'engagement_time_msec': '1'

Поскольку никаких данных о географии мы собрать не можем, было решено отправлять код языка, который установлен у пользователей в клиенте телеграма, отдельным параметром. Эти данные можно вытащить из объекта message.

'language': код_языка

Так как бот был написан на aiogram, который в свою очередь взял за основу aiohttp, именно его и будем использовать для отправки аналитики. Итоговый код выглядит так:

from aiohttp import ClientSession

from data.config import MEASUREMENT_ID, API_SECRET


async def send_analytics(user_id, user_lang_code, action_name):
    """
    Send record to Google Analytics
    """
    params = {
        'client_id': str(user_id),
        'user_id': str(user_id),
        'events': [{
            'name': action_name,
            'params': {
                'language': user_lang_code,
                'engagement_time_msec': '1',
            }
        }],
    }
    async with ClientSession() as session:
        await session.post(
                f'https://www.google-analytics.com/'
                f'mp/collect?measurement_id={MEASUREMENT_ID}&api_secret={API_SECRET}',
                json=params)

Вызываем функцию во всех хендлерах, которые хотим трекать, следующим образом:

    await send_analytics(user_id=message.from_user.id,
                         user_lang_code=message.from_user.language_code,
                         action_name='get_balance')

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


  1. alex75311
    26.04.2022 09:30

    было бы неплохо сделать ее в виде декоратора