handsbot-maestro-sdk 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- handsbot_maestro_sdk-0.1.0/LICENSE +5 -0
- handsbot_maestro_sdk-0.1.0/PKG-INFO +118 -0
- handsbot_maestro_sdk-0.1.0/README.md +96 -0
- handsbot_maestro_sdk-0.1.0/handsbot_maestro_sdk.egg-info/PKG-INFO +118 -0
- handsbot_maestro_sdk-0.1.0/handsbot_maestro_sdk.egg-info/SOURCES.txt +11 -0
- handsbot_maestro_sdk-0.1.0/handsbot_maestro_sdk.egg-info/dependency_links.txt +1 -0
- handsbot_maestro_sdk-0.1.0/handsbot_maestro_sdk.egg-info/requires.txt +1 -0
- handsbot_maestro_sdk-0.1.0/handsbot_maestro_sdk.egg-info/top_level.txt +1 -0
- handsbot_maestro_sdk-0.1.0/maestro/__init__.py +11 -0
- handsbot_maestro_sdk-0.1.0/maestro/client.py +205 -0
- handsbot_maestro_sdk-0.1.0/maestro/exceptions.py +11 -0
- handsbot_maestro_sdk-0.1.0/pyproject.toml +35 -0
- handsbot_maestro_sdk-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Copyright © 2026 4HandsBot. Todos os direitos reservados.
|
|
2
|
+
|
|
3
|
+
O uso deste SDK é permitido exclusivamente por clientes autorizados,
|
|
4
|
+
em conjunto com os serviços da plataforma. É proibida a redistribuição,
|
|
5
|
+
publicação, sublicenciamento ou utilização fora dessa finalidade.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: handsbot-maestro-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: SDK Python para criação de tarefas no Maestro (4HandsBot)
|
|
5
|
+
Project-URL: Homepage, https://github.com/fourhandsbot/maestro
|
|
6
|
+
Project-URL: Bug Tracker, https://github.com/fourhandsbot/maestro/issues
|
|
7
|
+
Keywords: maestro,handsbot,automation,rpa,sdk
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: License :: Other/Proprietary License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: requests>=2.31.0
|
|
21
|
+
Dynamic: license-file
|
|
22
|
+
|
|
23
|
+
# handsbot-maestro-sdk
|
|
24
|
+
|
|
25
|
+
SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
|
|
26
|
+
|
|
27
|
+
## Instalação
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install handsbot-maestro-sdk
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Uso rápido
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
from maestro import MaestroSDK
|
|
37
|
+
|
|
38
|
+
sdk = MaestroSDK(
|
|
39
|
+
api_url="https://empresa.com.br/api/v1",
|
|
40
|
+
workspace="",
|
|
41
|
+
login="",
|
|
42
|
+
keypass="",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
task = sdk.create_task(
|
|
46
|
+
label="minha_automacao",
|
|
47
|
+
parameters=[
|
|
48
|
+
{"label": "destinatario", "value": "admin@empresa.com"},
|
|
49
|
+
],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
print(task.uuid, task.status)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Configuração
|
|
56
|
+
|
|
57
|
+
As credenciais podem ser passadas de duas formas (argumentos têm precedência):
|
|
58
|
+
|
|
59
|
+
### Via variáveis de ambiente
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
export MAESTRO_API_URL=http://localhost:3001/api/v1
|
|
63
|
+
export MAESTRO_WORKSPACE=dev
|
|
64
|
+
export MAESTRO_LOGIN=empresa
|
|
65
|
+
export MAESTRO_KEYPASS=pass
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
sdk = MaestroSDK() # lê as variáveis automaticamente
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Via argumentos do construtor
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
sdk = MaestroSDK(
|
|
76
|
+
api_url="https://empresa.com.br/api/v1",
|
|
77
|
+
workspace="dev",
|
|
78
|
+
login="empresa",
|
|
79
|
+
keypass="pass",
|
|
80
|
+
)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## `create_task`
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
task = sdk.create_task(
|
|
87
|
+
label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
|
|
88
|
+
parameters=[ # opcional
|
|
89
|
+
{"label": "param1", "value": "valor1"},
|
|
90
|
+
],
|
|
91
|
+
priority=1, # opcional, padrão 1
|
|
92
|
+
min_execution_date=datetime(...), # opcional — executa somente após esse momento
|
|
93
|
+
)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Parâmetro | Tipo | Descrição |
|
|
97
|
+
| -------------------- | ------------ | ------------------------------------------------- |
|
|
98
|
+
| `label` | `str` | Label da automação cadastrada no Maestro |
|
|
99
|
+
| `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
|
|
100
|
+
| `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
|
|
101
|
+
| `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
|
|
102
|
+
|
|
103
|
+
## Exceções
|
|
104
|
+
|
|
105
|
+
| Exceção | Quando |
|
|
106
|
+
| ------------------------ | -------------------------------------------------- |
|
|
107
|
+
| `MaestroConfigError` | Credenciais ausentes na inicialização |
|
|
108
|
+
| `MaestroAuthError` | Credenciais inválidas ou token expirado |
|
|
109
|
+
| `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
|
|
110
|
+
| `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
|
|
111
|
+
|
|
112
|
+
## Licença
|
|
113
|
+
|
|
114
|
+
Copyright © 2026 4HandsBot. Todos os direitos reservados.
|
|
115
|
+
|
|
116
|
+
O uso deste SDK é permitido exclusivamente por clientes autorizados,
|
|
117
|
+
em conjunto com os serviços da plataforma. É proibida a redistribuição,
|
|
118
|
+
publicação, sublicenciamento ou utilização fora dessa finalidade.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# handsbot-maestro-sdk
|
|
2
|
+
|
|
3
|
+
SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
|
|
4
|
+
|
|
5
|
+
## Instalação
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install handsbot-maestro-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Uso rápido
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
from maestro import MaestroSDK
|
|
15
|
+
|
|
16
|
+
sdk = MaestroSDK(
|
|
17
|
+
api_url="https://empresa.com.br/api/v1",
|
|
18
|
+
workspace="",
|
|
19
|
+
login="",
|
|
20
|
+
keypass="",
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
task = sdk.create_task(
|
|
24
|
+
label="minha_automacao",
|
|
25
|
+
parameters=[
|
|
26
|
+
{"label": "destinatario", "value": "admin@empresa.com"},
|
|
27
|
+
],
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
print(task.uuid, task.status)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Configuração
|
|
34
|
+
|
|
35
|
+
As credenciais podem ser passadas de duas formas (argumentos têm precedência):
|
|
36
|
+
|
|
37
|
+
### Via variáveis de ambiente
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
export MAESTRO_API_URL=http://localhost:3001/api/v1
|
|
41
|
+
export MAESTRO_WORKSPACE=dev
|
|
42
|
+
export MAESTRO_LOGIN=empresa
|
|
43
|
+
export MAESTRO_KEYPASS=pass
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
sdk = MaestroSDK() # lê as variáveis automaticamente
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Via argumentos do construtor
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
sdk = MaestroSDK(
|
|
54
|
+
api_url="https://empresa.com.br/api/v1",
|
|
55
|
+
workspace="dev",
|
|
56
|
+
login="empresa",
|
|
57
|
+
keypass="pass",
|
|
58
|
+
)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## `create_task`
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
task = sdk.create_task(
|
|
65
|
+
label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
|
|
66
|
+
parameters=[ # opcional
|
|
67
|
+
{"label": "param1", "value": "valor1"},
|
|
68
|
+
],
|
|
69
|
+
priority=1, # opcional, padrão 1
|
|
70
|
+
min_execution_date=datetime(...), # opcional — executa somente após esse momento
|
|
71
|
+
)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
| Parâmetro | Tipo | Descrição |
|
|
75
|
+
| -------------------- | ------------ | ------------------------------------------------- |
|
|
76
|
+
| `label` | `str` | Label da automação cadastrada no Maestro |
|
|
77
|
+
| `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
|
|
78
|
+
| `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
|
|
79
|
+
| `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
|
|
80
|
+
|
|
81
|
+
## Exceções
|
|
82
|
+
|
|
83
|
+
| Exceção | Quando |
|
|
84
|
+
| ------------------------ | -------------------------------------------------- |
|
|
85
|
+
| `MaestroConfigError` | Credenciais ausentes na inicialização |
|
|
86
|
+
| `MaestroAuthError` | Credenciais inválidas ou token expirado |
|
|
87
|
+
| `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
|
|
88
|
+
| `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
|
|
89
|
+
|
|
90
|
+
## Licença
|
|
91
|
+
|
|
92
|
+
Copyright © 2026 4HandsBot. Todos os direitos reservados.
|
|
93
|
+
|
|
94
|
+
O uso deste SDK é permitido exclusivamente por clientes autorizados,
|
|
95
|
+
em conjunto com os serviços da plataforma. É proibida a redistribuição,
|
|
96
|
+
publicação, sublicenciamento ou utilização fora dessa finalidade.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: handsbot-maestro-sdk
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: SDK Python para criação de tarefas no Maestro (4HandsBot)
|
|
5
|
+
Project-URL: Homepage, https://github.com/fourhandsbot/maestro
|
|
6
|
+
Project-URL: Bug Tracker, https://github.com/fourhandsbot/maestro/issues
|
|
7
|
+
Keywords: maestro,handsbot,automation,rpa,sdk
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: License :: Other/Proprietary License
|
|
14
|
+
Classifier: Operating System :: OS Independent
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Requires-Python: >=3.9
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: requests>=2.31.0
|
|
21
|
+
Dynamic: license-file
|
|
22
|
+
|
|
23
|
+
# handsbot-maestro-sdk
|
|
24
|
+
|
|
25
|
+
SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
|
|
26
|
+
|
|
27
|
+
## Instalação
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install handsbot-maestro-sdk
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Uso rápido
|
|
34
|
+
|
|
35
|
+
```python
|
|
36
|
+
from maestro import MaestroSDK
|
|
37
|
+
|
|
38
|
+
sdk = MaestroSDK(
|
|
39
|
+
api_url="https://empresa.com.br/api/v1",
|
|
40
|
+
workspace="",
|
|
41
|
+
login="",
|
|
42
|
+
keypass="",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
task = sdk.create_task(
|
|
46
|
+
label="minha_automacao",
|
|
47
|
+
parameters=[
|
|
48
|
+
{"label": "destinatario", "value": "admin@empresa.com"},
|
|
49
|
+
],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
print(task.uuid, task.status)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Configuração
|
|
56
|
+
|
|
57
|
+
As credenciais podem ser passadas de duas formas (argumentos têm precedência):
|
|
58
|
+
|
|
59
|
+
### Via variáveis de ambiente
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
export MAESTRO_API_URL=http://localhost:3001/api/v1
|
|
63
|
+
export MAESTRO_WORKSPACE=dev
|
|
64
|
+
export MAESTRO_LOGIN=empresa
|
|
65
|
+
export MAESTRO_KEYPASS=pass
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
sdk = MaestroSDK() # lê as variáveis automaticamente
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Via argumentos do construtor
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
sdk = MaestroSDK(
|
|
76
|
+
api_url="https://empresa.com.br/api/v1",
|
|
77
|
+
workspace="dev",
|
|
78
|
+
login="empresa",
|
|
79
|
+
keypass="pass",
|
|
80
|
+
)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## `create_task`
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
task = sdk.create_task(
|
|
87
|
+
label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
|
|
88
|
+
parameters=[ # opcional
|
|
89
|
+
{"label": "param1", "value": "valor1"},
|
|
90
|
+
],
|
|
91
|
+
priority=1, # opcional, padrão 1
|
|
92
|
+
min_execution_date=datetime(...), # opcional — executa somente após esse momento
|
|
93
|
+
)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Parâmetro | Tipo | Descrição |
|
|
97
|
+
| -------------------- | ------------ | ------------------------------------------------- |
|
|
98
|
+
| `label` | `str` | Label da automação cadastrada no Maestro |
|
|
99
|
+
| `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
|
|
100
|
+
| `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
|
|
101
|
+
| `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
|
|
102
|
+
|
|
103
|
+
## Exceções
|
|
104
|
+
|
|
105
|
+
| Exceção | Quando |
|
|
106
|
+
| ------------------------ | -------------------------------------------------- |
|
|
107
|
+
| `MaestroConfigError` | Credenciais ausentes na inicialização |
|
|
108
|
+
| `MaestroAuthError` | Credenciais inválidas ou token expirado |
|
|
109
|
+
| `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
|
|
110
|
+
| `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
|
|
111
|
+
|
|
112
|
+
## Licença
|
|
113
|
+
|
|
114
|
+
Copyright © 2026 4HandsBot. Todos os direitos reservados.
|
|
115
|
+
|
|
116
|
+
O uso deste SDK é permitido exclusivamente por clientes autorizados,
|
|
117
|
+
em conjunto com os serviços da plataforma. É proibida a redistribuição,
|
|
118
|
+
publicação, sublicenciamento ou utilização fora dessa finalidade.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
handsbot_maestro_sdk.egg-info/PKG-INFO
|
|
5
|
+
handsbot_maestro_sdk.egg-info/SOURCES.txt
|
|
6
|
+
handsbot_maestro_sdk.egg-info/dependency_links.txt
|
|
7
|
+
handsbot_maestro_sdk.egg-info/requires.txt
|
|
8
|
+
handsbot_maestro_sdk.egg-info/top_level.txt
|
|
9
|
+
maestro/__init__.py
|
|
10
|
+
maestro/client.py
|
|
11
|
+
maestro/exceptions.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
requests>=2.31.0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
maestro
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .client import MaestroSDK, Task
|
|
2
|
+
from .exceptions import MaestroError, MaestroAuthError, MaestroConnectionError, MaestroConfigError
|
|
3
|
+
|
|
4
|
+
__all__ = [
|
|
5
|
+
"MaestroSDK",
|
|
6
|
+
"Task",
|
|
7
|
+
"MaestroError",
|
|
8
|
+
"MaestroAuthError",
|
|
9
|
+
"MaestroConnectionError",
|
|
10
|
+
"MaestroConfigError",
|
|
11
|
+
]
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import time
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Optional, List, Dict, Any
|
|
6
|
+
|
|
7
|
+
if hasattr(sys.stdout, "reconfigure"):
|
|
8
|
+
sys.stdout.reconfigure(encoding="utf-8")
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
import requests as _requests
|
|
12
|
+
_HAS_REQUESTS = True
|
|
13
|
+
except ImportError:
|
|
14
|
+
_HAS_REQUESTS = False
|
|
15
|
+
|
|
16
|
+
from .exceptions import MaestroAuthError, MaestroConnectionError, MaestroConfigError, MaestroError
|
|
17
|
+
|
|
18
|
+
_TOKEN_REFRESH_MARGIN = 300 # renova 5 min antes de expirar
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Task:
|
|
22
|
+
"""Tarefa retornada pela API após criação."""
|
|
23
|
+
|
|
24
|
+
def __init__(self, data: Dict[str, Any]):
|
|
25
|
+
self.uuid: str = data.get("uuid", "")
|
|
26
|
+
self.status: str = data.get("status", "")
|
|
27
|
+
self.priority: int = data.get("priority", 1)
|
|
28
|
+
self.min_execution_date: Optional[str] = data.get("min_execution_date")
|
|
29
|
+
self._raw = data
|
|
30
|
+
|
|
31
|
+
def __repr__(self) -> str:
|
|
32
|
+
return f"Task(uuid={self.uuid!r}, status={self.status!r})"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class MaestroSDK:
|
|
36
|
+
"""
|
|
37
|
+
SDK Python para o Maestro (4HandsBot).
|
|
38
|
+
|
|
39
|
+
Cria e enfileira tarefas de automação via API.
|
|
40
|
+
|
|
41
|
+
Configuração — duas formas (argumentos têm precedência sobre variáveis de ambiente):
|
|
42
|
+
|
|
43
|
+
1. Variáveis de ambiente:
|
|
44
|
+
MAESTRO_API_URL, MAESTRO_WORKSPACE, MAESTRO_LOGIN, MAESTRO_KEYPASS
|
|
45
|
+
|
|
46
|
+
2. Argumentos do construtor (útil para testes locais):
|
|
47
|
+
sdk = MaestroSDK(
|
|
48
|
+
api_url="http://localhost:3001/api/v1",
|
|
49
|
+
workspace="minha-empresa",
|
|
50
|
+
login="automacao@empresa.com",
|
|
51
|
+
keypass="senha",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
A autenticação ocorre na inicialização — se as credenciais forem inválidas
|
|
55
|
+
ou a API estiver inacessível, uma exceção é lançada imediatamente.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
api_url: Optional[str] = None,
|
|
61
|
+
workspace: Optional[str] = None,
|
|
62
|
+
login: Optional[str] = None,
|
|
63
|
+
keypass: Optional[str] = None,
|
|
64
|
+
):
|
|
65
|
+
self._api_url = api_url or os.environ.get("MAESTRO_API_URL")
|
|
66
|
+
self._workspace = workspace or os.environ.get("MAESTRO_WORKSPACE")
|
|
67
|
+
self._login = login or os.environ.get("MAESTRO_LOGIN")
|
|
68
|
+
self._keypass = keypass or os.environ.get("MAESTRO_KEYPASS")
|
|
69
|
+
|
|
70
|
+
self._token: Optional[str] = None
|
|
71
|
+
self._token_expires_at: Optional[float] = None
|
|
72
|
+
|
|
73
|
+
self._assert_api_config()
|
|
74
|
+
self._assert_requests()
|
|
75
|
+
self._do_authenticate()
|
|
76
|
+
|
|
77
|
+
def create_task(
|
|
78
|
+
self,
|
|
79
|
+
label: str,
|
|
80
|
+
parameters: Optional[List[Dict[str, str]]] = None,
|
|
81
|
+
priority: int = 1,
|
|
82
|
+
min_execution_date: Optional[datetime] = None,
|
|
83
|
+
) -> Task:
|
|
84
|
+
"""
|
|
85
|
+
Cria e enfileira uma tarefa pelo label da automação.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
label: Label da automação cadastrada no Maestro.
|
|
89
|
+
parameters: Lista de dicionários {"label": ..., "value": ...}.
|
|
90
|
+
Os labels devem corresponder aos parâmetros da automação.
|
|
91
|
+
priority: Prioridade da tarefa (padrão: 1).
|
|
92
|
+
min_execution_date: Data/hora mínima para execução. Se informada, a tarefa
|
|
93
|
+
só será iniciada pelo runner após esse momento.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
Task com uuid e status inicial ("pending").
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
MaestroError: Automação não encontrada ou parâmetro inválido.
|
|
100
|
+
MaestroAuthError: Credenciais inválidas ou token expirado.
|
|
101
|
+
MaestroConnectionError: Falha de rede.
|
|
102
|
+
"""
|
|
103
|
+
body: Dict[str, Any] = {
|
|
104
|
+
"label": label,
|
|
105
|
+
"priority": priority,
|
|
106
|
+
"parameters": parameters or [],
|
|
107
|
+
}
|
|
108
|
+
if min_execution_date is not None:
|
|
109
|
+
body["min_execution_date"] = min_execution_date.isoformat()
|
|
110
|
+
|
|
111
|
+
resp = self._request("POST", "/tasks/by-label", json=body)
|
|
112
|
+
|
|
113
|
+
if resp.status_code == 404:
|
|
114
|
+
raise MaestroError(resp.json().get("error", f"Automação '{label}' não encontrada."))
|
|
115
|
+
if resp.status_code == 400:
|
|
116
|
+
raise MaestroError(resp.json().get("error", "Parâmetros inválidos."))
|
|
117
|
+
if not resp.ok:
|
|
118
|
+
raise MaestroError(f"Erro ao criar tarefa (HTTP {resp.status_code}): {resp.text}")
|
|
119
|
+
|
|
120
|
+
return Task(resp.json())
|
|
121
|
+
|
|
122
|
+
# ------------------------------------------------------------------
|
|
123
|
+
# Autenticação (interno)
|
|
124
|
+
# ------------------------------------------------------------------
|
|
125
|
+
|
|
126
|
+
def _authenticate(self) -> str:
|
|
127
|
+
if self._token and self._token_expires_at:
|
|
128
|
+
if time.time() < self._token_expires_at - _TOKEN_REFRESH_MARGIN:
|
|
129
|
+
return self._token
|
|
130
|
+
self._do_authenticate()
|
|
131
|
+
return self._token # type: ignore[return-value]
|
|
132
|
+
|
|
133
|
+
def _do_authenticate(self) -> None:
|
|
134
|
+
self._assert_requests()
|
|
135
|
+
self._assert_api_config()
|
|
136
|
+
|
|
137
|
+
url = f"{self._api_url}/auth/client-login"
|
|
138
|
+
body = {
|
|
139
|
+
"workspace": self._workspace,
|
|
140
|
+
"login": self._login,
|
|
141
|
+
"keypass": self._keypass,
|
|
142
|
+
}
|
|
143
|
+
headers = {"Content-Type": "application/json", "X-Client-Type": "sdk"}
|
|
144
|
+
|
|
145
|
+
try:
|
|
146
|
+
resp = _requests.post(url, json=body, headers=headers, timeout=30)
|
|
147
|
+
except _requests.RequestException as exc:
|
|
148
|
+
raise MaestroConnectionError(f"Falha ao conectar à API Maestro: {exc}") from exc
|
|
149
|
+
|
|
150
|
+
if resp.status_code == 401:
|
|
151
|
+
raise MaestroAuthError("Credenciais inválidas.")
|
|
152
|
+
if not resp.ok:
|
|
153
|
+
raise MaestroAuthError(f"Falha na autenticação (HTTP {resp.status_code}): {resp.text}")
|
|
154
|
+
|
|
155
|
+
data = resp.json()
|
|
156
|
+
self._token = data["token"]
|
|
157
|
+
expires_raw: str = data["expires_at"]
|
|
158
|
+
dt = datetime.fromisoformat(expires_raw.replace("Z", "+00:00"))
|
|
159
|
+
self._token_expires_at = dt.timestamp()
|
|
160
|
+
|
|
161
|
+
def _request(self, method: str, endpoint: str, **kwargs: Any) -> Any:
|
|
162
|
+
self._assert_api_config()
|
|
163
|
+
self._assert_requests()
|
|
164
|
+
|
|
165
|
+
url = f"{self._api_url}{endpoint}"
|
|
166
|
+
headers = {"Authorization": f"Bearer {self._authenticate()}", "X-Client-Type": "sdk"}
|
|
167
|
+
headers.update(kwargs.pop("headers", {}))
|
|
168
|
+
|
|
169
|
+
resp = _requests.request(method, url, headers=headers, timeout=30, **kwargs)
|
|
170
|
+
|
|
171
|
+
if resp.status_code == 498:
|
|
172
|
+
self._token = None
|
|
173
|
+
headers["Authorization"] = f"Bearer {self._authenticate()}"
|
|
174
|
+
resp = _requests.request(method, url, headers=headers, timeout=30, **kwargs)
|
|
175
|
+
|
|
176
|
+
return resp
|
|
177
|
+
|
|
178
|
+
# ------------------------------------------------------------------
|
|
179
|
+
# Helpers
|
|
180
|
+
# ------------------------------------------------------------------
|
|
181
|
+
|
|
182
|
+
def _assert_api_config(self) -> None:
|
|
183
|
+
missing = [
|
|
184
|
+
name
|
|
185
|
+
for name, val in [
|
|
186
|
+
("api_url", self._api_url),
|
|
187
|
+
("workspace", self._workspace),
|
|
188
|
+
("login", self._login),
|
|
189
|
+
("keypass", self._keypass),
|
|
190
|
+
]
|
|
191
|
+
if not val
|
|
192
|
+
]
|
|
193
|
+
if missing:
|
|
194
|
+
raise MaestroConfigError(
|
|
195
|
+
f"Configuração incompleta — campos ausentes: {', '.join(missing)}. "
|
|
196
|
+
"Passe via variáveis de ambiente (MAESTRO_API_URL, MAESTRO_WORKSPACE, "
|
|
197
|
+
"MAESTRO_LOGIN, MAESTRO_KEYPASS) ou pelos argumentos do construtor."
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
def _assert_requests(self) -> None:
|
|
201
|
+
if not _HAS_REQUESTS:
|
|
202
|
+
raise MaestroConnectionError(
|
|
203
|
+
"O pacote 'requests' é necessário. "
|
|
204
|
+
"Instale com: pip install handsbot-maestro-sdk"
|
|
205
|
+
)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "handsbot-maestro-sdk"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "SDK Python para criação de tarefas no Maestro (4HandsBot)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license-files = ["LICENSE"]
|
|
11
|
+
requires-python = ">=3.9"
|
|
12
|
+
dependencies = [
|
|
13
|
+
"requests>=2.31.0",
|
|
14
|
+
]
|
|
15
|
+
keywords = ["maestro", "handsbot", "automation", "rpa", "sdk"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.9",
|
|
19
|
+
"Programming Language :: Python :: 3.10",
|
|
20
|
+
"Programming Language :: Python :: 3.11",
|
|
21
|
+
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"License :: Other/Proprietary License",
|
|
23
|
+
"Operating System :: OS Independent",
|
|
24
|
+
"Intended Audience :: Developers",
|
|
25
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/fourhandsbot/maestro"
|
|
30
|
+
"Bug Tracker" = "https://github.com/fourhandsbot/maestro/issues"
|
|
31
|
+
|
|
32
|
+
[tool.setuptools.packages.find]
|
|
33
|
+
where = ["."]
|
|
34
|
+
include = ["maestro*"]
|
|
35
|
+
exclude = ["example*", ".venv*"]
|