Bot’s: O que são? Como criar? Do que vivem?

em Artigos, Dicas e novidades.

– Você trocaria o WhatsApp pelo Facebok Messenger?
– Quanto tempo você levou para largar de vez o Orkut e passar a usar o Facebook?
– Acha que o Telegram é só uma cópia do WhatsApp?
– E o Skype? Você migrou para ele após o fim do MSN?

Pois é, tudo que é novo leva um tempo para ser aceito e com os Chat Bots não é diferente. O IRC de anos atrás já suportava Bots e eu particularmente não tive contato com ele. Sou da época dos mensageiros que citei acima, mas ouço dizer que existiam bots até para gerenciar download de torrents.

Meu primeiro contato com algo do tipo foi com um tal de “Akinator“, um “geniozinho” que adivinhava em qual personagem você estava pensando com base em algumas respostas fornecidas. Pasmem, ele só não acertava quando eu pensava em algum cantor de rap.

Mas afinal, o que são bots e como eles funcionam?

Chatbots, ou bots, são programas (como já era de se imaginar) que respondem a determinados e limitados comandos enviados a partir de um chat/mensageiro pelo usuário, como por exemplo Telegram, Slack e Facebook Mensenger. Os bots simplesmente interpretam a mensagem recebida e, se for de seu conhecimento, enviam como resposta o conteúdo solicitado pelo usuário. Sendo assim, pode ser aplicado tanto no dia a dia de seus negócios, quanto como entretenimento.

Mas eles não se limitam ao exemplo acima, existem bots com AI (Inteligencia Artifical), onde estes por sua vez podem tentar se comportar como um humano, ou até mesmo através de Machine Learning aprender com os “ser humaninhos”. Por exemplo, este foi o caso da Tay, o bot da Microsoft que deu ruim no Twitter.

OK, mas é só isso? Posso criar um agora?

Sim, nos tempos atuais, onde tudo é integrado, todos estão conectados a tudo, todos em busca de um pouco mais de agilidade e afins, um bot pode estar em qualquer lugar.

Ele pode ser desde um “ouvinte” do seu controlador de versões que, vai lhe notificar quando aparecer um novo MR, desde um bot que vai responder o status da sua hospedagem, quando você enviar uma mensagem como /status, por exemplo.

E esse é o ponto em que deixo o “lero lero” de lado e mostrar, {código,pratica,hands_on}.

aleluia

 

Com poucos recursos você pode criar um chatbot, seja para mandar mensagens de bom dia no grupo da família ou para fins profissionais.

Para este exemplo utilizarei o Telegram que provê uma API própria para os bots e teremos dois comandos:

  1. Um tosco simples “echo reply” que vai ficar repetindo tudo que for digitado no chat.
  2. Um gerador de lero lero, que na realidade só vai fazer um “crawling” simples no lerolero.com

Além disso, para termos um protótipo totalmente funcional ao final deste artigo, vamos fazer o deploy no Jelastic Cloud da Locaweb.

 

Nossas ferramentas: Python + Flask + Jelastic

 

Sobre o Flask:
Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It’s BSD licensed!

Sobre o Jelastic:
Jelastic is a cloud PaaS and CaaS for hosting providers, ISVs, DevOps and enterprises. It can be used for Public, Private, Hybrid and Multi-Cloud deployments.

 

Primeiro, vamos criar um ambiente virtual para o nosso projeto utilizando o virtualenv.

Eu particularmente, não deixo os arquivos criados para o ambiente virtual no mesmo path do projeto, então por isso centralizo todos na minha home dentro de um diretório especifico

(como pode ser visto no exemplo abaixo ~/venvs).

Se estiver usando Linux ou OSX, vai de copy & paste :)

virtualenv ~/venvs/telegrambot

Não sabe o que é virtualenv?

No meu primeiro artigo para o blog da Locaweb falei um pouco a respeito.

Agora crie um diretório para o projeto onde achar mais conveniente e dentro dele crie os arquivos: app.py, requirements.txt e application

Por exemplo:

mkdir ~/telegrambot; touch ~/telegrambot/{app.py,requirements.txt,applictaion}

Onde:

  • app.py – Contém o código da nossa aplicação flask.
  • requirements.txt – Arquivo onde listaremos nossas dependências python do projeto (será utilizado mais tarde pelo pip, durante o deploy)
  • application – Arquivo que o Jelastic usará durante o deploy da aplicação

