TelegramBot в облаке Wolfram
TelegramBot в облаке Wolfram
Введение
Введение
Прошел тот период, когда каждая вторая статья на Habrahabr была посвящена написанию своего телеграмм-бота. Также прошел период времени, когда бота без трудностей можно было разместить на своем компьютере или хостинге в России. Еще полгода назад мой бот запускался просто на ноутбуке и не испытывал никаких проблем с подключением к API. Но сейчас, когда я задумался над тем, чтобы вернуть его в работу, я понял, что это будет не так легко. Не хотелось искать и настраивать прокси-сервер и тем более за рубежом. Также до этого я писал бота на Wolfram Language и не имел представления о том, как язык работает с прокси-серверами, так как до сих пор их не использовал. И тут появилась замечательная идея ! Использовать Wolfram Cloud. В этой статье я хочу показать, как очень просто с регистрацией, но без смс можно запустить своего простого телеграм-бота, написанного на Wolfram Language. Из инстументов понадобится для этого только браузер.
Немного про облако Wolfram
Немного про облако Wolfram
Чтобы получить доступ к облаку необходимо создать аккаунт Wolfram. Для этого нужно перейти по адресу https://account.wolfram.com и следовать инструкциям после нажатия на кнопку Create One.
После всех проделанных манипуляций на главной странице облака по адресу https://www.wolframcloud.com будут отображаться все продукты и их планы использования. Необходимо выбрать Development Platform и создать новый блокнот.
Весь код приведенный в дальнейшем, будет выполняться именно в этом облачном блокноте.
Совсем немного о telegram-ботах
Совсем немного о telegram-ботах
Существует огромное множество статей посвященных им. Здесь всего лишь надо сказать, что перед тем как выполнять все дальнейшие действия, бота надо создать стандартным способом. То есть просто начать чат с ботом @BotFather и отправить ему команду:
/newbot
Дальше просто необходимо следовать инструкциям и ввести имя и логин. Пусть его имя будет Wolfram Cloud Bot и логин @WolframCloud5973827Bot.
Реализация API
Реализация API
Воспользуемся рекомендациями @BotFather и бегло осмотрим HTTP API телеграм-ботов. Задачи по реализации всего API целиком пока не стоит. Для написания бота достаточно только небольшой части. Проверим, что API доступно и бот с указанным выше токеном существует. Для этого достаточно выполнить всего одну строчку:
In[]:=
URLExecute["https://api.telegram.org/bot753681357:AAFqdRFN_QoODJxsBy3VN2sVwWTPKJEqteY/getMe"]
Out[]=
{okTrue,result{id753681357,is_botTrue,first_nameWolfram Cloud Bot,usernameWolframCloud5973827Bot}}
Команда выше - самый простой способ выполнить HTTP запрос из Wolfram Language. Но немного усложним его, чтобы было легко реализовать все остальные методы API. Создать общий метод выполнения запроса к API:
Проверим работает ли это на уже протестированном выше методе
Отлично. Создадим отдельно функцию для выполнения проверки состояния бота:
Теперь подобным образом осталось добавить основные методы, которые необходимы для создания бота в облаке:
◼
getUpdates - получает все последние сообщения написанные боту
◼
setWebhook - устанавлиевает адрес серевера для обработки обновлений-коллбэков
◼
deleteWebhook - удаляет обработчик
◼
getWebhookInfo - информация об обработчике
◼
sendMessage - отправка сообщения в чат
Минимальная версия API готова. Проверим как работает отправка сообщение и получение обновлений. Для этого создадим чат с нашим ботом. При создании боту отправится первое сообщение с тектом /start. Посморим - попало ли оно в список обновлений:
Получить из списка обновлений данные последнего обновления можно так:
А вот так можно получить чат, из которого пришло сообщение и сам текст сообщения:
Как видно из результат выполнения - все на месте. Теперь отправим сообщение от имени бота используя sendMessage.
В общем-то этого набора функций уже достаточно. Однако, использовать метод getUpdates не очень удобно. Нужно придумать способ, как обрабатывать сообщения с помощью webhook.
Создание webhook
Создание webhook
В Wolram Langauge есть специальный вид функций, которые создаются с помощью APIFunction. Вот пример одной из таких:
Такие функции предназначены специально для развертывания в облаке. Данная функция будет принимать на вход один параметр запроса. Чтобы развернуть ее в облаке достаточно передать саму функцию в CloudDeploy.
Затем можно перейти по полученной ссылке в браузере и добавить параметр запроса:
Функция выше обрабатывала параменты запроса. Значит нужно создать такую же функцию для обработки тела HTTP запроса, прирходящего от телеграм-бота в виде объекта Update. Для генерации адреса используем токен, чтобы получить доступ к облачному объекту было сложнее. Также необходимо указать, что объект имеет публичный доступ, иначе телеграм не сможет попасть на webhook.
handler - другая функция обработчик. Пусть обработчик превращает строку тела запроса в ассоциацию, получает оттуда идентификатор чата и высылает обратно слово "hello".
Теперь развернем фунцкию в облаке.
И последний шаг - передадим адрес этого объекта телеграм-боту.
Теперь напишем что-нибуд боту и посмотрим что он ответит:
Диалог можно считать состоявшимся. Для того чтобы изменить логику работы уже существующего обработчика - достаточно повторно выполнить развертывание облачного объекта. При этом выполнять установку webhook для бота уже не потребуется.
Логика ответов
Логика ответов
Это будет последняя часть в процессе создания бота в облаке Wolfram. Дальше таким же образом можно усложнять логику и добавлять новые методы API. Теперь о самом диалоге. Пусть, после отправки команды /start бот возвращает ответ "Привет" и меняет клавиатуру пользователя. В клавиатуре остается всего две кнопки: "Привет" и "Кто ты?". Реализуем диалог в виде ассоциации. Ключами будут команды, которые высылает пользователь боту. Значения ключей - сам ответ бота и новая клавиатура. При этом множество ключей и кнопок должны полностью совпадать. Иначе может появиться ситуациция, когда бот не знает что ответить. В таких случаях, конечно, можно добавить ответ по умолчанию.
Теперь создадим обработчик:
И выполним повторно развертывание облачного объекта:
Приверим, что получилось в чате с ботом. Но для начала очистим историю сообщений:
Расширение функциональности
Расширение функциональности
Пока что принципиальных отличий от огромного множества уже существующих ботов нет. Может и смысла в его напиании тоже нет? Смысл всей проделанной выше работы будет, если понять в чем собственно преимущества такого бота ! Ведь он может использовать все возможности Wolfram Language и Wolrfam Cloud. Необходимо, чтобы робот умел решать уравнения? Это очень легко ! Надо всего-лишь доопределить ответ !
Если у кого-то дополнительно появится интерес к возможностям облака - то хорошее описание его функциональности есть здесь.
Ограничения
Ограничения
Wolfram Cloud - платформа, которая позволяет использовать язык Wolfram бесплатно, в то время как основной продукт компании Wolfram Research - Mathematica стоит денег. Соответственно на использование есть ограничения и на мой взгяд они очень сильные. При использовании бесплатной версии Development Platform пользователю в месяц выдается 1000 облачных кредитов. Каждый облачный кредит дает время на вычисление различного типа. Так как в статье говоиртся про CloudDeploy + APIFunction - то такие объекты, хранящиеся в облаке тратят 1 кредит за 0.1 секунды вычислительного времени. Несложно подсчитать, что пользователю бесплатно выдается всего 1 минута и 40 секунд серверного времени на работу своего приложения (в данном случае бота). Мне здесь нечего добавить - это очень и очень мало. Основной упор на пользователей, которые работают в Development Platform самостоятельно с помощью браузера. Ведь в таком режиме нет никаких ограничений по времени, а только по длительности сессии и выделяемым ресурсам. При таком использовании Development Platform - это почти полноценная Mathematica, но не требующая установки и лицензии.