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