Registrando usuários para eventos, procurando respostas automaticamente no banco de dados, comunicando-se com o suporte técnico, trocando contatos - tudo isso faz parte das funções do nosso bot de identificação de líder. Ele "vive" em três plataformas: VK, Facebook Messenger e Telegram, enquanto a lógica de seu trabalho é escrita de uma vez por todas usando abstrações independentes de plataforma. Essa abordagem permite que você adicione rapidamente novos recursos e troque os antigos.

A estrutura do sistema uniformiza o desenvolvimento de funções para diferentes plataformas e simplifica os processos por uma ordem de magnitude em comparação com a opção de reescrevê-los manualmente em cada API dependente da plataforma. Ao mesmo tempo, para iniciar um bot em uma nova plataforma, basta escrever o adaptador (
conector ) apropriado.
Eu queria falar brevemente sobre essa estrutura. Talvez isso seja útil para quem deseja escrever seu bot de plataforma cruzada, mas ainda não se aprofundou no assunto e estudou a experiência de outra pessoa.
Vamos nos familiarizar com o nosso bot. Ele pode ser encontrado em
Telegram ,
VK ,
FB , onde atende até milhares de pessoas ao mesmo tempo (como acontece em grandes eventos). A propósito, podemos aprender sobre quem somos e o que fazemos no nosso
primeiro artigo . Em resumo, operamos uma enorme rede de espaços gratuitos de coworking e apresentação em toda a Rússia e, ao mesmo tempo, oferecemos suporte à plataforma de comunicação
Leader-ID , que é o núcleo de todo o sistema. E o bot desempenha um papel importante em toda a história.
Arma dupla - diversão dupla
De fato, temos dois bots. O primeiro é o principal, responsável por interagir com os usuários. É um meio conveniente de registro de usuários móveis para eventos, interação com suporte e obtenção de informações adicionais de palestras e seminários, além de troca de contatos no mesmo ecossistema.

O segundo bot é essencialmente uma interface para operadores de suporte. Bots funcionam em conjunto, mas suas bases e interfaces são separadas.
Usando o exemplo deles, mostraremos como a estrutura de um sistema desse tipo pode parecer. No entanto, começaremos a torcer esta bola gradualmente, com casos simples.
A estrutura do bot mais simples
Na versão básica, o bot consistirá em apenas um serviço que envia e recebe mensagens através da API do messenger (plataforma) de que precisamos, por exemplo, Telegram.

Se tivermos vários mensageiros através dos quais queremos nos comunicar com os usuários, seria razoável escrever lógica em um estilo independente de plataforma, com a adição de conectores à estrutura que convertem comandos e dados do formato interno para o formato da plataforma correspondente (messenger).

Isso tornará possível adicionar novos recursos em um único local e não duplicá-los para cada plataforma separadamente.
Conectores são serviços que recebem mensagens da plataforma para encaminhamento ao kernel e vice-versa. Em geral, esses são componentes relativamente independentes do sistema, que, se necessário, podem estar localizados em um servidor separado, possuem várias réplicas e assim por diante.
Organizamos a comunicação dos conectores e do kernel (pesquisando o banco de dados ou como não fazê-lo)
Portanto, somos confrontados com a tarefa de organizar a troca de dados entre os conectores e o núcleo. A primeira opção é enviar novas mensagens através do banco de dados. Começamos com isso. Assim, o próprio banco de dados aparece em nosso esquema e a estrutura fica assim: um kernel escrito em Python, mais uma base no MongoDB (as razões para essa escolha são exclusivamente históricas), além de conectores.

Esse esquema não funcionou para nós por um período relativamente longo. Quando o número de mensagens excedeu 700 mil e a frequência em picos atingiu 120 ocorrências por segundo, os índices ficaram mais pesados, pesquisando o banco de dados ficou significativamente mais caro. Eu tive que conectar o broker RabbitMQ aqui. Sua principal função é gerar notificações de que um componente (núcleo / conector) deve processar uma mensagem com um identificador específico. Esses IDs são transmitidos através dele. O RabbitMQ nos descarregou a base e os componentes, que agora não precisam verificar constantemente o banco de dados em busca de novas informações para processamento.
Como resultado, nossa estrutura básica começou a ficar assim:

O trabalho dos conectores através do banco de dados tem menos - isso reduz sua independência e aumenta a conectividade do sistema. No entanto, se os dados forem transferidos diretamente usando o gerenciador de filas, toda a responsabilidade por sua segurança e disponibilidade ficará com esse intermediário. Como isso atende às demandas de confiabilidade e transparência é uma questão em aberto. Por nós mesmos, decidimos que experimentaríamos isso no processo de desenvolvimento adicional do sistema.
Adicionando administradores
Para gerenciar toda a cozinha, você precisa de uma interface de administrador. Com sua ajuda, encontramos as informações necessárias em correspondência, edita dados, realiza pesquisas e boletins. Portanto, o componente da web aparece em nosso diagrama. Além do acima, ele fornece uma interface da web para autenticação de usuários e APIs de bot.

A Web se comunica com o banco de dados e o kernel através de mensagens especiais do sistema. Eles são roteados como texto, contêm apenas informações não sobre uma nova mensagem do usuário, mas sobre algum outro evento no sistema como um todo, ao qual o kernel deve responder. Por exemplo, obtendo códigos de autorização.
A própria interface para administradores é semelhante a esta:

Conectamos operadores através do segundo bot
Para implementar o suporte completo ao usuário, conectamos as operadoras ao sistema. Para manter a velocidade de comunicação com eles, na ausência de alternativas adequadas, o Telegram foi escolhido como a principal interface de diálogo. Os operadores recebem perguntas do usuário e enviam respostas imediatamente.
É assim que a caixa de diálogo do usuário com o bot principal é exibida ao enviar uma pergunta de suporte:
A frase "Pergunta de teste" na captura de tela é o texto da pergunta para suporte técnicoComo resultado, um segundo bot (Support Bot) aparece em nosso circuito com seu núcleo e conector Telegram. Ele se comunica com o núcleo principal e organiza a transferência de perguntas e respostas entre chats com usuários e chats nos quais os agentes de suporte estão sentados.

Ele também possui seu próprio banco de dados. Mas a comunicação com o usuário final passa pelo núcleo do bot principal, que controla o fluxo geral de mensagens.
Veja como é o diálogo do operador com um bot de suporte que redireciona as mensagens do usuário:

No nosso caso, os operadores são divididos em duas categorias: aqueles envolvidos no suporte geral ao usuário e os responsáveis pelo suporte a pontos ou pontos de ebulição individuais. No entanto, isso não tem efeito na estrutura.
O que mais o nosso bot pode fazer?
Essas informações dizem respeito apenas à nossa prática, mas talvez seja interessante como uma seleção de idéias simples que você pode tomar nota.
Troca de contatosÉ realizado através da digitalização e reconhecimento de códigos QR pessoais do bot. Para fazer isso, o processador de imagem padrão é adicionado ao kernel. As imagens são enviadas por conectores, que as salvam no banco de dados junto com a mensagem.

O reconhecimento de código QR também é usado para fornecer ao usuário informações ou arquivos adicionais de seminários. É assim:
Correspondência de notificação
Através do painel de controle no módulo da web, podemos enviar notificações aos participantes de vários eventos.
Realização de pesquisasDa mesma forma, pesquisas são realizadas durante as palestras. Mas, para eles, ainda geramos manualmente um arquivo JSON com lógica, que carregamos na Web.


As perguntas podem ser ao mesmo tempo com respostas e abertas. E a estrutura da pesquisa pode variar dependendo das respostas.

Respostas automáticasO bot pode selecionar independentemente as respostas para as perguntas mais frequentes.

Para fazer isso, temos uma base especial, reabastecida manualmente. Se nada adequado foi encontrado lá ou o usuário não ficou satisfeito com a resposta selecionada, seu apelo pelo bot de suporte é redirecionado para os operadores.
Em geral, enquanto esta é toda a nossa história. No momento, estamos trabalhando para expandir as funções da rede e esperamos que, em um futuro próximo, nosso bot fique um pouco mais "gordo", enquanto sua estrutura permanecerá a mesma.