Um chatbot pode ser uma forma inovadora de interagir com os usuários. Depois de escrever um post apresentando os conceitos básicos de sem servidore também escrever um post sobre escrita Funções do AzurePor isso, decidi que tentaria criar algo um pouco mais prático do que um "hello, world".
Usar uma arquitetura sem servidor para um chatbot faz sentido. O uso do chatbot pode ser esporádico. O uso pode ter picos e quedas em vários momentos do dia. Ao usar a arquitetura sem servidor, você pagará apenas pelos recursos e pelo tempo necessários.
Se você quiser acompanhar o processo, todo o código-fonte desta postagem do blog está em disponível no Github.
Viber Chatbot
Eu poderia ter escolhido muitas plataformas diferentes para criar um chatbot: Facebook Messenger, Skype, WhatsApp, entre outras. Mas decidi optar pelo Viber.
Nos Estados Unidos, o Viber não parece ter um grande número de seguidores, mas eu o tenho usado bastante. É uma maneira muito prática de conversar com minha esposa, enviar fotos, GIFs engraçados e assim por diante. Acho que ele é mais confiável e mais rápido do que o SMS, especialmente para fotos. Gostaria que todos da minha família o usassem! Também é um bom efeito colateral o fato de que O Viber é um cliente do Couchbase. Eles mudaram do MongoDb para dar suporte às suas necessidades crescentes de dados.
Também, API REST do Viber é simples e bem documentado. Entre o uso da arquitetura sem servidor e a API do Viber, não pude acreditar na rapidez com que passei do zero ao chatbot.
Configuração
Primeiro, você precisará começar por criar um bot no Viber (você precisará de uma conta do Viber em algum momento). O Viber lhe dará uma chave de API semelhante a 30a6470a1c67d66f-4207550bd0f024fa-c4cacb89afc04094. Você usará isso nos cabeçalhos HTTP para se autenticar na API do Viber.
Em seguida, crie uma nova solução do Azure Functions. Já escrevi anteriormente no blog sobre Funções do Azure com uma continuação em Inicialização preguiçosa.
Decidi usar o C# para escrever minhas funções do Azure. Infelizmente, não há SDK .NET para o Viber (até onde eu sei), então terei que usar a API REST diretamente. Não é grande coisa, apenas usei RestSharp. Mas se você preferir NodeJS ou PythonO Viber oferece a você SDKs para esses idiomas.
Antes de começar a codificar, você precisará configurar um Webhook. Essa é simplesmente uma maneira de dizer ao Viber para onde enviar as mensagens recebidas. Você só precisará fazer isso no início. Fiz isso implantando primeiro uma função básica do Azure que retorna 200. Usei o Postman para definir o webhook inicial.