Continuando…

O telegram, possui no topo do aplicativo um campo de pesquisa (que pode ser expandido clicando na lupa, caso esteja num dispositivo mobile), neste campo busque por @BotFather, este é o bot responsável por criar seus bots no telegram (que nada mais são que contas especiais) e gerenciar os mesmos.

 

Abaixo listo os passos que devem ser seguidos para criação do bot/conta, não tem segredo é uma interação muito simples e intuitiva.

  1. Chame o bot para conversar, após encontra-lo na pesquisa.
  2. Instantaneamente ao clicar no botão ‘start’, você receberá o menu de ajuda.
  3. Envie o comando/mensagem /newbot
  4. Em seguida, o BotFather irá pedir um nome para o seu bot. Envie uma mensagem com o nome desejado.
  5. Na sequência, um username será solicitado. Envie uma mensagem com o nome desejado respeitando o padrão que o BotFather exige, que no caso é um “qualquer coisa” contendo “bot” no final.

Este artigo assume que você já esta registrado no serviço (Telegram), caso não esteja pode se registrar via Web no seu desktop, ou através do aplicativo mobile (Android, iOS e Widows Phone).

Se você fez tudo certo, e eu acredito que sim, um token de acesso foi gerado para que possamos ter acesso á API HTTP de bots do telegram, sendo assim, vamos editar nosso app.py.

 

Obs: Afim de simplificar o artigo, todo o código será escrito neste único arquivo, este também foi o motivo de ter escolhido o flask para o exemplo.

from flask import Flask, request
from unidecode import unidecode
from bs4 import BeautifulSoup
from urllib import urlencode

import requests
import urllib2

app = Flask(__name__)

TOKEN = 'SEU_TOKEN_AQUI'
API = 'https://api.telegram.org/bot{0}'.format(TOKEN)

def HandleMessage(request):
    root = request.json.get('message', {})
    text = root.get('text', False)
    user = root.get('from', {}).get('id', False)
    return(user, text)

def SendMessage(**kwargs):
    url = '{0}/sendMessage?{1}'.format(API, urlencode(kwargs))
    response = requests.get(url)
    return(response)

def LeroLero():
    source = urllib2.urlopen('http://www.lerolero.com/').read()
    soup = BeautifulSoup(source, "html")
    lerolero = soup.find('blockquote').text
    return(lerolero)

@app.route('/', methods=['POST'])
def main():
    user, text = HandleMessage(request)

    if text == '/lerolero':
        text = LeroLero()

    SendMessage(chat_id=user, text=unidecode(text), disable_web_page_preview=True)

    return('', 200)

if __name__ == '__main__':
    app.run()

Como pode ser visto, o “/” (barra), path/endpoint principal e único de nossa aplicação só aceita requisições do tipo POST, que é o tipo de request que o telegram/bot irá enviar a cada mensagem recebia, e é basicamente assim que o bot deste exemplo funciona.

A cada mensagem recebida o Telegram irá fazer um POST no nosso WebHook, e este POST que o Telegram faz contém no seu corpo um documento JSON, que estamos acessando e fazendo o parse para extrair os dois dados que nos interessam para o exemplo na função HandleMessage, os dados por sua vez são: o ID do usuário que esta enviando a mensagem para que possamos respondê-lo e a mensagem que foi enviada pelo usuário.

Fazendo o parse da mensagem, é possível saber se é um comando para o bot (hoje, o Telegram já fornece um valor no próprio JSON postado que identifica se a mensagem é ou não um comando, mas, para simplificar mais uma vez, vamos apenas comparar strings), caso o “if statement” if text == ‘/lerolero’ seja True, o bot irá buscar o conteúdo no site, passando o valor desejado para a variável -> text = LeroLero(), feito isso, SendMessage(chat_id=user, text=unidecode(text), disable_web_page_preview=True) se encarregará de enviar a mensagem para o usuário, e é simplesmente isso.

Observe que caso o “if statement” retorne False, o valor de text não é alterado, e assim que o “echo_reply” funciona.

Para que isso funcione, não podemos esquecer do nosso requirements.txt, segue:

flask
requests
unidecode
beautifulsoup4

Bora fazer o deploy e testar logo isso?

