
Os chatbots entraram firmemente em nossa vida da informação, todas as redes sociais que se prezam e mensageiros instantâneos têm suporte para bots, fornecem uma API conveniente para seu desenvolvimento e uso, tudo para a conveniência dos usuários e programadores. Agora, para criar um bot no Telegram, nem é necessário conhecer nenhuma linguagem de programação. Existem serviços que permitem projetar um bot usando a interface da web. E isso é realmente bom, mas recentemente tive um problema e fiquei surpreso que, com essa onda de popularidade dos chatbots, que agora não são apenas um recurso interessante, mas também uma ferramenta geradora de renda - praticamente não há resposta.
E a pergunta é: e se eu quiser criar mais de um bot para um serviço? Por exemplo, eu sei que a CA está em Vkontakte e Telegram, como posso escrever bots com o mínimo de esforço possível para trabalhar com pessoas de lá e de cá? Se de repente (por exemplo, como proprietário de uma loja on-line) eu também quiser trabalhar com o público no Facebook usando bots, realmente preciso desenvolver um novo bot a partir do zero e reescrever toda a lógica dele ou tentar me aprofundar em uma nova API ou biblioteca. E eu tentei encontrar a resposta por baixo do corte, pergunto para a mesa.
De fato, existem soluções e muitas, mas todas se resumem ao fato de que você deve hospedar seu bot com um serviço que também fornece uma plataforma. Ou seja, como tal, você não pode obter uma solução in a box. Talvez eu esteja errado e não estudei completamente o que realmente existe, mas o fato de o primeiro link no Google não levar a uma solução já é alarmante. Há também
Botman . Esta é uma biblioteca de código-fonte aberto em desenvolvimento realmente poderosa, com um monte de chips e documentação abrangente. E está escrito em
PHP. Não tenho nada contra o
PHP ; de qualquer forma, não o admito publicamente, para não gerar holivar desnecessário, mas não quero desenvolvê-lo. Decidi procurar algo semelhante ao Python, além do Python, existem muitas bibliotecas que permitem trabalhar com a API do Telegram Bot. E como não encontrei nada, logo cheguei à conclusão de que valia a pena me escrever.
(Talvez alguém conheça as soluções adequadas para bots de várias plataformas com um sistema aberto, ficarei feliz com qualquer informação)Aqui, a propósito, outro problema está se formando. Não tenho absolutamente nenhuma idéia de onde mais você pode compartilhar o trabalho com o público na forma de um artigo que não seja sobre Habré. Ficarei muito feliz em ajudar neste assunto.
O nome
Botovod surgiu por si só.
Em geral, darei um pequeno código usando o Botovod e explicarei brevemente.
Título 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()
Aqui, definimos três manipuladores para mensagens recebidas, cada um enviando algo em resposta. A primeira: “recebi uma mensagem”, a segunda: “vejo uma foto”, a terceira simplesmente envia de volta o que recebi. Em seguida, criamos um gerenciador de bot (Botovod) e passamos as configurações para os bots, neste para o bot no Telegram. Em seguida, adicionamos sequencialmente manipuladores de mensagens. Se uma mensagem chegar ao bot, ela será direcionada ao primeiro manipulador que concorda em aceitá-la. Por exemplo, se um áudio foi enviado para nós, o primeiro manipulador tentará aceitá-lo primeiro, mas recusará, pois esse não é um texto. Então ele aceitará o segundo, mas também recusará, já que essa não é uma imagem, e ele aceitará o terceiro, que não tem restrições - dessa forma, encaminhará o áudio ortogonalmente. As restrições são impostas como decoradores no módulo utils.
Agora vou tentar contar em detalhes o que é o que:
Existe um gerenciador de bot - um objeto da classe Botovod - o nome do bot (cada um tem seu próprio nome), a classe do agente que o processará e as configurações do bot são passadas para ele no construtor. Além disso, os manipuladores são adicionados ao gerenciador de bot por sua vez. Se uma mensagem chegar ao bot, o gerente as verificará até encontrar o manipulador que lança a exceção NotPassed. O primeiro manipulador adicionado é verificado primeiro, o último, respectivamente, o último. Se você pretende usar webhooks, o gerenciador de bot pode ser conectado ao servidor web. Para fazer isso, o gerenciador de bot tem um método de escuta que aceita o nome do bot, os cabeçalhos e o corpo da solicitação. Em seguida, ele passa esses dados para o analisador de agentes, que retorna a mensagem gerada, depois que essa mensagem é enviada pelos manipuladores. Em resposta, o método listen retorna o dicionário {"status": any_code, "headers": dict (), "body": "any_text"}, onde nos cabeçalhos estão os cabeçalhos de resposta e no corpo o corpo da resposta. Às vezes, a rede social / messenger exige que o servidor retorne um objeto, então acho que esse comportamento é conveniente.
Vou dar um exemplo para o bot Vkontakte sob o nome "vk-bot", e o Botovod se conectará ao servidor Django
def view(request): response = manager.listen("vk-bot", request.headers, request.text) return HttpResponse(status = response["status"], headers = response["headers"], response["body"])
Uma mensagem formada é um objeto da classe Message. Inclui os seguintes campos: texto - texto da mensagem; imagens - uma lista com imagens; áudios - uma lista com arquivos de som; vídeos - uma lista de vídeos; documentos - uma lista com documentos; localizações - uma lista com lugares no mapa; bruto - o corpo da mensagem não processada ou informações adicionais (dicionário).
Além disso, cada lista do objeto Mensagem (imagens, áudios, vídeos, documentos) contém objetos especiais cujas classes são herdadas do Anexo. A classe Attachment, por padrão, possui os métodos url e file_path nos quais os analisadores de agentes geralmente colocam informações sobre o arquivo recebido. A lista de locais contém objetos de locais, para os quais o construtor precisa passar longitude e latitude (longitude e latitude).
Abaixo está um exemplo de construção de mensagens em manipuladores
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)
Isso é tudo o que está nele por enquanto, mas espero que alguém se interesse por essa solução e que queira ajudar com conselhos, comentários, ideias e talvez sua própria participação no desenvolvimento. Obrigado a todos pela leitura!
Link do Github