Как я Telegram бота на Go писал. Часть четвёртая. Аналитическая.
После того, как бот был
написан, прокачан и
опубликован (на vscale или на
heroku, например) возникает вопрос отслеживания того,
как пользователи с ним общаются. Для этих целей можно воспользоваться,
например, решением botan.io от Yandex. Botan - обёртка над
AppMetric - версии Метрики для мобильных приложений. Платформа позволяет
собирать большинство событий бота и отображать их в панели Метрики (со всеми
доступными отчётами). Сейчас ботан умеет работать только с ботами для
Telegram, но мне этого вполне достаточно. В работе бота будем отслеживать
использование ключевых возможностей: как часто пользователи ищут заклинания,
какие классы пользователи выбирают, как часто удаляют выбранный класс. Перед
тем, как начнёте что-либо делать - потребуется зарегистрироваться в
Метрике. Здесь проблем быть не должно и
останавливаться подробно на этом не буду. Далее потребуется скачать SDK для
вашего языка программирования (на данный момент существует большое количество
SDK написанных на разных языках и
для множества платформ). Если использование SDK вам не подходит, то можно
просто слать HTTP запросы (благо API
довольно простой). Пример, рассмотренный здесь, написан с использованием SDK
для Go. Во-первых, необходимо получить token для работы с API Botan у
служебного бота
@BotanioBot
(“замыленная” строка - token, который будет использоваться для общения с
Метрикой):
Как я говорил первой части
серии конфигурационный файл ещё пригодится - добавим новое свойство
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 либо на панели Метрики:
Если всё сделано правильно, то и на панели
Метрики будет отображаться
аналогичный график:
Думаю, это всё, что требуется для начала. Если потребуется что-то более
серьезное - вернусь в этой теме позже. Исходный код бота, как обычно, можно
найти на bitbucket.