Если вы читаете это, то скорее всего понимаете, что боты для чатов является популярным трендом в 2016 году.
Эволюция ботов заключается не только в искусственном интеллекте. Ботом может быть инструмент в вашем мессенджере с простым интерфейсом, который может быть использован для расширения функционала сайта или сервиса, или использован как отдельное приложение. Боты легки в разработке и установке, и еще один плюс заключается в том, что мессенджеры могут использоваться на любом устройстве: ноутбуках, смартфонах и планшетах. Вот почему все сходят с ума по ботам.
И наиболее популярным мессенджером с открытым API для ботов является Telegram.
Что мы собираемся делать
В этой статье мы создадим простой бот-секундомер для Telegram. Я покажу вам как создавать собственного бота, связываться с аналитикой, напишем немножко кода и в конце добавим своего бота в магазин ботов.
Создаем бота с помощью BotFather
Первым шагом при создании бота нужно зарегистрировать аккаунт для своего бота в Telegram. И для этого есть собственный бот, который называется BotFather. Просто добавьте его в свой контакт лист и вы сможете создавать и настраивать ботов Telegram, просто напечатав команду /newbot и следуя инструкциям от BotFather.
Разработка Telegram-бота «Доступ к данным MySQL»
После регистрации вашего нового бота, вы получите сообщение с поздравлением и токен для авторизации. Мы скоро будем использовать этот токен для авторизации бота и отправки запросов к Bot API.
Позднее вы сможете использовать BotFather для добавления описаний и фото к профилям ваших ботов, регенерации токенов, задания списка доступных боту команд, удаления аккаунтов и прочее. Чтобы получить полный список команд, просто напечатайте /help в чате с BotFather.
Соединяемся с Botan Analytics
Не существует никакой встроенной аналитики в Telegrem Bots API, но все равно важно знать, сколько пользователей у вас есть, как они себя ведут и какие команды используют чаще других. Конечно можно собрать такую информацию, используя собственный движок, но если мы собираемся сфокусироваться на функционале самого бота, а не метриках, то нужно использовать решение из коробки.
И для этого уже есть простой инструмент, который называется Botan. Он основан на Yandex AppMetric и абсолютно бесплатный. Используя Botan, можно сегментировать вашу аудиторию, получать информацию о профилях пользователей, получить наиболее часто используемые команды, а так же получить красивые графики прямо в вашем мессенджере:
Для того чтобы начать, нужно зарегистрировать ваше бота в Botan и получить свой токен. И опять же это можно сделать в боте, используя BotanioBot:
Просто нажмите на «Add bot» на вашей клавиатуре в диалоговом окне, введите ник вашего бота, и получите ваш токен для трекинга. Теперь Botanio готов регистрировать события вашего бота, а вы можете получать статистику по пользователям, сессиям и событиям прямо в вашем мессенджере.
Создание и регистрация SSL Webhook
Телеграм бот на Python / #4 – SQLite3. Подключение к базе данных
В Telegram есть два способа получения сообщений от пользователей: длинный опрос и webhooks.
Обычно с долгим опросом, вам необходимо запрашивать новые сообщения из API, а с webhooks вы устанавливаете свой обратный вызов, который будет вызван API Telegram, если появится новое сообщение от пользователя. Я предпочитаю использовать webhooks потому что это больше похоже на взаимодействие в реальном времени, так что в этой статье мы так же будем использовать этот способ. Теперь нам нужно выбрать URL для обратного вызова нашего webhook, который будет вызван по HTTPS протоколу, и нужно установить его достаточно безопасным, и расположить свой скрипт в безопасной директории как сказано в руководстве:
Если у вас подтвержденный SSL сертификат, то все что вам нужно, это открыть ваш URL в браузере:
Иначе необходимо сгенерировать самоподписанный сертификат. Вот пример команды в Linux для этого:
И не забудьте открыть SSL порт:
Чтобы подтвердить ваш сертификат и сделать ваш домен для webhook доверительным, необходимо загрузить свой публичный ключ:
В итоге вы получите следующий JSON ответ:
В нем сказано что webhook был установлен и мы готовы начать работу с ботом.
Создаем базу данных
Теперь нам нужно создать базу данных для наших таймеров. Что мы собираемся в ней хранить? Когда пользователь дает команду секундомеру начать отсчет, мы будем брать ID чата и сохранять строку с ID чата и текущим временем Unix. Следовательно мы сохраним строку с отметкой времени и ID чата.
Чтобы показывать текущее время секундомера, мы будем брать сохраненную метку времени и сравнивать ее с текущим временем. Разница и будет текущее время в секундах. Если пользователь останавливает секундомер, то мы просто удаляем строчку с данным ID чата.
Итак давайте создадим базу данных и таблицу для хранения информации для секундомера:
Создание класса Stopwatch
Наконец мы готовы начать писать код. Создадим класс для работы с базой данных в файле stopwatch.php и начнем с конструктора, который устанавливает два приватных свойства, где мы будем хранить ID чата и соединение с MySQL:
Когда пользователь запускает таймер, мы берем текущую временную метку Unix и сохраняем ее вместе с ID чата в методе start() :
Если таймер останавливается, то нам нужно удалить строку из базы данных:
И вот главная часть нашего класса. Когда пользователь запрашивает статус нашего таймера, нам нужно найти строку с секундомером из текущей беседы и подсчитать разницу в секундах между сохраненной временной меткой и текущим временем. К счастью временная метка Unix является целым числом, так что мы просто можем вычесть одно из другого. Чтобы отформатировать результирующее значение в виде времени, мы используем функцию gmdate .
Как видите, если в базе данных нет значения, то метод status() ничего не вернет, и мы обработаем значение null как остановленный таймер.
Выбор библиотеки PHP
Есть много PHP библиотек для работы с Telegram API, но на момент написания этой статьи лишь одна поддерживала одновременно Telegram Bot API и трекинг Botan. Она называется PHP Telegram Bot API.
Для установки библиотеки используем Composer:
Если вам не нужна аналитика, то попробуйте Bot API PHP SDK с интеграцией в Laravel или PHP Telegram Bot.
Запуск Webhook скрипта
И вот мы переходим к главной части — мы создаем скрипт для обработки обратных вызовов от Telegram Bot API. Создадим файл index.php и включим в него автозагрузчик Composer и новый класс Stopwatch. Откроем соединение MySQL, создадим нового клиента Telegram API и запустим его:
Создание команд
Теперь нужно настроить ответ бота на команду /start . Эта команда используется для старта всех ботов Telegram, и пользователям будет показано наше сообщение с приветствием.
Здесь в методе command() мы определим замыкание для получения команды. Замыкание получает ID текущего чата и отправляет сообщение с приветствием. Так же все зарегистрированные команды автоматически по имени команды.
Для запуска секундомера, мы определим команду /go:
Она создаст объект класса Stopwatch и запустит таймер, вызывав метод start() , который мы определили ранее.
Чтобы определить команду /status , делаем аналогично. Просто вызываем метод status() и возврашаем результат. Если метод вернул null, сообщаем пользователю, что таймер не был запущен.
А если пользователь останавливает таймер, то нам нужно сначала получить статус, показать результирующее время, а затем остановить таймер, используя метод stop() .
И это все! Теперь вы можете загрузить все необходимые файлы в вашу директорию для webhook и протестировать своего бота.
Добавление клавиатуры
Чтобы предложить пользователю, какие команды он может выполнять, мы можем к сообщению добавить клавиатуру. Наш таймер может быть в двух состояниях: запущен или остановлен. Для того чтобы показать пользователю клавиатуру, нам нужно просто переопределить метод sendMessage() :
Теперь мы может добавлять клавиатуру к любой команде нашего бота. Я не стал включать здесь полный пример, но вы можете его увидеть в репозитории.
Добавление бота в Store
Хорошо, теперь у нас есть работающий бот, и мы хотим показать его миру. Лучшим способом будет зарегистрировать бота в каталоге ботов. Сейчас у Telegram нет официального каталога, но есть несколько неофициальных, и самый большой из них — Storebot.me, в котором уже зарегистрированы тысячи ботов.
Через некоторое время ваш бот пройдет процесс подтверждения я появится в чартах Storebot. Теперь вы и ваши пользователи могу голосовать, находить и оценивать вашего бота в store, чтобы помочь ему подняться в каталоге.
Заключение
Как сохранить и обработать ответ пользователя в telegram боте. (C#)
Часто на просторах интернета вижу, как люди сталкиваются с проблемой сохранения последующего ответа пользователя на сообщения бота, когда пишут бота на c#. Например, в библиотеке telebot для python есть отдельный метод register_next_step_handler, который регистрирует следующее сообщение пользователя. Сегодня я подробно разберу реализацию этого на c#.
P.S. Кто и так знает, как работать с базами данных и создавать элементарных ботов, сразу переходите к основной части.
Создание базы данных и элементарного бота
Заходим в Visual Studio, создаём консольное приложение и подключаем нужные пакеты через nuget:
Прописываем нужные директивы в код.
using System.Data; using System.Data.SqlClient; using Telegram.Bot;
Далее в обозревателе решений создаём базу данных.
Далее открываем обозреватель серверов (Вид => Обозреватель серверов) , открываем нашу базу данных. В ней нам нужно лишь создать таблицу.
Создаём 2 колонки с типом данных int, называем таблицу и нажимаем «Обновить». Когда таблица создана перейдём к написанию элементарного бота.
В классе Program создаём 2 экземпляра класса:
static TelegramBotClient client = new TelegramBotClient(token); static SqlConnection sql = new SqlConnection(connectionString);
connectionString находится в свойстве базы данных. (пкм по database1.mdf в обозревателе серверов => свойства => строка подключения/connection string)
в main методе пропишем обработчики на сообщения и запустим приём обновлений (по возможности использовать webhook). В обработчике сообщений создадим экземпляр этого же сообщения.
static void Main(string[] args) < client.OnMessage += BotOnMessage; //Создаём обработчик событий на сообщение client.StartReceiving(); //Начинаем получать апдейты с сервера телеграмма Console.ReadKey(); client.StopReceiving(); >async static void BotOnMessage(object sender, MessageEventArgs e) < Message msg = e.Message; //создаём переменную, которая содержит все свойства сообщения >
Шаблон бота готов, можем перейти к основной теме статьи.
Основная часть. Обработка сообщений.
Для начала поставим перед собой задачу. При нажатии на первую кнопку клавиатуры бот попросит ввести пользователя два числа через пробел, после чего отправит ему сумму этих двух чисел. При нажатии на вторую кнопку, бот отправит произведение двух чисел.
Начнём с того, что при вводе /start мы запишем в таблицу идентификатор пользователя и начальное значение второй колонки, пускай будет 0.
if (msg.Text == /start) < if(sql.State == ConnectionState.Closed) // Проверяем, закрыто ли sql подключение < sql.Open(); //Открываем sql подключение SqlCommand command = new SqlCommand($»insert into %Название_таблицы% (%Колонка_1%, %Колонка_2%) values (», ‘0’)», sql); //Прописываем добавление данных в таблицу await command.ExecuteNonQueryAsync(); //Выполняем команду sql.Close(); > >
Потом обработчики на кнопки клавиатуры.
if (msg.Text == «Сумма двух чисел») < if(sql.State == ConnectionState.Closed) //Проверяем состояние подключения < //Отправляем сообщение, что-бы ввели 2 числа sql.Open(); SqlCommand command = new SqlCommand($»Update %Название_таблицы% Set %Колонка_2% = ‘1’ where %Колонка_1% = »», sql); //Так, тут мы установили второй колонке значение 1 (это может быть любое число) await command.ExecuteNonQueryAsync(); sql.Close(); > > if(msg.Text == «Произведение двух чисел») < if(sql.State == ConnectionState.Closed) < sql.Open(); SqlCommand command = new SqlCommand($»Update %Название_таблицы% Set %Колонка_2% = ‘2’ where %Колонка_1% = »», sql); await command.ExecuteNonQueryAsync(); //Здесь мы уже присваиваем значение ‘2’ sql.Close(); > >
Далее, при поступлении каждого сообщения, нам нужно проверять значение второй колонки у написавшего пользователя. Тогда мы сможем отловить момент, когда у него во второй колонке 1 или 2 и обработать это сообщение. После обработки нужно обратно установить ‘0’ во вторую колонку, что-бы его сообщения дальше не триггерили. В обработчике сообщений напишем вот такой код (этот блок кода должен идти после if(msg.Text == «/start») а также перед остальным кодом).
if (sql.State == ConnectionState.Closed) < sql.Open(); SqlCommand command = new SqlCommand($»Select %Колонка_2% From %Таблица% Where %Колонка_1% = »», sql); SqlDataReader reader = command.ExecuteReader(); await reader.ReadAsync(); count = Convert.ToInt64(reader[0]); //count — обычная int переменная. Мы считали данные с таблицы и присвоили значение второй колонки этой переменной. reader.Close(); sql.Close(); >
Далее, когда у нас определенна переменная, сразу в обработчике сообщений ставим проверку на значение этой переменной. В них прописываем нужные нам действия, это может быть что угодно, но я не буду отходить от нашего примера.
if(count == 1) < //Здесь вы прописываете, что хотите. Напрмер, отправляете сумму чисел await client.SendTextMessageAsync(msg.Chat.Id, $»Сумма чисел — «); sql.Open(); SqlCommand command = new SqlCommand($»Update %Таблица% Set %Колонка_2% = ‘0’ where %Колонка_1% = »», sql); command.ExecuteNonQuery(); //Анулируем вторую колонку. >
Таких блоков можно создать почти бесконечность. Плюс этого способа в том, что пользователи друг другу не мешают и бот сможет обрабатывать сразу несколько пользователей одновременно.
Источник: h.amazingsoftworks.com