
Los chatbots ingresaron estrechamente a nuestra vida de información, todas las redes sociales que se respetan y los mensajeros instantáneos tienen soporte para bots, proporcionan una API conveniente para su desarrollo y uso, todo para la comodidad de los usuarios y programadores. Ahora, para crear un bot en Telegram, ni siquiera es necesario conocer ningún lenguaje de programación. Hay servicios que le permiten diseñar un bot utilizando la interfaz web. Y esto es realmente bueno, pero recientemente me encontré con un problema y me sorprendió que en esta ola de popularidad de los chatbots, que ahora no solo son una característica genial, sino también una herramienta para generar ingresos, prácticamente no hay respuesta.
Y la pregunta es: ¿qué pasa si quiero crear más de un bot para un servicio? Por ejemplo, sé que CA está sentado en Vkontakte y Telegram, ¿cómo puedo escribir bots con un mínimo esfuerzo para trabajar con personas de todas partes? Si de repente (por ejemplo, como propietario de una tienda en línea) también quiero trabajar con la audiencia en Facebook usando bots, ¿realmente necesito desarrollar un nuevo bot desde cero y reescribir toda la lógica para ello o intentar profundizar en una nueva API o biblioteca? Y traté de encontrar la respuesta debajo del corte, pregunto a la mesa.
De hecho, hay soluciones, y hay muchas, pero todas se reducen al hecho de que debe alojar su bot con un servicio que también proporcione una plataforma. Es decir, como tal, no puede obtener una solución en caja. Quizás estoy equivocado y no estudié completamente lo que realmente existe, pero el hecho de que el primer enlace en Google no conduzca a una solución ya es alarmante. También está
Botman . Esta es una biblioteca de código abierto de desarrollo completo muy potente con un montón de chips y documentación completa. Y está escrito en
PHP. No tengo nada en contra de
PHP , en cualquier caso, no lo admito públicamente, para no generar holivar innecesarios, pero no quiero desarrollarlo en absoluto. Decidí buscar algo similar a Python, además de Python, hay muchas bibliotecas que le permiten trabajar con la API de Bot de Telegram. Y no encontré nada, así que pronto llegué a la conclusión de que valía la pena escribirme.
(Tal vez alguien conozca las soluciones adecuadas para bots multiplataforma con un sistema abierto, me complacerá cualquier información)Aquí, por cierto, se está gestando otro problema. No tengo ni idea de dónde más puede compartir el trabajo con el público en forma de un artículo que no sea sobre Habré. Estaré muy feliz de ayudar en este asunto.
El nombre
Botovod vino solo.
En general, daré un pequeño código usando Botovod y lo explicaré brevemente.
Encabezado de spoilerfrom 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()
Aquí definimos 3 manejadores para mensajes entrantes, cada uno enviando algo en respuesta. El primero: "Recibí un mensaje", el segundo: "Veo una foto", el tercero simplemente enviará lo que recibí. Luego creamos un administrador de bots (Botovod) y le pasamos las configuraciones para los bots, en este caso para el bot en Telegram. A continuación, agregamos secuencialmente manejadores de mensajes. Si llega un mensaje al bot, irá al primer controlador que acepte aceptarlo. Por ejemplo, si se nos envió un audio, el primer controlador intentará aceptarlo primero, pero se negará, ya que no se trata de texto. Luego aceptará la segunda, pero también se negará, ya que no se trata de una imagen, aceptará la tercera, que no tiene restricciones, de esta manera reenviará el audio orto. Las restricciones se imponen como decoradores desde el módulo de utilidades.
Ahora intentaré decir en detalle qué es qué:
Hay un administrador de bot, un objeto de la clase Botovod, el nombre del bot (cada uno tiene su propio nombre), la clase de agente que lo procesará y la configuración del bot se le pasa en el constructor. Además, los controladores se agregan al administrador de bot a su vez. Si llega un mensaje al bot, el administrador los revisará a su vez hasta que encuentre el controlador que arroja la excepción NotPassed. El primer controlador agregado se verifica primero, el último, respectivamente, el último. Si tiene la intención de utilizar webhooks, el administrador de bot puede conectarse al servidor web. Para hacer esto, el administrador de bot tiene un método de escucha que acepta el nombre del bot, los encabezados y el cuerpo de la solicitud. Luego, pasa estos datos al analizador del agente, que devuelve el mensaje generado, después de que este mensaje se envía a través de los controladores. En respuesta, el método listen devuelve el diccionario {"status": any_code, "headers": dict (), "body": "any_text"}, donde en los encabezados están los encabezados de respuesta, y en el cuerpo está el cuerpo de respuesta. A veces, la red social / de mensajería requiere que el servidor devuelva un objeto, por lo que creo que este comportamiento es conveniente.
Daré un ejemplo para el bot Vkontakte con el nombre "vk-bot", y Botovod se conectará al servidor Django
def view(request): response = manager.listen("vk-bot", request.headers, request.text) return HttpResponse(status = response["status"], headers = response["headers"], response["body"])
Un mensaje formado es un objeto de la clase Mensaje. Incluye los siguientes campos: texto - texto del mensaje; imágenes: una lista con imágenes; audios: una lista con archivos de sonido; videos: una lista de videos; documentos: una lista con documentos; ubicaciones: una lista con lugares en el mapa; sin formato: el cuerpo del mensaje sin formato o información adicional (diccionario).
Además, cada lista del objeto Mensaje (imágenes, audios, videos, documentos) contiene objetos especiales cuyas clases se heredan del Adjunto. La clase Attachment de forma predeterminada tiene los métodos url y file_path en los que los analizadores de agentes suelen colocar información sobre el archivo recibido. La lista de ubicaciones contiene objetos de ubicación, para cuyo constructor debe pasar longitud y latitud (longitud y latitud).
A continuación se muestra un ejemplo de construcción de mensajes en controladores
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)
Esto es todo lo que hay por ahora, pero espero que alguien esté interesado en tal solución y alguien quiera ayudar con consejos, comentarios, ideas y tal vez su propia participación en el desarrollo. Gracias a todos por leer!
Enlace de Github