Programação
janeiro 24, 2019
Como comentei eu tive a ideia, que para mim humildemente é genial, de criar um bot no Telegram para me automatizar alguns processos e facilitar outros.
Para teste o primeiro que criei foi um script no Google Scripts que procura por faturas no meu email e o bot me envia junto com o anexo! Não é muito útil visto que eu só pago faturas em um dia específico no mês e não o tempo inteiro ou assim que recebo, mas achei legal para aprender tanto como configurar o bot como o próprio Google Scripts.
Infelizmente não posso colocar o código aqui porque ele tem o token do meu bot o que autoriza umas requests que não gostaria de deixar aberto, poderia mascarar o token antes de colocar mas o código está meio grande em um arquivo e não ficaria legal no post, então eu pretendo mascarar o token e colocar no Github, para qualquer um que quiser usar uma ideia parecida!
A segunda ideia que tive foi de um comando para adicionar gastos a minha
planilha pessoal de orçamento! Na tarefa dos emails tudo o que precisava era
enviar um request GET
de mensagem para o chat entre eu e o bot, mas nesse
caso eu precisaria que o bot fizesse um processamento de enviar para a planilha
além de me responder.
Para isso primeiro tive que aprender a diferença entra os métodos de update, um
sendo o getUpdates
e o outro Webhooks
, logo pensei que o ideal era usar o
segundo para assim ter resposta em tempo real em vez de esperar alguns minutos,
como me enganei!
Setar webhooks
é muito trabalhoso
visto que seu servidor tem que ter diversos requisitos do Telegram além de que
percebi que se você usar uma biblioteca que cuida do getUpdates
corretamente
nem vai notar a diferença, pelo menos eu não notei!!
A biblioteca que to usando é a pyTelegramBotAPI hosteada no Heroku, isso foi tão perfeito que no plano de graça a máquina dorme depois de 30 minutos de inatividade, porém como a api do Telegram fica pedindo updates de tempos em tempos ele acaba “acordando” a máquina e assim ela nunca fica inativa! E vualá, meu bot estava online e configurado usando o exemplo “echo bot”!!
Depois disso parti para criar o comando mas logo me encarei com o próximo
problema, eu pensei que internamente a api do Telegram já possuia suportes para
comandos multi linhas, por exemplo eu envio um comando para o bot /addgasto
,
o bot me realiza uma pergunta qual o valor?
e eu respondo de acordo, assim
com o BotFather
faz com seus comandos.
Mas descobri que cada mensagem é única e não ligada as outras, então eu teria que adicionar esse suporte manualmente, a solução que pensei não foi a das mais bonitas mas é basicamente usar esse objeto globalmente:
# Hack way to create a multi line command
current_command = {
'name': '',
'step': 0,
'data': {},
'status': codes.SUCCESS,
'running': False
}
Assim caso o current_command['running']
for verdadeiro significa que existe
um comando rolando com o nome de current_command['name']
. Os steps são os
passos para o comando ficar completo, assim dentro da função do comando eu sei
o que fazer exatamente naquele passo, aqui vai o comando de adicionar um gasto:
if current_command.get('step') == 0:
current_command['name'] = 'addgasto'
current_command['running'] = True
bot.send_message(message.from_user.id,
messages.create(current_command, "Qual mês?"),
reply_markup=markup_months)
elif current_command.get('step') == 1:
current_command['data']['month'] = message.text
bot.send_message(message.from_user.id,
messages.create(current_command, "Agora a descrição"),
reply_markup=markup_clear)
elif current_command.get('step') == 2:
current_command['data']['description'] = message.text
bot.send_message(message.from_user.id,
messages.create(current_command, "E o valor?"))
elif current_command.get('step') == 3:
current_command['data']['value'] = message.text
categories_query = '\'categoria-gastos\'!A1:Y1'
categories = sheet_api.get(categories_query)[0]
if not categories:
status = codes.ERROR
step = 0
else:
list_markup = markup_from_list(categories, rows=2)
bot.send_message(message.from_user.id,
messages.create(current_command, "Selecione a categoria"),
reply_markup=list_markup)
elif current_command.get('step') == 4:
current_command['data']['category'] = message.text
data = current_command['data']
today = dates.now()
insert_query = '\'{}-{}\'!A3'.format(today.year, data['month'])
value = [data['description'], data['value'], data['category'],
today.strftime(dates.DATETIME_FORMAT)]
result = sheet_api.append(value, insert_query)
if not result:
status = codes.ERROR
step = 0
else:
bot.send_message(message.from_user.id,
messages.create(current_command,
'Gasto {} de valor R${} e categoria {} adicionado com sucesso!'
.format(data['description'], data['value'], data['category'])),
reply_markup=markup_clear)
status = codes.FINISHED
A conexão com a planilha do Google foi muito simples, a documentação da Spreadsheet Api V4 é bem completa e o exemplo inicial é ótimo para tomar como base! Agora tenho um bot que envia meus emails de conta e adiciona gastos a minha planilha, genial!!
Vou subir ao Github logo o código dos emails mas fica a dúvida, o que mais eu consigo automatizar? O que ele consegue me ajudar? Pensei em fazer uma ligação com o meu TaskWarrior e todos os dias ele me mandar um lembrete das tarefas que tenho que fazer no dia, acredito que esse seja meu próximo passo!
Ainda não comentei também mas terminei de ler o livro Startup Enxuta
, estou
criando o hábito de ler mais esse ano e tenho me saído muito bem! O próximo
post vai ser um comentário geral do que achei do livro, os pontos que gostei e
tudo mais. Atualmente estou lendo o Trabalhe 4 horas por dia
e que livro
louco cara, bem diferente do que estou acostumado, assim que terminar também
falarei dele!
Ainda não estou gostando do meu formato de post, esse aqui pareceu muito engessado mas aos poucos vou tentar melhorar! Talvez uma foto do bot em produção ajudaria? Vou analisar melhor, de qualquer forma até a próxima!!
Aqui é o Nex! Sou um programador que está tentando entender o que é essa coisa de vida, eu escrevo basicamente sobre projetos e melhoria pessoal.
Caso queira falar comigo basta deixar um Oi! Você também pode me encontrar no Github ou LinkedIn.