Gestão de tarefas, logs, alertas e mais
Até o momento, focamos na construção de nossa automação e execução através do orquestrador BotCity Maestro.
A execução através do BotCity Maestro nos dá benefícios como:
- Disparo de tarefas pelo time de operação
- Acompanhamento de execução
- Execução paralela de tarefas através de múltiplos Runners
- Gestão de tarefas
- Acompanhamento de logs, alertas e erros
- Gerenciamento de arquivos de resultados
- Gerenciamento de credenciais
- e muito mais
Você pode conferir todas as funcionalidades do BotCity Maestro em nossa documentação.
BotCity Maestro SDK
Todas as funcionalidades disponíveis no portal do BotCity Maestro também estão disponíveis via API.
A BotCity também oferece SDKs específicos para linguagens como Python, Java, Javascript e Typescript.
Nesta etapa do nosso tutorial vamos focar na utilização do BotCity Maestro SDK.
Integração com BotCity Maestro
Todos os projetos criados com o template da BotCity possuem uma instância do BotCity Maestro SDK já disponível em nossa classe Bot
que pode ser acessada via self.maestro
.
Outro ponto importante a ser ressaltado é que quando executamos nossa automação via BotCity Runner, a instância do BotCity Maestro estará automaticamente autenticada e pronta para uso juntamente com o parâmetro execution
do método action
.
...
class Bot(DesktopBot):
def action(self, execution=None):
# Uncomment to silence Maestro errors when disconnected
# if self.maestro:
# self.maestro.RAISE_NOT_CONNECTED = False
# Fetch the Activity ID from the task:
# task = self.maestro.get_task(execution.task_id)
# activity_id = task.activity_id
# Opens the BotCity website.
self.browse("http://www.botcity.dev")
# Uncomment to mark this task as finished on BotMaestro
...
Atenção
Quando rodamos o código localmente, o parâmetro execution
será None
e a instância do BotCity Maestro também.
Podemos facilmente tratar isso em nosso código com um condicional ou silenciar os erros com:
if self.maestro:
self.maestro.RAISE_NOT_CONNECTED = False
Para simplificar nosso código, vamos assumir que todas execuções serão feitas via BotCity Maestro e Runner
Gestão de tarefas
Como vimos na etapa anterior, nós somos responsáveis por indicar o estado em que a tarefa foi finalizada em nossa lógica.
Para finalizar uma tarefa podemos utilizar o método finish_task
do BotCity Maestro SDK.
Vamos alterar nosso código para que ao final do processo o BotCity Maestro seja notificado do sucesso de nossa tarefa.
Para isso adicione o seguinte bloco de código ao final do método action
em seu robô:
self.maestro.finish_task(
task_id=execution.task_id,
status=AutomationTaskFinishStatus.SUCCESS,
message="Tarefa BotYoutube finalizada com sucesso"
)
Note que pegamos o parâmetro task_id
através do execution
.
Dica
Você pode finalizar a tarefa com os seguintes estados:
SUCCESS
: Sucesso, tudo ocorreu conforme o esperadoFAILED
: Falha, algum erro ocorreu e o robô não conseguiu executar a tarefaPARTIALLY_COMPLETED
: Sucesso parcial, parte da tarefa foi executada com sucesso. Como um exemplo, pense em um robô que processa entradas em uma planilha porém apenas uma parte dos dados é processado com sucesso.
Após execução, os detalhes da tarefa exibirão os dados informados na finalização da tarefa.
Emitindo Alertas
Quando temos diversas automações sendo executadas ao mesmo tempo, é muito dificil de acompanhar toda a operação de forma rápida. Alertas são utilizados para obtermos notificações que descrevem algum aspecto de um automação.
Os tipos possíveis de alerta são:
- INFO mensagens informativas exibidas em cinza.
- WARNING mensagens de advertência exibidas em amarelo.
- ERROR mensagens de erro exibidas em vermelho.
Para criarmos um alerta podemos utilizar o método alert
do BotCity Maestro SDK.
Vamos alterar nosso código para que ao início do processo o BotCity Maestro seja notificado que nossa tarefa está começando
Para isso adicione o seguinte bloco de código ao inicio do método action
em seu robô:
self.maestro.alert(
task_id=execution.task_id,
title="BotYoutube - Inicio",
message="Estamos iniciando o processo",
alert_type=AlertType.INFO
)
Quando executarmos nossa tarefa, vamos poder observar que um novo alerta foi gerado na tela de Alertas.
Logs de execução
O BotCity Maestro permite a criação de logs customizados para armazenamento de informações relacionadas a sua automação.
Você pode definir todas as colunas e inserir registros via API ou utilizando o BotCity Maestro SDK.
Criando um log
Através do BotCity Maestro podemos criar logs utilizando a funcionalidade Log de Execução
no menu esquerdo.
Clicando em Novo Log
, uma nova tela é exibida onde devemos preencher os seguintes campos:
Label
: Identificador único deste log que utilizaremos para interfacear com o log via API ou SDK.Colunas
: lista de colunas para nossas informações.Nome
: nome a ser exibido para usuários.Label
: identificador único para esta coluna neste log que utilizaremos para interfacera com a entrada de log via API ou SDK.width
: largura sugerida para esta coluna quando exibindo o log para usuários.
Para nosso tutorial, vamos criar o log com label EstatisticasYoutube
e as seguintes colunas:
Nome | Label | width |
---|---|---|
Data/Hora | data_hora | 300 |
Canal | canal | 300 |
Inscritos | inscritos | 200 |
Visualizacoes | visualizacoes | 200 |
Após o preenchimento, nossa tela ficará da seguinte forma:
Clique em Salvar e nosso novo log será gerado.
Criando novos registros de log
Agora que temos nosso log criado, vamos alterar nosso código para que novos registros de log sejam gerados.
Para o campo Data/Hora
, vamos adicionar um novo import
no topo do nosso arquivo para o pacote datetime
.
import datetime
...
Em seguida, vamos alterar nosso código para não somente exibir os valores mas também salvá-los em uma variavel para que seja enviado.
import datetime
from botcity.core import DesktopBot
from botcity.maestro import *
class Bot(DesktopBot):
def action(self, execution=None):
...
# Opens the BotCity website.
self.browse("https://www.youtube.com/c/pythonbrasiloficial")
if not self.find( "sobre", matching=0.97, waiting_time=10000):
self.not_found("sobre")
self.click()
if not self.find( "inscritos", matching=0.97, waiting_time=10000):
self.not_found("inscritos")
self.double_click_relative(-39, 7)
self.control_c()
inscritos = self.get_clipboard()
print(f"Inscritos => {inscritos}")
if not self.find( "visualizacoes", matching=0.97, waiting_time=10000):
self.not_found("visualizacoes")
self.double_click_relative(-28, 5)
self.control_c()
visualizacoes = self.get_clipboard()
print(f"Visualizações => {visualizacoes}")
...
Após as alterações acima, vamos agora adicionar o código para o registro de novas entradas de log.
Para isso vamos utilizar o método new_log_entry
do BotCity Maestro SDK.
self.maestro.new_log_entry(
activity_label="EstatisticasYoutube",
values = {
"data_hora": datetime.datetime.now().strftime("%Y-%m-%d_%H-%M"),
"canal": "pythonbrasiloficial",
"inscritos": inscritos,
"visualizacoes": visualizacoes
}
)
Quando executarmos nossa tarefa, vamos poder observar que um novo alerta foi gerado na tela de entradas de log.