После того, как бот был написан, прокачан и опубликован (на 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.