Ir para o conteúdo

Lab 2.1: Orquestrando uma Automação

Sobre a automação

Para exercitar as funcionalidades do Orquestrador BotCity Maestro vamos usar a automação Web que criamos do Lab 1.5 com as seguintes modificações:

Objetivo

Refatorar o código original para:

  1. Substituir print por logging.
  2. Criar automaticamente um arquivo .txt (log_canais_youtube.txt) com as informações antes printadas.
  3. Tornar a execução mais robusta com tratamento de exceções com blocos try.except e finally.
  4. Incluir contadores de itens (canais) consumidos

Mudanças Necessárias

1. Inclusão de Logging

  • Importar o módulo logging.
    import logging
    
  • Configur logging para registrar mensagens em log_canais_youtube.txt.
    # Configuração do logging
    logging.basicConfig(
        filename="log_canais_youtube.txt",  # Arquivo que será gerado para upload
        level=logging.INFO,
        format="%(asctime)s - %(levelname)s - %(message)s",
        encoding='utf-8'
    )
    
  • Substituir os print por logging.info para registros informativos como no exemplo abaixo:
    logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}")
    
  • Adicionar logging.error para capturar possíveis exceções durante a coleta de dados.
    logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")
    

2. Tratamento de exceções

  • Cada iteração do loop que coleta dados do canal está envolvida em try/except.

  • Evita que uma falha em um canal interrompa todo o bot.

  • Exceções são registradas no log como ERROR.

Exemplo:

    for canal in canais:
        try:
            ...
            logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}")

        except Exception as ex:
            ...
            logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")
        finally:
            ...
            logging.info("Execução finalizada.")

3. Adicionando os contadores de itens

  • Foram criadas três variáveis antes do loop principal:
total_canais = len(canais)     # Total de canais a serem processados
canais_sucesso = 0             # Canais processados com sucesso
canais_falha = 0               # Canais que apresentaram erro
  • Incremento dos contadores

Dentro do loop de processamento de cada canal, os contadores são atualizados conforme o resultado:

  • Sucesso: se os dados do canal forem coletados corretamente:
canais_sucesso += 1
  • Falha: se ocorrer algum erro durante a coleta de dados de um canal:
canais_falha += 1

Código completo

# Import de Web Bot
from botcity.web import WebBot, Browser, By

# Import de integração com BotCity Maestro SDK
from botcity.maestro import *

from datetime import datetime

# WebDriver Manager para gerenciamento automático do driver
from webdriver_manager.firefox import GeckoDriverManager  # Instale com: pip install webdriver-manager

import logging

# Desativa mensagem de erros por não estar conectado ao Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

# Configuração do logging
logging.basicConfig(
    filename="log_canais_youtube.txt",  # Arquivo que será gerado para upload
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    encoding='utf-8'
)


def main():
    # Instancia do BotMaestroSDK
    maestro = BotMaestroSDK.from_sys_args()
    # Objeto com informações da execução
    execution = maestro.get_execution()

    print(f"Task ID is: {execution.task_id}")
    print(f"Task Parameters are: {execution.parameters}")

    bot = WebBot()

    # Configuração do modo headless
    bot.headless = False

    # Configuração do navegador
    bot.browser = Browser.FIREFOX

    # Usa WebDriver Manager para definir automaticamente o caminho do driver
    # Isso garante que a versão correta do geckodriver seja baixada e usada
    bot.driver_path = GeckoDriverManager().install()

    # Lista de canais para pesquisar
    canais = ['botcity_br', 'botcity-dev', 'youtube', 'github']

    # Inicializa contadores
    total_canais = len(canais)
    canais_sucesso = 0
    canais_falha = 0

    for canal in canais:
        try:
            logging.info(f"Iniciando coleta de dados do canal: {canal}")
            # Inicia o navegador na URL do canal
            bot.browse(f"https://www.youtube.com/@{canal}")

            # Retorna lista de elementos com os dados do canal
            element = bot.find_elements(
                selector='//span[@class="yt-core-attributed-string yt-content-metadata-view-model-wiz__metadata-text yt-core-attributed-string--white-space-pre-wrap yt-core-attributed-string--link-inherit-color" and @role="text"]',
                by=By.XPATH
            )

            # Captura o texto de cada elemento encontrado
            nome_canal = element[0].text
            numero_inscritos = element[1].text
            quantidade_videos = element[2].text

            logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}")

            canais_sucesso += 1  # Incrementa contador de sucesso

        except Exception as ex:
            logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")

            canais_falha += 1  # Incrementa contador de falha

        finally:
            # Espera 3 segundos e encerra o navegador
            bot.wait(3000)
            bot.stop_browser()

    logging.info("Execução finalizada.")
    logging.info(f"Total canais: {total_canais} | Canais com sucesso: {canais_sucesso} | Canais com falha: {canais_falha}")


if __name__ == '__main__':
    main()

Orquestrador BotCity Maestro

Após os ajustes acima, integraremos as seguintes funcionalidades do Orquestrador BotCity Maestro:

  • Estado de Tarefas: finalizar a tarefa com sucesso ou falha.
  • Parametrização de Tarefas: receber canais do YouTube como um parâmetro.
  • Erros: enviar mensagens de erros em caso de falhas.
  • Alerta: emitir alerta de informação no início do processo.
  • Logs: registrar entrada de log para cada execução com data e hora da coleta dos dados, nome do canal e número de inscritos.
  • Arquivos de Resultado: enviar captura de tela de cada canal para o Orquestrador BotCity Maestro.
  • Credenciais: armazenar credenciais de acesso ao navegador.
  • Agendamento: agendar a execução da tarefa.