Criando um bot com Telegram na Intel Edison

Bot com Telegram

No dia 5 de Novembro de 2015 aconteceu o Intel Innovation Week 2015, evento organizado pela Intel no Brasil para divulgar novas tecnologias, estudos e tendências do mercado, além de novos produtos e soluções tanto da própria Intel como de seus parceiros. Para este evento fui convidado para apresentar uma demonstração de aplicação de Internet das Coisas com a Intel Edison. Em um ambiente onde fazemos tanto uso de mídias sociais, pensei… Por que não juntar mídias sociais com Internet das Coisas? Isso nos levaria a algo como Social Things, já pensou? 

Assim, meu exemplo tratou de demonstrar um bot implementado em Telegram capaz de controlar elementos da Intel Edison, fazer leitura de sensores, contar a quantidade de pessoas em vista e até mesmo atuar como sistema de segurança por imagem. 

Nesse artigo irei então apresentar um tutorial de como criar o bot com Telegram na Intel Edison, nos moldes do que eu apresentei no Intel Innovation Week 2015. Não irei aprofundar muito, senão o artigo ficaria demasiadamente extenso. Dessa forma, apresentarei os conceitos em partes.

Bot com Telegram: Intel-Edison no Intel Innovation Week
Figura 1 – Apresentação do Bot Telegram com Intel Edison no Intel Innovation Week

O motivo fundamental de eu ter escolhido o Telegram é que o mesmo possui uma API bem aberta e bem documentada, facilitando a integração do mesmo com linguagens tais como Python, Java, C#, dentre outras. Além disso, o Telegram também já possui uma estrutura específica para trabalhar com bots!

Bot com Telegram
Figura 2 – Telegram – uma nova era de comunicação.

Bot com Telegram

Um bot é basicamente uma aplicação capaz de simular ações humanas, e até mesmo interagir por meio de sistemas de mensagens instantâneas, tal como Telegram, e assim responder a perguntas, comandos, e desempenhar ações específicas. O interessante da estrutura do Telegram para bots é que eles não dependem de números de celular para operarem. Basicamente você realiza um processo de registro, obtém uma chave de acesso e utiliza essa chave para controlar o seu bot. Isso será melhor apresentado adiante.

Todo o mecanismo de criação e gestão de bots em Telegram pode ser visto em detalhes na área de bots do Telegram. Inclusive, eles mesmos já fornecem toda uma base de códigos-fontes com exemplos para interação com bots Telegram em diversas linguagens neste link

Para criar um bot no Telegram, é preciso falar com o “The Botfather“! Uma icônica alusão ao Poderoso Chefão. E aqui fica uma consideração pessoal: Além de terem uma API aberta, ainda possuem uma boa dose de humor!

The BotFather

Bot com Telegram: the botfather
Figura 3 – The Botfather

Outra coisa legal do Telegram é que o mesmo não tem limitações quanto à forma de acesso. Ou seja, você pode acessar sua conta do Telegram pelo seu navegador mesmo com seu celular desligado, pelo link do Web Telegram. Isso, obviamente, depois de ter validado o seu computador com o sistema. Com isso, pude fazer todo o setup do bot conversando com o The Botfather pelo navegador, em meu computador. Para conversar com o The BotFather, você deve acessar este link, estar logado no Telegram, e assim que a janela foi propriamente carregada, inicie o processo com o comando /start, a partir do qual o BotFather irá então exibir uma lista dos comandos suportados para dar início à criação e setup do seu bot Telegram. Veja como é na Figura 4.

Bot com Telegram: BotFather
Figura 4 – Imagem do bate-papo com o Botfather 1

Viu então os comandos listados? Para você criar seu bot, então precisa agora digitar o comando /newbot e enviar. Com isso, ele irá lhe pedir o nome do seu novo bot. Coloquei para o meu o nome edisongram, pois pensei em uma mistura de Edison com Telegram. E após enviar o nome desejado, ele irá lhe pedir então o username do seu bot, e lhe avisa que o username deve finalizar com a palavra bot. No meu caso, ficou edisongram_bot. Veja o “bate-papo” na Figura 5.

Bot com Telegram: Setup Bot
Figura 5 – Configuração do bot com o The BotFather.


Feito isso, seu bot está configurado e ele irá então lhe informar um token, uma chave de acesso que você deverá usar com a API do Telegram para fazer interface com o seu bot, e assim poder ler e enviar mensagens por meio dele, tal como mostrado na Figura 6.

Bot com Telegram: Setup Bot 2
Figura 6 – The BotFather liberando token de acesso ao Bot.

Guarde o token de acesso em um arquivo *.txt. Ele será usado na Intel Edison para o devido funcionamento do bot com o Telegram.

