Как я Telegram бота на Go писал. Часть четвёртая. Аналитическая.

После того, как бот был написан, прокачан и опубликован (на vscale или на heroku, например) возникает вопрос отслеживания того, как пользователи с ним общаются. Для этих целей можно воспользоваться, например, решением botan.io от Yandex.

Botan – обёртка над AppMetric – версии Метрики для мобильных приложений. Платформа позволяет собирать большинство событий бота и отображать их в панели Метрики (со всеми доступными отчётами). Сейчас ботан умеет работать только с ботами для Telegram, но мне этого вполне достаточно.

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

Перед тем, как начнёте что-либо делать – потребуется зарегистрироваться в Метрике. Здесь проблем быть не должно и останавливаться подробно на этом не буду.

Далее потребуется скачать SDK для вашего языка программирования (на данный момент существует большое количество SDK написанных на разных языках и для множества платформ). Если использование SDK вам не подходит, то можно просто слать HTTP запросы (благо API довольно простой).

Пример, рассмотренный здесь, написан с использованием SDK для Go.

Во-первых, необходимо получить token для работы с API Botan у служебного бота @BotanioBot (“замыленная” строка – token, который будет использоваться для общения с Метрикой):

2016-10-24_22-15-46 (2).png

Как я говорил первой части серии конфигурационный файл ещё пригодится – добавим новое свойство BotanApiToken в config.json:

{
    "TelegramBotToken": "TELEGRAM_API_TOKEN",
    "BotanApiToken": "BOTAN_API_TOKEN"
}

BOTAN_API_TOKEN заменим на токен, который был получен от @BotanioBot ранее.

Также потребуется добавить это свойство в структуру Config:

type Config struct {
   TelegramBotToken string
   BotanApiToken string
}

Во-вторых, добавим SDK Botan в проект выполнив следующую команду:

go get github.com/botanio/sdk/go

После того, как SDK получен можно добавить соответствующий пакет в проект бота:

import (
    // ...
    "github.com/botanio/sdk/go"
)

Для того, чтобы отправлять события необходимо получить инстанс структуры Botan:

botAnalit = botan.New(configuration.BotanApiToken)

Далее можно использовать его для трекинга событий, которые можно отправлять синхронно или асинхронно. Чтобы не портить пользовательский опыт от работы с ботом – лучше использовать асинхронный способ работы с помощью метода TrackAsync:

// uid - идентификатор события
// message - сообщение, описывающее событие
// name - имя события
// f - callback, вызываемый после завершения функции
func (self Botan) TrackAsync(uid int, message interface{}, name string, f func(Answer, []error)) {
    go func() {
        ans, err := self.Track(uid, message, name)
        f(ans, err)
    }()
}

Для нашего бота сделаем простую структуру для параметра message:

type BotanMessage struct {
   Text string
   ChatId int
}

Использование будет выглядеть приблизительно следующим образом:

var ch chan(bool) // канал для синхронизации потоков
// Text - то, что отправил пользователь
// ChatId - ИД чата, из которого отправил сообщение пользователь
message := BotanMessage{Text: update.Message.Text, ChatId: update.Message.From.ID}
botAnalit.TrackAsync(1, 
    message,
    "Search", func(ans botan.Answer, err []error) {
    fmt.Printf("Asynchonous: %+v\n", ans)
    ch

Повторим то же самое для вызова команды /setclass:

// Text - то, что отправил пользователь
// ChatId - ИД чата, из которого отправил сообщение пользователь
message := BotanMessage{Text: update.CallbackQuery.Data, ChatId: update.Message.From.ID}
botAnalit.TrackAsync(1, 
    message,
    "SetClass", func(ans botan.Answer, err []error) {
    fmt.Printf("Asynchonous: %+v\n", ans)
    ch

Добавить самостоятельно отслеживание команды /removeclass, думаю, проблем не возникнет.

После всех манипуляций можно запустить бота, выполнить несколько поисков, установить и удалить классы. Посмотреть статистику по использованию можно через @BotanioBot либо на панели Метрики:

2016-10-27_08-28-47.png

Если всё сделано правильно, то и на панели Метрики будет отображаться аналогичный график:

2016-10-27_08-30-58.png

Думаю, это всё, что требуется для начала. Если потребуется что-то более серьезное – вернусь в этой теме позже.

Исходный код бота, как обычно, можно найти на bitbucket.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s