Приветствую, читатель! Хочу рассказать о том, как удалось прикрутить гугл аналитику к 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')
alex75311
было бы неплохо сделать ее в виде декоратора