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 |
public class ViberIncoming { public string Event { get; set; } public long Timestamp { get; set; } public ViberSender Sender { get; set; } public ViberMessage Message { get; set; } } public class ViberSender { public string Id { get; set; } public string Name { get; set; } } public class ViberMessage { public string Text { get; set; } public string Type { get; set; } } |
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")] public static async Task<HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log) { var incoming = req.Content.ReadAsAsync<ViberIncoming>().Result; var viber = new ViberProcessor(Bucket.Value); viber.Process(incoming); // return "OK" each time // this is most important for the initial Viber webhook setup return 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 |
public void Process(ViberIncoming incoming) { if (incoming?.Message?.Type == "text") { LogIncoming(incoming); ProcessMessage(incoming); } } |
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 |
// if the message contains "hi", "hello", etc say "howdy" else if (HelloStrings.Any(incoming.Message.Text.ToLower().Contains)) SendTextMessage("Howdy!", incoming.Sender.Id); // if message contains "?" then link to the forums else if (incoming.Message.Text.Contains("?")) SendTextMessage("If you have a Couchbase question, please ask on the forums! https://forums.couchbase.com", incoming.Sender.Id); else SendTextMessage("I'm sorry, I don't understand you. Type 'help' for help!", incoming.Sender.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 |
private string GetMetrics() { var n1ql = @"select value count(*) as totalIncoming from ViberChatBot b where meta(b).id like 'incoming::%';"; var query = QueryRequest.Create(n1ql); var response = _bucket.Query<int>(query); if (response.Success) return $"I have received {response.Rows.First()} incoming messages so far!"; return "Sorry, I'm having trouble getting metrics right now."; } |
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 |
private void SendTextMessage(string message, string senderId) { var client = new RestClient("https://chatapi.viber.com/pa/send_message"); var request = new RestRequest(RestSharp.Method.POST); request.AddJsonBody(new { receiver = senderId, // receiver (Unique Viber user id, required) type = "text", // type (Message type, required) Available message types: text, picture, etc text = message }); request.AddHeader("X-Viber-Auth-Token", ViberKey); var response = client.Execute(request); // log to Couchbase _bucket.Insert("resp::" + Guid.NewGuid(), response.Content); } |
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.