Configurando sua Edison para Python com Telegram

Como linguagem para a escrita do programa do bot, será usado Python pelo fato de ser uma linguagem elegante. Simples, objetiva e direta, além de intuitiva. Para continuar daqui pra frente, garanta que a sua Intel Edison esteja devidamente configurada com Poky Linux. Em caso de dúvida, veja o material de imagens da Intel para instalar em sua Edison neste link e também o Intel Edison – Guias e Truques, escrito pelo Diego Sueiro aqui no Embarcados.

Considerando agora que sua Intel Edison está com Poky Linux instalado e configurado, e com acesso à internet, esteja também com acesso ao terminal da mesma, tanto via USB ou via SSH. Vamos instalar o Python PIP para gestão de pacotes Python com o seguinte comando:

# opkg install python-pip

Terminado o processo, agora vamos instalar uma biblioteca de suporte para uso do Bot Telegram, por meio do seguinte comando:

# pip install python-telegram-bot

O repositório oficial dessa biblioteca está neste link do GitHub, onde são fornecidos detalhes mais aprofundados e todo o código-fonte e estrutura da biblioteca, além de algumas dicas de utilização e exemplo de bot implementado com ela. Esse material me ajudou bastante durante o processo.

Seu primeiro Bot com Telegram na Edison

Então, após instalada a biblioteca via Python-PIP, podemos criar um primeiro código de exemplo para testar o bot. Vamos então criar um exemplo simples, do tipo echo, em que a mensagem que for enviada ao bot será desenvolvida para você.

Para escrever o código na Intel Edison, digite o seguinte comando para iniciar o editor vi com um nome de arquivo sugerido como edisonGram.py:

# vi edisonGram.py

Obs: Caso preferir, use outro editor de sua preferência que já esteja instalado no Linux da Intel Edison, tal como Nano ou o próprio Vim, por exemplo.

No editor, coloque então o seguinte código Python apresentado abaixo. Coloquei em cada linha de código comentários acerca da funcionalidade de cada trecho. Espero que assim fique mais intuitivo. Neste código, coloquei o meu Token de acesso, que foi obtido anteriormente na conversa com o BotFather, para servir de base. Mude para o Token gerado pela sua conversa com o The BotFather. (Após esse post eu criei outro Token, então não haverá problemas em termos de segurança a exibição deste dado).

# primeiro importamos a biblioteca telegram, instalada pelo Python-PIP
import telegram			
# e tambem importamos a biblioteca sleep de time, para poder criar
# "delay" no codigo Python.
from time import sleep 

# Faz os imports de bibliotecas para tratar erros de conexao URL.
try:
    from urllib.error import URLError
except ImportError:
    from urllib2 import URLError
	
# Criamos uma rotina main para gerir o codigo principal
def main():
    # Variavel update_id - usada pelo Telegram
    update_id = None

    # Criamos um objeto bot inserindo o Token fornecido
    # pelo The BotFather	
    bot = telegram.Bot('144082936:AAGDrwQJWpdrMeRhC0WFUnw1mcZ9e3dasTg')

    print 'Bot Telegram iniciado...'

    # Loop infinito - programa em execucao
    while True:
        try:
            update_id = edisonGramBot(bot, update_id)
        except telegram.TelegramError as e:
            # Se ocorrer algum problema, lentidao, por ex:
            if e.message in ("Bad Gateway", "Timed out"):
                sleep(1) # Espera 1 segundo...
            else: # Caso contrario, lanca excessao.
                raise e
        except URLError as e:
            # Ha problemas de rede na execucao...
            sleep(1)


def edisonGramBot(bot, update_id):
    # Requisita atualizacoes depois da ultima id de update - update_id
	
    # bot.getUpdates(offset, timeout) - offset eh o ponto de partida em
    # que comeca a procurar novas atualizacoes de mensagens, timeout eh 
    # tempo minimo de espera para retorno da requisicao de resposta.
    for update in bot.getUpdates(offset=update_id, timeout=10):
        
        # o chat_id eh a id do chat de comunicacao Telegram
        # eh necessaria para o bot identificar a conversa e
	# gerar e enviar a resposta
        chat_id = update.message.chat_id
	
        # atualiza o indice update_id - para ref novas mensagens
        update_id = update.update_id + 1
	
        # Captura a mensagem de texto enviada ao bot no dado chat_id
        message = update.message.text

        if message:
            # Envia a mensagem para o chat_id especifico, com a mensagem 
	    # parametrizada.
            bot.sendMessage(chat_id=chat_id, text=message)

    # retorna o ultimo update_id para servir de referencia
    return update_id