O Jelastic, possibilita algumas formas de se fazer deploy, então, usarei a mais simples neste momento, a fim de com maior detalhamento preparar um post dedicado ao assunto em um outro momento, fica aqui a promessa.

Sendo assim, vamos editar nosso arquivo application colocando o seguinte código:

import sys

sys.path.append('/opt/repo')
sys.path.append('/opt/repo/ROOT')

from app import app as application

Este arquivo é simples e fácil de ser interpretado. Simplesmente é importado o módulo “sys” do Python, que é usado para interagir diretamente com o interpretador python, digamos assim, e em seguida é informado ao interpretador que ‘/opt/repo’ e ‘/opt/repo/ROOT’ fazem parte do path do Python, ou seja, os módulos presentes nestes diretórios passam a ser “chamáveis” de qualquer outro path, tanto é que, from app import app as application

importa neste arquivo, nesse contexto, nosso app.py, lembra dele?

Isso é necessário para que o apache aliado ao mod_wsgi possa rodar nossa app.

Ok, feito isso, bora zipar nossa app e no painel do Jelastic criar nosso ambiente. Se estiver usando Linux ou OSX, como já disse anteriormente, pode ir de copy & paste:

 

zip -r ~/telegrambot.zip ~/telegrambot

No Jelastic, após se cadastrar como um novo usuário, você terá 14 dias grátis para testar a plataforma. Mas enfim, vamos criar um novo ambiente porque isso não muda para um novo ou um velho usuário, queria apenas salientar este detalhe :D

  1. Clique no botão com o sinal de + localizado no topo esquerdo do painel para criar um novo ambiente.
  2. Selecione Python, para ser o “tipo” de aplicação para o ambiente.
  3. Como este exemplo é superbásico e não requer nenhuma configuração especifica, apenas e se desejar, altere o nome do seu ambiente no canto direito inferior do pop-up aberto, e clique em OK.
    Uma instância Apache/Python será provisionada para você, como pode ser visto na imagem abaixo: 

install

Logo abaixo, pode ser vista uma aba “Gerenciador de Instalação”, e então, dentro dela o botão upload. Simplesmente clique nele, e faça o upload do nosso zip, o comentário solicitado é opcional.

upload

Concluiu o upload? Se sim (ao contrário do meu), o arquivo enviado poderá ser visualizado logo abaixo e então uma opção para instalar este arquivo será dada, click and enjoy.

install_sysadinan

Voltando ao Telegram, chame seu bot para conversar e tente enviar qualquer mensagem para ele. Fez? Nada aconteceu, não é? Não me xingue, rode o comando abaixo no seu terminal caso use Linux ou OSX, ou apenas copie e cole no seu navegador a URL abaixo.

curl https://api.telegram.org/bot<seu_token_aqui>/setWebhook?url=<sua_url_do_jelastic>

Onde:

  • <seu_token_aqui> deve ser substituído pelo Token do seu bot, fornecido pelo @BotFather
  • <sua_url_do_jelastic> deve ser substituído pela URL da sua APP do jelastic. Está url esta visiviel, abaixo do nome do seu projeto, fácil de localizar. Detalhe, o webhook (url), informada deve ser passada com o prefixo https.

Está requisição deve retornar um JSON no seguinte formato:

{"ok":true,"result":true,"description":"Webhook was set"}

 

Agora sim, pode testar seu bot no Telegram. Ele estará funcionando. Quer apostar?

Em resumo, este ultimo passo é primordial para o funcionamento, afinal o Telegram precisa saber para onde deve enviar as mensagens recebidas.

Para finalizar: Do que vivem?

Bom, pra finalizar, gostaria de falar que a maior “fonte de alimentação” que vejo para um Chatbot até hoje, é a imaginação de seu criador e todas as informações possíveis e aplicabilidade que eles podem ter, curto muito criar bots para notificação, curto bots que podem me poupar alguns minutos na abertura de um chamado, para solicitar um boleto por exemplo, e por aí vai.

Espero que tenha ficado claro que a intenção deste post não era falar de Python ou do Jelastic Cloud da Locaweb, como prometido em breve teremos um post mais detalhado para o Jelastic, e tal.

Espero também que este exemplo simples, te ajude a tirar alguma ideia do papel. Para se ter ideia do “poder dos bots” deixo a seguir alguns links.

Mano, tem até loja de bot <3

É isso, muito obrigado e até a próxima!

Você também pode gostar