Implantação do framework na conta de destino#
Instalar python para todos os usuários, marcar "Add python.exe to PATH" nas opções de Instalação Personalizada:
- instalar python para todos os usuários
- Associar arquivos com Python (solicitar o lançador "py")
- Criar atalhos para aplicativos instalados
- Adicionar Python às variáveis de ambiente
- Pré-compilar a biblioteca padrão
Criar uma tarefa no Agendador de Tarefas do Windows com qualquer nome Geral:
- "Executar apenas para usuários que estão logados"
Gatilhos:
- "No login" --> "Usuário" (especificar)
- "Na conexão remota" --> "Conexão de um computador remoto" --> "Usuário" (especificar)
Ações:
- "Iniciar programa"
- "Programa ou script" --> Caminho completo até SherpaPython.exe
- "Pasta de trabalho" --> Caminho até a pasta onde está SherpaPython.exe, obrigatoriamente sem aspas, exemplo: D:\Sherpa_RPA\PythonSherpa-framework\
Executar manualmente SherpaPython.exe uma vez
Os logs do framework serão armazenados no caminho C:\Users\User\AppData\Roaming\Sherpa RPA Python
O arquivo de configurações settings.txt será armazenado no caminho C:\Users\User\AppData\Roaming\Sherpa RPA Python
Conteúdo de settings.txt
- << Insira o guid do robô >> - substituir pelo GUID do robô
- << Insira o host do robô >> - inserir o host ou IP do orquestrador junto com o protocolo, por exemplo https://orchestrator2.sherparpa.ru
- << Insira o status de logoff do robô >> - um dígito (0 - não é realizado logoff automático após a conclusão do trabalho, 1 - é realizado logoff automático após a conclusão do trabalho, na ausência da terceira linha considera-se que o valor 1 está definido)
RobotsOrcFramework
Tratamento de parada suave dentro do robô python
import signal
import time
import sys
class TestProcess1():
stop = False
def __init__(self):
# Captura do sinal de parada suave do framework
signal.signal(signal.SIGBREAK, self.stop_process)
# Tratamento do sinal como uma alternância de flag
def stop_process(self, signal, frame):
self.stop = True
def robot_work(self):
for elem in range(10):
time.sleep(1)
# Se a flag estiver na posição correta, interromper o programa
if self.stop:
sys.exit()
test = TestProcess1()
test.robot_work()
Obter e processar argumentos do framework dentro do robô python
# processar argumentos da linha de comando
def process_cmd_arguments(argv):
process_version_guid = argv[0]
job_guid = argv[1]
settings_path = argv[3]
process_cmd_arguments(sys.argv[1].split("|"))
Obter host e GUID do robô dentro do robô python
# obter configurações
def get_settings():
with open(settings_path, "r", encoding="utf-8") as file:
settings = file.read()
settings = [elem.replace("\n", "") for elem in settings.split("\n")]
return settings[0], settings[1]
robot_GUID, host = get_settings()
Caminho para scripts python dos robôs
No nome da versão do processo no orquestrador, indicar o caminho para o script python,
em relação ao arquivo do framework (RobotsOrcFramework.py)
Formato
pasta1\pasta2\nome do script sem extensão
Uso do TaskOrchestratorAPI
from TaskOrcAPI import TaskOrchestratorAPI # pasta OrchestratorAPI
TOA = TaskOrchestratorAPI(robot_guid, host, headers)
Adicionando tarefa à fila
param_task pode não ser especificado, por padrão {"":""}
name pode não ser especificado, por padrão "NewTask"
queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
param_task = {"param1": "1", "param2": "2", "param3": "3"}
name = 'Nova Tarefa'
result = TOA.add_task(queue_GUID)
result['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
Obtendo tarefa da fila
status, pode não ser especificado, por padrão 0
queue_GUID = "f96b549d-bc58-48b9-ba78-463692c7680b"
status = 1
result = TOA.get_task(queue_GUID, status)
result_dict = json.loads(result.text)
result # <Response [200]> Código da requisição
result_dict['id'] # 1171
result_dict['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
result_dict['name'] # NewTask
result_dict['status'] # 4
result_dict['created'] # 2022-10-28 06:19:19
result_dict['updated'] # 2022-10-28 09:45:45
result_dict['comment'] # comentário
result_dict['priority'] # 1
result_dict['deadline'] # 2022-10-28 06:19:19
result_dict['postponed'] # 2022-10-28 09:45:45
result_dict['parameters'] # {"param": "value"}
result_dict['description'] # None
Atualizando o status da tarefa obtida anteriormente
Tabela de status das tarefas
STATUS_NEW = 0; # Nova tarefa
STATUS_IN_PROGRESS = 1; # Tarefa em andamento
STATUS_SUCCESS = 2; # Tarefa concluída com sucesso
STATUS_FAILED = 3; # Tarefa falhou com Exceção de Aplicação
STATUS_FAILED_BUSINESS = 4; # Tarefa falhou com Exceção de Negócio
STATUS_POSTPONED = 5; # Tarefa adiada até o horário especificado
STATUS_ABANDONED = 6; # Tarefa abandonada (não processada a tempo)
status, pode não ser especificado, por padrão 0
task_GUID = '4e9cb924-681a-4d1d-9420-e1dac677f3fa'
status = 5
result = TOA.update_task_status(task_GUID, status)
result # <Response [200]> Código da requisição
Obtendo recurso (asset)
asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"
result = TOA.get_asset(asset_GUID)
result['id'] # 1171
result['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d
result['name'] # Recurso
result['text'] # 4
result['type'] # 1
result['created'] # 2022-10-28 06:19:19
result['updated'] # 2022-10-28 06:19:19
result['robot_id'] # None
result['password'] # 2022-10-28 06:19:19
result['is_deleted'] # 0
result['account_id'] # 27
result['robot_type'] # 3
result['description'] # ''
result['robot_group_id'] # None
Atualizando recurso
name pode não ser especificado, por padrão NewName
se o recurso for credenciais (credentials), especificamos password, então text = username, caso contrário, não especificamos
asset_GUID = "d042c0cf-4862-48e7-8d10-caf892ceec3f"
text = 'Novo recurso'
name = 'Recurso'
password = '777'
result = TOA.asset_update(asset_GUID, text, name, password)
result # <Response [200]> Código da requisição
Adicionando nova entrada ao log
Valores permitidos para Level: 'Info', 'Critical', 'Error', 'Warning', 'Debug'
level pode não ser especificado, por padrão 'Info'
message pode não ser especificado, por padrão ''
robot_guid = sys.argv[1]
process_version_guid = 'f7952815-a238-4870-b678-943b0119d0f4'
job_guid = '922d3cc6-99ec-44c2-b0a0-62114c9d2908'
level, message = 'Info', 'mensagem'
result = TOA.add_new_log_entry(
robot_guid, process_version_guid, job_guid
)
result_dict = json.loads(result.text)
result # <Response [200]> Código da requisição
result_dict['guid'] # d5fc7d6e-b609-4aaa-be35-e51fdacb5b5d