# Rotina essencial para executar a rotina main() quando o codigo python
# eh executado.
if __name__ == '__main__':
    main()

Vamos testar a aplicação? Então salve o código e saia do editor vi ou qualquer outro editor que você estiver usando. Assim, para executar o nosso código Python devemos proceder com o seguinte comando:

# python edisonGram.py

Se tudo correr certo, a aplicação será iniciada e você poderá então também iniciar a conversa com o seu Bot via Telegram. Veja adiante o meu exemplo para este código-modelo. Primeiro, eu exibo o console de acesso ao terminal Linux da Intel Edison. E depois eu mostro a janela de conversa com o Bot, que basicamente irá me retornar tudo que eu enviar para ele, ou seja, simplesmente é um “echo”.

Bot com Telegram: EdisonGram (Console)
Figura 7 – Console Shell do Linux da Intel Edison iniciando o programa edisonGram.py
Bot com Telegram: EdisonGram (Echo)
Figura 8 – Exemplo do bate-papo com o Bot na Intel Edison – Programa de Echo.

Algumas considerações adicionais

Somente a funcionalidade de “echo” não agrega nada, não é mesmo? Só serviu para testarmos que a aplicação escrita é capaz de ler e enviar mensagens. Agora vamos agregar mais um pouco de funcionalidade. Podemos tratar os textos recebidos pelo Bot e programar ações específicas para determinadas mensagens. Pense nas seguintes situações: 

  • Temperatura – O Bot responde a temperatura do ambiente, obtida por meio da leitura do correpondente sensor;
  • Luminosidade – O Bot responde a luminosidade do ambiente, também obtida por meio da leitura do correspondente sensor;
  • Acender luz – Imagine que um relé esteja ligado a uma lâmpada, por exemplo. Com este comando, a Edison poderia então acionar o relé e acender a lâmpada;
  • Apagar luz – Correspondentemente, poderia também apagar a lâmpada.

Dentre outros. As possibilidades são infinitas.

Para isso, temos que tratar a parte de código que recebe a mensagem, de modo a analisar o conteúdo da mensagem para então proceder com comandos/ações específicos.

Uma das coisas bem interessantes a respeito do Telegram é a possibilidade de mandar Stickers, que são imagens bem humorísticas baseadas em personagens consagrados da história, tais como Einstein, Tesla, Freddie Mercury, dentre outros. Para isso, existe a função da biblioteca sendSticker capaz de enviar uma imagem Sticker em formato *.webp

E se quiser enviar uma foto, uma imagem? Basta usar a função sendPhoto devidamente parametrizada, passando o caminho do arquivo de foto/imagem a ser enviado. 

Um Bot mais aprimorado

De modo a agregar um pouco mais de funcionalidade ao Bot modelo, irei agora mostrar como exibir a mensagem enviada ao Bot no display LCD do Kit Groove da Intel Edison, além de 2 easter eggs, ou seja, surpresas no código. Caso queira reproduzir o código abaixo em sua Intel Edison, lembre-se de substituir o Token pelo seu próprio, e também de estar com o Display LCD do Kit Groove devidamente conectado na porta I2C. Coloque o código no mesmo arquivo, edisonGram.py, usando seu editor favorito (vinano, etc).

Observação: Para reproduzir fielmente o exemplo abaixo, garanta que o arquivo de imagem *.png da logo do [wpdm_asset id=’10’] e o arquivo de [wpdm_asset id=’11’] *.webp estejam no mesmo diretório do arquivo-fonte python do bot para execução! 

# primeiro importamos a biblioteca telegram, instalada pelo Python-PIP
import telegram			
# importamos tambem a biblioteca para controle do display lcd groove
import pyupm_i2clcd as lcd
# e tambem importamos a biblioteca sleep de time, para poder criar
# "delay" no codigo Python.
from time import sleep 

# Faz os imports de bibliotecas para tratar erros de conexao URL.
try:
    from urllib.error import URLError
except ImportError:
    from urllib2 import URLError

# Inicializacao do display LCD groove.	
myLcd = lcd.Jhd1313m1(0, 0x3E, 0x62)
# Cor Verde.
myLcd.setColor(0, 255, 0)
# Limpa display
myLcd.clear()
# Cursor em ponto inicial
myLcd.setCursor(0,0)

# Variavel global para indice
# de requisicoes.
LAST_UPDATE_ID = None
	