Por fim, configurei um cluster do Couchbase no Azure. Começar a usar o Couchbase e o Azure é fácil e gratuito. (Você pode até usar o botão "Test Drive" para obter 3 horas de Couchbase Server sem gastar nenhum crédito do Azure). Criei um único usuário chamado "viberchatbot", um bucket chamado "ViberChatBot" e carreguei o bucket "travel-sample".
Função do Azure
Para esse aplicativo, eu queria criar um chatbot com um pouco mais de substância do que "Hello, world" e também queria me divertir um pouco. Aqui estão os comandos que quero que meu chatbot entenda:
-
Se eu disser "hi" (ou hello, etc.), ele responderá com "Howdy!".
-
Se eu solicitar "métricas", ele me informará quantas mensagens foram processadas até o momento.
-
Se eu mencionar "twitter", ele fará uma recomendação sobre quem seguir.
-
Se eu solicitar voos de CMH para ATL (ou outros aeroportos), ele me informará quantos voos existem hoje (usarei o balde para amostras de viagem para esses dados).
-
Se eu disser "help", ele me fornecerá uma lista dos comandos acima.
Decidi não usar nenhuma biblioteca de processamento ou análise de linguagem natural. Vou usar apenas declarações if/else simples e algumas combinações básicas de strings. Se estiver planejando criar um chatbot robusto com recursos avançados, definitivamente recomendo consultar bibliotecas e ferramentas como LUIS, wit.ai, NLTK e outros.
Código do chatbot
Comecei criando algumas classes C# para representar a estrutura dos dados que o Viber enviará ao meu endpoint sem servidor.
Aulas no Viber
Essa não é, nem de longe, uma representação exaustiva dos recursos do Viber, mas é suficiente para começar a receber mensagens de texto básicas.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público classe ViberIncoming { público string Evento { obter; definir; } público longo Carimbo de data/hora { obter; definir; } público ViberSender Remetente { obter; definir; } público ViberMessage Mensagem { obter; definir; } } público classe ViberSender { público string Id { obter; definir; } público string Nome { obter; definir; } } público classe ViberMessage { público string Texto { obter; definir; } público string Tipo { obter; definir; } } |
Em seguida, a função do Azure converterá a solicitação HTTP bruta em uma solicitação ViberIncoming objeto.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[FunctionName("Chatbot")] público estático assíncrono Tarefa<HttpResponseMessage> Executar( [Acionador http(Nível de autorização.Anônimo, "obter", "post", Rota = nulo)]HttpRequestMessage req, Rastreador registro) { var de entrada = req.Conteúdo.ReadAsAsync<ViberIncoming>().Resultado; var viber = novo ViberProcessador(Balde.Valor); viber.Processo(de entrada); // retornar "OK" todas as vezes // isso é mais importante para a configuração inicial do webhook do Viber retorno req.CreateResponse(HttpStatusCode.OK); } |
Depois disso, criei um ViberProcessador com uma classe Processo que recebe esse objeto.
|
1 2 3 4 5 6 7 8 |
público vazio Processo(ViberIncoming de entrada) { se (de entrada?.Mensagem?.Tipo == "texto") { Registro de entrada(de entrada); ProcessMessage(de entrada); } } |
Processamento de mensagens do Viber
Registro de entrada cria um registro (no Couchbase) para que eu saiba tudo sobre cada solicitação recebida.
ProcessMessage analisará o texto da mensagem e descobrirá o que fazer em resposta. Você pode conferir o código completo em Githubmas aqui está um breve trecho para que você tenha uma ideia:
|
1 2 3 4 5 6 7 8 |
// se a mensagem contiver "hi", "hello", etc., diga "howdy" mais se (HelloStrings.Qualquer(de entrada.Mensagem.Texto.Para abaixar().Contém)) SendTextMessage("Olá!", de entrada.Remetente.Id); // se a mensagem contiver "?", então crie um link para os fóruns mais se (de entrada.Mensagem.Texto.Contém("?")) SendTextMessage("Se você tiver alguma dúvida sobre o Couchbase, pergunte nos fóruns! http://forums.couchbase.com", de entrada.Remetente.Id); mais SendTextMessage("Desculpe, não estou entendendo. Digite 'help' para obter ajuda!", de entrada.Remetente.Id); |
Obtenção de métricas
Uma das coisas que meu chatbot escuta é "métricas". Quando você solicita as métricas, ele fornece uma contagem das mensagens recebidas que foram processadas. Como estou registrando cada solicitação no Couchbase, a consulta de métricas é feita facilmente com uma consulta N1QL.
|
1 2 3 4 5 6 7 8 9 10 11 |
privado string GetMetrics() { var n1ql = @"select value count(*) as totalIncoming do ViberChatBot b where meta(b).id like 'incoming::%';"; var consulta = Solicitação de consulta.Criar(n1ql); var resposta = _bucket.Consulta<int>(consulta); se (resposta.Sucesso) retorno $"Recebi {response.Rows.First()} mensagens de entrada até o momento!"; retorno "Desculpe, estou tendo problemas para obter métricas no momento."; } |
Enviar uma mensagem de volta
O chatbot precisa se comunicar de volta com a pessoa que está falando com ele. Como eu disse anteriormente, não há SDK do Viber .NET, portanto, tenho que criar uma chamada REST "manualmente". Isso é bastante fácil com o RestSharp:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
privado vazio SendTextMessage(string mensagem, string senderId) { var cliente = novo Cliente Rest("https://chatapi.viber.com/pa/send_message"); var solicitação = novo RestRequest(RestSharp.Método.POST); solicitação.AddJsonBody(novo { receptor = senderId, // receptor (ID de usuário exclusivo do Viber, obrigatório) tipo = "texto", // type (Tipo de mensagem, obrigatório) Tipos de mensagem disponíveis: texto, imagem, etc. texto = mensagem }); solicitação.AddHeader("X-Viber-Auth-Token", ViberKey); var resposta = cliente.Executar(solicitação); // registro no Couchbase _bucket.Inserir("resp::" + Guia.NovoGuia(), resposta.Conteúdo); } |
Observe que também estou registrando cada resposta do Viber para o Couchbase. Isso pode ser uma informação muito útil para análise posterior e/ou solução de problemas. Se o Viber decidir alterar a estrutura e o conteúdo de sua resposta, os dados no Couchbase serão todos armazenados como dados JSON flexíveis. Você não terá erros surpreendentes ou dados ausentes nesse ponto de ingestão.
Resumo
Isso é tudo o que é básico. Confira o código-fonte para ver o conjunto completo de ações/operações que o chatbot pode realizar. Para testar o bot, usei o aplicativo Viber para Android no meu telefone (e no da minha esposa, para garantir que funcionasse quando eu fosse a público).

Atenção: no momento em que você ler isto, o chatbot que criei provavelmente estará off-line. Qualquer outra pessoa que criar um "Bot do Couchbase" não será eu!
Aqui está uma recapitulação dos benefícios dessa abordagem para a criação de um chatbot:
-
O abordagem sem servidor é uma boa maneira de controlar os custos de um chatbot. Seja no Viber ou em outra plataforma de mensagens, há potencial para uso esporádico e cíclico.
-
API REST do Viber utiliza JSON, o que torna o Couchbase uma opção natural para rastreamento/armazenamento/consulta.
-
A facilidade de dimensionamento e as parcerias do Couchbase com Microsoft (e Amazon e Google) fazem dele uma ótima opção para um backend de chatbot.
Isso foi muito divertido, e eu definitivamente poderia me empolgar brincando com esse novo chatbot. Ele poderia analisar imagens, contar piadas, procurar todo tipo de informação, vender produtos e serviços ou qualquer outra operação útil.
Gostaria muito de saber o que você está fazendo com os chatbots! Deixe um comentário ou entre em contato comigo em Twitter @mgroves.