Voltar para todos os projetos
Capa do projeto Bot de Automação Telegram

Bot de Automação Telegram

PythonTelegram APIAutomação
Ver no GitHub

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:

main.py
def setup_handlers(app):    # Handlers simples de comandos e callbacks    app.add_handler(CommandHandler('start', start))    app.add_handler(CallbackQueryHandler(executar_exclusao, pattern='^deletefinal_'))        # Máquina de estados para criação do diário    conv_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:

handlers.py
   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   )
handlers.py
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.