# Criamos uma rotina main para gerir o codigo principal
def main():
	
	# Referencia a variavel global.
	global LAST_UPDATE_ID

    	# Criamos um objeto bot inserindo o Token fornecido
    	# pelo The BotFather	
    	bot = telegram.Bot('144082936:AAGDrwQJWpdrMeRhC0WFUnw1mcZ9e3dasTg')
	
	# Puxa o ultimo indice de requisicao.
	try:
        	LAST_UPDATE_ID = bot.getUpdates()[-1].update_id
    	except IndexError:
        	LAST_UPDATE_ID = None

	# Loop infinito - ira funcionar enquanto o programa estiver executando
    	while True:
        	try:
			edisonGramBot(bot)
	        except telegram.TelegramError as e:
        	    # Se ocorrer algum problema na comunicacao com Telegram - lentidao, por ex:
	            if e.message in ("Bad Gateway", "Timed out"):
        	        sleep(1) # Espera 1 segundo...
	            else: # Caso contrario, lanca excessao.
        	        raise e
	        except URLError as e:
        	    # Ha problemas de rede na execucao...
	            sleep(1)


def edisonGramBot(bot):
	# Referencia a variavel global.
	global LAST_UPDATE_ID

    	# Requisita atualizacoes depois da ultima id de update - update_id	
	# bot.getUpdates(offset, timeout) - offset eh o ponto de partida em
	# que comeca a procurar novas atualizacoes de mensagens, e o timeout eh o 
	# tempo minimo de espera para retorno da requisicao de resposta ao Telegram.
	for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10):
        	# o chat_id eh a id do chat de comunicacao Telegram
		# eh necessaria para o bot identificar a conversa e
		# gerar e enviar a resposta
	        chat_id = update.message.chat_id
		# Captura a mensagem de texto enviada ao bot no dado chat_id
		# Agora com encode UTF-8
        	message = update.message.text.encode('utf-8')

	        if message:
        	    # Se ha mensagem, entao...
			if(message.lower() == 'tecnologia?'):
                                # Responde Embarcados!
				bot.sendMessage(chat_id=chat_id,text='Embarcados!') 
                                # E manda a imagem-logo do Embarcados
				bot.sendPhoto(chat_id=chat_id, photo=open('embarcados.png','rb'))
			elif(message.lower() == 'intel?'):
                                # Responde Edison!
				bot.sendMessage(chat_id=chat_id,text='Edison!') 
                                # E manda Sticker do Freddie Mercury
				bot.sendSticker(chat_id=chat_id, sticker=open('queen.webp','rb'))
		        else: 
				# Vamos mostrar a imagem no display LCD 16x2.
				# Ou seja, a imagem nao pode extrapolar limites!
				if(len(message) <= 16):
					myLcd.clear() #limpa display
					myLcd.setCursor(0,0) #posiciona
					myLcd.write(message) #exibe msg
				elif(len(message) > 16 and len(message) <= 32):
					myLcd.clear() #limpa display
					myLcd.setCursor(0,0) #posiciona 1a linha
					myLcd.write(message[0:16]) #exibe
					myLcd.setCursor(1,0) #posiciona 2a linha
					myLcd.write(message[16:len(message)]) #exibe
				# E de todo jeito, faz echo da mensagem!
				bot.sendMessage(chat_id=chat_id, text='LCD: '+message)
		# Por fim, atualiza a referencia de requisicao.
		# +1 para continuar a atender as proximas.
		LAST_UPDATE_ID = update.update_id + 1

# Rotina essencial para executar a rotina main() quando o codigo python
# eh executado.
if __name__ == '__main__':
    main()

 Para executar o código, basta seguir o procedimento padrão, chamando o interpretador Python seguido do nome do arquivo:

# python edisonGram.py

 E o resultado vemos a seguir:

Bot com Telegram: Intel Edison Embedded
Figura 9 – Interação com Bot – Envia mensagem para Display LCD.

E logo adiante o resultado no display LCD da Intel Edison:

Bot com Telegram: LCD
Figura 10 – Exibição da mensagem no Display LCD.

E como citei, e não deveria faltar: 2 “easter eggs” sensacionais!

Bot com Telegram: Tecnologia
Figura 11 – Easter Egg – Tecnologia? Embarcados!
Bot com Telegram: Intel Edison We Can
Figura 12 – Easter Egg – Intel? Edison!

Em breve pretendo também apresentar um artigo mostrando com detalhes como implementar um Bot de monitoramento com Intel Edison, capaz de tirar fotos, contar pessoas em vista, etc. Fique atento!

Não aguenta esperar até lá? Bom, então veja o código-fonte completo no repositório GitHub do EdisonGram neste link. Bom proveito!

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Guilhermy Azeredo
Guilhermy Azeredo
20/11/2015 00:30

O tutorial serve pro galileo tambem?

Home » Internet Das Coisas » Criando um bot com Telegram na Intel Edison

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: