
Bot de Automação Telegram
Este projeto nasceu de uma necessidade real: automatizar as tarefas repetitivas de gestão e envio de logs de estágio. Em vez de preencher e enviar formulários manualmente todos os dias, desenvolvi um bot no Telegram capaz de receber os dados, processá-los e arquivá-los corretamente, economizando horas de trabalho semanal.
Arquitetura e Funcionamento
O bot foi construído utilizando Python e a API oficial do Telegram. Ele é capaz de interpretar comandos estruturados, processar imagens e gerar e salvar relatórios diários. Como a ideia é automatizar um relatório diário de estágio, cada usuário só poderá ter um registro por data. O bot realiza perguntas padrão, referentes ao relatório para o qual este foi desenvolvido. Os dados são salvos em servidor PostgreeSQL dedicado.
Demonstração do bot interagindo com o usuário.
Desafios e Soluções (Código)
Um dos principais desafios foi lidar com chamadas assíncronas para não travar a execução do bot enquanto ele processava arquivos. Abaixo, um exemplo de como estruturei os estados e os handlers para lidar com cada situação:
def setup_handlers(app):# Handlers simples de comandos e callbacksapp.add_handler(CommandHandler('start', start))app.add_handler(CallbackQueryHandler(executar_exclusao, pattern='^deletefinal_'))# Máquina de estados para criação do diárioconv_handler = ConversationHandler(entry_points=[CommandHandler('register', initiate_register)],states={DATA: [MessageHandler(filters.TEXT, receber_data)],CONTEUDO: [MessageHandler(filters.TEXT, receber_conteudo)],ANEXOS: [MessageHandler(filters.PHOTO | filters.Document.ALL, receber_anexos)],CONFIRMACAO: [MessageHandler(filters.TEXT, confirmar_ou_editar)]},fallbacks=[CommandHandler('cancel', cancel)])app.add_handler(conv_handler)
Destaques da Implementação
- •Máquina de Estados (ConversationHandler)Gerencia fluxos complexos de interação. O bot não perde o contexto, guiando o usuário passo a passo no preenchimento do diário.
- •Integração CloudinaryAs mídias enviadas pelo Telegram não sobrecarregam o armazenamento local. Elas são enviadas para nuvem e salvas via URLs seguras.
- •Geração de ZIP On-The-FlyO bot empacota dados tabulares (CSV) nativamente e faz o download de imagens remotas (via `requests`), entregando um backup consolidado em tempo real.
Outro grande desafio foi gerenciar o upload de diferentes formatos de arquivos. O bot precisava ser robusto o suficiente para receber e processar nativamente fotos, documentos e até PDFs. Apesar desta ser minha ideia inicial, optei por manter apenas fotos como anexos válidos, pois a maioria dos arquivos recebidos seriam fotos e isto me permitiu integrar minha base de dados com Cloudinary, um serviço de armazenamento de imagens. Abaixo, um exemplo de manipulação de arquivos e integração com Cloudinary:
cloudinary.config(cloud_name=os.getenv("CLOUDINARY_CLOUD_NAME"),api_key=os.getenv("CLOUDINARY_API_KEY"),api_secret=os.getenv("CLOUDINARY_API_SECRET"),secure=True)
async def gerar_e_enviar_backup(update, context, csv_bytes, lista_arquivos):with zipfile.ZipFile(caminho_zip, 'w', zipfile.ZIP_DEFLATED) as zip_file:zip_file.writestr('Diario_Bordo.csv', csv_bytes)for item in lista_arquivos:if item['caminho'].startswith('http'):response = requests.get(item['caminho'])if response.status_code == 200:zip_file.writestr(item['nome_final'], response.content)with open(caminho_zip, 'rb') as arquivo_pronto:await context.bot.send_document(chat_id=update.effective_chat.id,document=arquivo_pronto,filename='Backup_Completo.zip')
Destaques da Implementação
- •Compactação EficienteUso da biblioteca nativa `zipfile` com o parâmetro `ZIP_DEFLATED` para otimizar o tamanho do arquivo final de backup.
- •Processamento em MemóriaImagens armazenadas no Cloudinary são baixadas em tempo de execução via `requests` e injetadas diretamente no ZIP usando `writestr`, sem precisar salvar os arquivos de imagem temporariamente no disco do servidor.
- •Entrega Nativa AssíncronaO arquivo compilado é enviado de volta ao usuário através do método `send_document` do Telegram de forma totalmente assíncrona (await), não bloqueando o restante da aplicação.
Estas são as interfaces de interação com o bot, que são usadas para visualização e edição das informações:
Demonstração do bot interagindo com o usuário.
Demonstração do bot interagindo com o usuário.
Este projeto além de sua utilidade, serviu para me ajudar a desenvolver minhas habilidades em desenvolvimento de automação, principalmente a aprender a trabalhar com a Telegram Bot API. Esse projeto, ademais de enriquecer meu portfólio, serviu para aprimorar minhas habilidades em projetos reais, visto que Bots são uma ferramenta bastante requisitada no mercado.