Заявка на фреймворк для мультиплатформного бота

Чатботи щільно увійшли в наше інформаційне життя, у всіх поважаючих себе соцмережах і месенджерах є підтримка ботів, для їх розробки і використання організаційні надають зручне API, все для зручності користувачів і програмістів. Тепер, щоб створити бота в Телеграмі навіть не обов’язково знати будь-яку мову програмування. Існують сервіси, що дозволяють сконструювати бота з допомогою веб-інтерфейсу. І це дійсно добре, але зовсім недавно я зіткнувся з проблемою і був здивований, що на всій цій хвилі популярності чатботів, які до того ж тепер є не просто крутою фішкою, але і приносять дохід інструментом — відповіді практично немає.

А питання таке: що якщо я хочу для одного сервісу створити більш ніж одного бота? Наприклад, я знаю, що ЦА сидить у Вконтакті і Телеграмі, як мені з додатком мінімальних зусиль написати ботів, що працюють з людьми і там, і там? Якщо раптом я (наприклад, як власник інтернет-магазину) захочу також за допомогою ботів працювати з аудиторією вже на Facebook, невже дійсно треба буде розробляти нового бота з нуля і переписувати всю логіку під нього або намагатися вникнути в нове API або бібліотеки. А відповідь я постарався знайти під катом, прошу до столу.

Насправді, рішення є, і їх багато, але всі вони зводяться до того, що ви повинні хостити свого бота у сервісу, який також надає платформу. Тобто як-такого коробкового рішення не отримати. Можливо, я не правий і не до кінця вивчений, що насправді є, але сам факт того, що перша посилання в гуглі не призводить до вирішення — вже насторожує. Є ще Botman. Це дійсно потужна повноцінна розвивається opensource-ва бібліотека з купою фішок і вичерпною документацією. І вона написана на PHP. Я не маю нічого проти PHP, у всякому разі не визнаю цього публічно, щоб не розводити непотрібний холівар, але вести розробку на ньому зовсім не хочеться. Вирішив пошукати щось схоже на Python, до того ж для Python-а існує безліч бібліотек, що дозволяють працювати з Telegram Bot API. І я не знайшов нічого, тому незабаром прийшов до висновку, що варто писати самому. (Може бути, хто-небудь знає відповідні рішення для мультиплатформових ботів з відкритою системою, буду радий будь-якої інформації)

Читайте також  Історії IT юриста. Життя аутсорсинг бізнесу. Частина 2

Тут, до речі назріває інша проблема. Я абсолютно не уявляю, де ще можна поділитися роботою з аудиторією у вигляді статті. Буду дуже радий допомоги і в цьому питанні

Назва Botovod прийшло сама собою.

Загалом, наведу невеликий код та з використанням Botovod-а і поясню його коротко.
Заголовок спойлера

from botovod import Botovod, Message, utils


@utils.convert_to_text
def handler_message(agent, chat, text):
 message = Message()
 message.text = "Я отримав повідомлення"
 agent.send_message(chat, message)

@utils.convert_to_images
def handler_images(agent, chat, images):
 message = Message()
 message.text = "Я бачу фото"
 agent.send_message(chat, message)

def handler_echo(agent, chat, message):
 agent.send_message(chat, message)


settings = [
{
 "name": "telegram",
 "agent": "botovod.agents.telegram", 
 "settings": {"token": "462755273:AzBZBQ7AAnqFEXqZ_P8Z-qvCddmjqTVAYPI", "method": "polling"}
},
]
botovod = Botovod(settings)
botovod.add_handler(handler_message)
botovod.add_handler(handler_images)
botovod.add_handler(handler_echo)
botovod.start()

Тут ми визначаємо 3 обробника для вхідних повідомлень, кожен у відповідь що відправляє. Перший: «Я отримав повідомлення», другий: «Я бачу фото», третій просто буде відсилати назад те, що отримав. Потім створюємо менеджер ботів (Botovod) і передаємо йому налаштування для ботів, в даному для бота в Телеграмі. Далі послідовно додаємо обробники повідомлень. Якщо до бота прийде повідомлення, то воно потрапить до першого обробника, який погодиться його прийняти. Наприклад, якщо нам надіслали аудіо, то спочатку його спробує прийняти перший обробник, але відмовиться, так як це не текст. Потім прийме другий, але також відмовиться, так як це не картинка, потім прийме третій, у якого немає обмежень — таким чином перешле аудіо назад. Обмеження накладаються як декоратори з модуля utils.

Тепер постараюся в подробицях розповісти, що є що:

Є менеджер ботів — об’єкт класу Botovod — йому в конструкторі передаються ім’я бота (у кожного своє унікальне), клас агента, який буде обробляти і налаштування для бота. Також менеджер ботів додаються по черзі обробники. Якщо до боту прийде повідомлення, то менеджер перевірить їх по черзі, поки не знайде той обробник, який не викине виняток NotPassed. Перший доданий обробник перевіряється першим, останній, відповідно, останнім. Якщо ви збираєтеся використовувати вебхуки, то менеджер ботів можна підключити до веб-сервера. Для цього у менеджера ботів є метод listen, який приймає ім’я бота, заголовки і тіло запиту. Далі він передає ці дані парсеру агента, який повертає сформоване повідомлення, після повідомлення проштовхується по обробників. У відповідь метод listen повертає словник {«status»: any_code, «headers»: dict(), «body»: «any_text»}, де в headers — заголовки відповіді, а у body — тіло відповіді. Іноді месенджер/соцмережа вимагає, щоб сервер повертав об’єкт, тому я думаю, що така поведінка зручна.

Читайте також  Повнолітня журналістика: від Росії до Кремля

Наведу приклад для бота Вконтакті під ім’ям «vk-bot», і Botovod буде підключатися до сервера Django

def view(request):
 response = manager.listen("vk-bot", request.headers, request.text)
 return HttpResponse(status = response["status"], headers = response["headers"], response["body"])

Сформоване повідомлення — це об’єкт класу Message. У нього входять поля: text — текст повідомлення; images — список з зображеннями; audios — список зі звуковими файлами; videos — список з відео; documents — список з документами; locations — список з місцями на карті; raw — необроблене тіло повідомлення або додаткова інформація до нього(словник).

Також кожен список об’єкта Message (images, audios, videos, documents) містить у собі спеціальні об’єкти, класи яких успадковані від Attachment. Клас Attachment за замовчуванням має в собі метод url і file_path, які парсери агентів зазвичай і кладуть інформацію про завантажений файл. Список locations містить у собі об’єкти Location, конструктор якому треба передати longitude і latitude (довгота і широта).

Нижче приклад конструювання повідомлень в обробниках

def handler(agent, chat, message):
 out = botovod.Message()
 image = botovod.Image()
 image.file_path = "/tmp/1.png"
 location = botovod.Location() 

out.images.append(image)
 out.text = "Ось фото, що ти просив"
 agent.send_message(chat, out)

Це поки все, що в ньому є, але сподіваюся, що кому-небудь таке рішення буде цікаво. Всім дякую за прочитання!

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *