worker-automate-hub 0.4.426__tar.gz → 0.4.427__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/PKG-INFO +1 -1
  2. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/pyproject.toml +1 -1
  3. worker_automate_hub-0.4.427/worker_automate_hub/models/dto/rpa_processo_rdp_dto.py +15 -0
  4. worker_automate_hub-0.4.427/worker_automate_hub/tasks/jobs/conexao_rdp.py +208 -0
  5. worker_automate_hub-0.4.426/worker_automate_hub/tasks/jobs/conexao_rdp.py +0 -303
  6. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/README.md +0 -0
  7. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/__init__.py +0 -0
  8. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/__init__.py +0 -0
  9. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/ahead_service.py +0 -0
  10. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/client.py +0 -0
  11. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/helpers/__init__.py +0 -0
  12. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/helpers/api_helpers.py +0 -0
  13. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/api/rpa_historico_service.py +0 -0
  14. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/cli.py +0 -0
  15. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/config/__init__.py +0 -0
  16. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/config/settings.py +0 -0
  17. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/config.py +0 -0
  18. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/core/so_manipulation.py +0 -0
  19. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/__init__.py +0 -0
  20. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/deprecation.py +0 -0
  21. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/rate_limit.py +0 -0
  22. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/repeat.py +0 -0
  23. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/retry.py +0 -0
  24. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/singleton.py +0 -0
  25. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/decorators/timeit.py +0 -0
  26. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/__init__.py +0 -0
  27. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dao/__init__.py +0 -0
  28. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dao/rpa_configuracao.py +0 -0
  29. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dao/rpa_historico.py +0 -0
  30. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dao/rpa_processo.py +0 -0
  31. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dto/__init__.py +0 -0
  32. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dto/rpa_historico_request_dto.py +0 -0
  33. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dto/rpa_processo_entrada_dto.py +0 -0
  34. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/models/dto/rpa_sistema_dto.py +0 -0
  35. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/__init__.py +0 -0
  36. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/__init__.py +0 -0
  37. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/coleta_dje_process.py +0 -0
  38. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/descartes.py +0 -0
  39. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_estadual_go.py +0 -0
  40. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_estadual_main.py +0 -0
  41. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_estadual_mt.py +0 -0
  42. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_estadual_sc.py +0 -0
  43. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_estadual_sp.py +0 -0
  44. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/ecac_federal.py +0 -0
  45. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_15.py +0 -0
  46. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_16.py +0 -0
  47. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_207.py +0 -0
  48. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_32.py +0 -0
  49. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_33.py +0 -0
  50. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_34.py +0 -0
  51. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_36.py +0 -0
  52. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_39.py +0 -0
  53. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_500.py +0 -0
  54. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_505.py +0 -0
  55. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_7139.py +0 -0
  56. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/entrada_de_notas_9.py +0 -0
  57. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/exemplo_processo.py +0 -0
  58. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/fidc_gerar_nosso_numero.py +0 -0
  59. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/fidc_remessa_cobranca_cnab240.py +0 -0
  60. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/login_emsys.py +0 -0
  61. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/playground.py +0 -0
  62. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/sped_fiscal.py +0 -0
  63. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/jobs/transferencias.py +0 -0
  64. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/task_definitions.py +0 -0
  65. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/tasks/task_executor.py +0 -0
  66. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/__init__.py +0 -0
  67. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/env.py +0 -0
  68. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/get_creds_gworkspace.py +0 -0
  69. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/logger.py +0 -0
  70. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/toast.py +0 -0
  71. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/updater.py +0 -0
  72. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/util.py +0 -0
  73. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/utils/utils_nfe_entrada.py +0 -0
  74. {worker_automate_hub-0.4.426 → worker_automate_hub-0.4.427}/worker_automate_hub/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: worker-automate-hub
3
- Version: 0.4.426
3
+ Version: 0.4.427
4
4
  Summary: Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta.
5
5
  Author: Joel Paim
6
6
  Requires-Python: >=3.12,<4.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "worker-automate-hub"
3
- version = "0.4.426"
3
+ version = "0.4.427"
4
4
  description = "Worker Automate HUB é uma aplicação para automatizar rotinas de RPA nos ambientes Argenta."
5
5
  authors = ["Joel Paim"]
6
6
  readme = "README.md"
@@ -0,0 +1,15 @@
1
+ from typing import Dict, Optional
2
+ from pydantic import BaseModel
3
+
4
+ class ConfigEntrada(BaseModel):
5
+ ip: str
6
+ user: str
7
+ password: str
8
+ processo: str
9
+ uuid_robo: Optional[str]
10
+
11
+ def get(self, key, default=None):
12
+ return getattr(self, key, default)
13
+
14
+ class RpaProcessoRdpDTO(BaseModel):
15
+ configEntrada: ConfigEntrada
@@ -0,0 +1,208 @@
1
+ import asyncio
2
+ import platform
3
+ import subprocess
4
+ import socket
5
+ import pyautogui
6
+ import pygetwindow as gw
7
+ from rich.console import Console
8
+ import pygetwindow as gw
9
+ from pywinauto import Application
10
+ from worker_automate_hub.models.dto.rpa_historico_request_dto import RpaHistoricoStatusEnum, RpaRetornoProcessoDTO
11
+ from worker_automate_hub.models.dto.rpa_processo_rdp_dto import RpaProcessoRdpDTO
12
+ from worker_automate_hub.utils.logger import logger
13
+
14
+ console = Console()
15
+
16
+
17
+ class RDPConnection:
18
+ def __init__(self, task: RpaProcessoRdpDTO):
19
+ self.task = task
20
+ self.ip = task.configEntrada.get("ip")
21
+ self.user = task.configEntrada.get("user")
22
+ self.password = task.configEntrada.get("password")
23
+ self.processo = task.configEntrada.get("processo")
24
+ self.uuid_robo = task.configEntrada.get("uuid_robo")
25
+
26
+ async def verificar_conexao(self) -> bool:
27
+ sistema_operacional = platform.system().lower()
28
+ logger.info(f"Sistema operacional detectado: {sistema_operacional}")
29
+ if sistema_operacional == "windows":
30
+ comando_ping = ["ping", "-n", "1", "-w", "1000", self.ip]
31
+ else:
32
+ comando_ping = ["ping", "-c", "1", "-W", "1", self.ip]
33
+ logger.info(f"Executando comando de ping: {' '.join(comando_ping)}")
34
+ try:
35
+ resposta_ping = subprocess.run(comando_ping, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
36
+ ping_alcancado = resposta_ping.returncode == 0
37
+ logger.info(f"Ping {'sucesso' if ping_alcancado else 'falhou'}")
38
+ except Exception as e:
39
+ logger.error(f"Erro ao executar ping: {e}")
40
+ ping_alcancado = False
41
+
42
+ porta_aberta = False
43
+ try:
44
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
45
+ sock.settimeout(5)
46
+ logger.info(f"Verificando porta 3389 em {self.ip}")
47
+ resposta_porta = sock.connect_ex((self.ip, 3389))
48
+ porta_aberta = resposta_porta == 0
49
+ logger.info(f"Porta 3389 {'aberta' if porta_aberta else 'fechada'}")
50
+ except Exception as e:
51
+ logger.error(f"Erro ao verificar a porta RDP: {e}")
52
+ porta_aberta = False
53
+
54
+ return ping_alcancado and porta_aberta
55
+
56
+ async def clicar_no_titulo(self):
57
+ """
58
+ Função para clicar no título das janelas de Conexão de Área de Trabalho Remota
59
+ com o botão direito do mouse e executar comandos.
60
+ """
61
+ janelas_rdp = [
62
+ win
63
+ for win in gw.getAllTitles()
64
+ if "Conexão de Área de Trabalho Remota" in win
65
+ or "Remote Desktop Connection" in win
66
+ ]
67
+
68
+ for titulo in janelas_rdp:
69
+ janela = gw.getWindowsWithTitle(titulo)[0]
70
+ if not janela:
71
+ print(f"Erro ao localizar a janela: {titulo}")
72
+ continue
73
+
74
+ print(f"Processando janela: {titulo}")
75
+
76
+ # Obtém as coordenadas da janela
77
+ x, y = janela.left, janela.top
78
+
79
+ try:
80
+ # Move o mouse para o título da janela e clica com o botão direito
81
+ pyautogui.moveTo(x + 10, y + 10) # Ajuste para alinhar ao título da janela
82
+ pyautogui.click(button="right")
83
+
84
+ await asyncio.sleep(2)
85
+ pyautogui.press("down", presses=7, interval=0.1)
86
+ await asyncio.sleep(2)
87
+ pyautogui.hotkey("enter")
88
+ await asyncio.sleep(2)
89
+ pyautogui.hotkey("enter")
90
+
91
+ except Exception as e:
92
+ print(f"Erro ao interagir com a janela {titulo}: {e}")
93
+
94
+ async def conectar(self):
95
+ logger.info(f"Iniciando cliente RDP para {self.ip}")
96
+ try:
97
+ pyautogui.hotkey("win", "d")
98
+ await asyncio.sleep(2) # Tempo para garantir que todas as janelas sejam minimizadas
99
+ logger.info("Todas as janelas minimizadas com sucesso.")
100
+
101
+ subprocess.Popen(["mstsc", f"/v:{self.ip}"], close_fds=True, start_new_session=True)
102
+ await asyncio.sleep(7) # Tempo aumentado para garantir abertura
103
+
104
+ logger.info("Procurando janela 'Conexão de Área de Trabalho Remota'")
105
+ windows = gw.getWindowsWithTitle("Conexão de Área de Trabalho Remota")
106
+ if not windows:
107
+ logger.warning("Tentando encontrar janela com título em inglês 'Remote Desktop Connection'")
108
+ windows = gw.getWindowsWithTitle("Remote Desktop Connection")
109
+
110
+ if not windows:
111
+ logger.error("Janela de RDP não encontrada.")
112
+ return False
113
+
114
+ rdp_window = windows[0]
115
+ logger.info(f"Janela '{rdp_window.title}' encontrada. Focando na janela.")
116
+
117
+ # Restaurar janela se estiver minimizada
118
+ if rdp_window.isMinimized:
119
+ rdp_window.restore()
120
+ await asyncio.sleep(2)
121
+
122
+ # Redimensionar para 50% da tela
123
+ screen_width, screen_height = pyautogui.size()
124
+ new_width = screen_width // 2
125
+ new_height = screen_height // 2
126
+ rdp_window.resizeTo(new_width, new_height)
127
+ rdp_window.moveTo(screen_width // 4, screen_height // 4)
128
+ logger.info(f"Janela redimensionada para {new_width}x{new_height}.")
129
+
130
+ rdp_window.activate()
131
+ await asyncio.sleep(2) # Tempo extra para garantir que a janela está ativa
132
+
133
+ # Clique para garantir o foco
134
+ pyautogui.click(rdp_window.left + 50, rdp_window.top + 50)
135
+ await asyncio.sleep(1)
136
+
137
+ # Inserir credenciais
138
+
139
+ try:
140
+ app = Application(backend="uia").connect(title="Segurança do Windows")
141
+ dialog = app.window(title="Segurança do Windows")
142
+
143
+ edit_field = dialog.child_window(auto_id="EditField_1", control_type="Edit")
144
+
145
+ if edit_field.exists():
146
+ logger.info("Inserindo usuário.")
147
+ pyautogui.write(self.user, interval=0.1)
148
+ pyautogui.press("tab")
149
+ await asyncio.sleep(5)
150
+ except:
151
+ pass
152
+
153
+ logger.info("Inserindo senha.")
154
+ pyautogui.write(self.password, interval=0.1)
155
+ pyautogui.press("enter")
156
+ await asyncio.sleep(1)
157
+ pyautogui.press("left")
158
+ await asyncio.sleep(1)
159
+ pyautogui.press("enter")
160
+ logger.info("Credenciais inseridas.")
161
+ await asyncio.sleep(5) # Tempo para conexão ser concluída
162
+
163
+ logger.info("Conexão RDP ativa. Mantendo o script em execução.")
164
+ return True
165
+ except Exception as e:
166
+ logger.error(f"Erro ao tentar conectar via RDP: {e}")
167
+ return False
168
+
169
+ async def conexao_rdp(task: RpaProcessoRdpDTO) -> RpaRetornoProcessoDTO:
170
+ try:
171
+ logger.info("Iniciando processo de conexão RDP.")
172
+ rdp = RDPConnection(task)
173
+ conectado = await rdp.verificar_conexao()
174
+ if not conectado:
175
+ logger.warning("Não foi possível estabelecer conexão RDP. Verifique o IP e a disponibilidade da porta.")
176
+ return RpaRetornoProcessoDTO(
177
+ sucesso=False,
178
+ retorno="Não foi possível estabelecer conexão RDP. Verifique o IP e a disponibilidade da porta.",
179
+ status=RpaHistoricoStatusEnum.Falha,
180
+ )
181
+ sucesso_conexao = await rdp.conectar()
182
+ if sucesso_conexao:
183
+ logger.info("Processo de conexão RDP executado com sucesso.")
184
+
185
+ await rdp.clicar_no_titulo()
186
+
187
+ # Mantém o script ativo para manter a conexão RDP aberta
188
+ return RpaRetornoProcessoDTO(
189
+ sucesso=True,
190
+ retorno="Conexão RDP estabelecida com sucesso.",
191
+ status=RpaHistoricoStatusEnum.Sucesso,
192
+ )
193
+ else:
194
+ logger.error("Falha ao tentar conectar via RDP.")
195
+ return RpaRetornoProcessoDTO(
196
+ sucesso=False,
197
+ retorno="Falha ao tentar conectar via RDP.",
198
+ status=RpaHistoricoStatusEnum.Falha,
199
+ )
200
+ except Exception as ex:
201
+ err_msg = f"Erro ao executar conexao_rdp: {ex}"
202
+ logger.error(err_msg)
203
+ console.print(err_msg, style="bold red")
204
+ return RpaRetornoProcessoDTO(
205
+ sucesso=False,
206
+ retorno=err_msg,
207
+ status=RpaHistoricoStatusEnum.Falha,
208
+ )
@@ -1,303 +0,0 @@
1
- import asyncio
2
- import os
3
- import subprocess
4
- import time
5
-
6
- import pyautogui
7
- import pygetwindow._pygetwindow_win as gw
8
- from worker_automate_hub.models.dto.rpa_historico_request_dto import RpaHistoricoStatusEnum, RpaRetornoProcessoDTO
9
- from worker_automate_hub.models.dto.rpa_processo_entrada_dto import RpaProcessoEntradaDTO
10
- from pygetwindow._pygetwindow_win import Win32Window
11
- from rich.console import Console
12
-
13
- from worker_automate_hub.utils.logger import logger
14
-
15
- console = Console()
16
-
17
-
18
- def tirar_screenshot(nome_etapa: str):
19
- """
20
- Tira um screenshot da tela atual e salva em um arquivo com o nome
21
- especificado e a data/hora atual.
22
-
23
- :param nome_etapa: nome da etapa que est sendo executada
24
- :type nome_etapa: str
25
- :return: caminho do arquivo de screenshot gerado
26
- :rtype: str
27
- """
28
- if nome_etapa is None:
29
- raise ValueError("Nome da etapa não pode ser nulo")
30
-
31
- caminho_screenshot = f"{nome_etapa}_{int(time.time())}.png"
32
- try:
33
- pyautogui.screenshot(caminho_screenshot)
34
- console.print(f"Screenshot tirada: {caminho_screenshot}")
35
- return caminho_screenshot
36
-
37
- except Exception as e:
38
- console.print(f"Erro ao tirar screenshot: {e}")
39
- return None
40
-
41
-
42
- def deletar_screenshots(caminhos_screenshots: str):
43
- """
44
- Recebe uma lista de caminhos de arquivos de screenshots e deleta cada um deles.
45
-
46
- :param caminhos_screenshots: lista de caminhos de arquivos de screenshots
47
- :type caminhos_screenshots: list[str]
48
- """
49
- if caminhos_screenshots is None:
50
- raise ValueError("Lista de caminhos de screenshots não pode ser nula")
51
-
52
- for caminho in caminhos_screenshots:
53
- if caminho is None:
54
- raise ValueError("Caminho de screenshot não pode ser nulo")
55
-
56
- try:
57
- os.remove(caminho)
58
- console.print(f"Screenshot deletada: {caminho}")
59
- except OSError as e:
60
- console.print(f"Erro ao deletar screenshot {caminho}: {e}")
61
-
62
-
63
- def fechar_janelas_rdp_sem_ip():
64
- """
65
- Fecha as janelas de conex o RDP sem IP.
66
-
67
- Caso não tenha nenhuma conexão RDP aberta, não fará nada.
68
- """
69
- janelas_rdp = [
70
- win
71
- for win in gw.getAllTitles()
72
- if "Conexão de Área de Trabalho Remota" in win
73
- or "Remote Desktop Connection" in win
74
- ]
75
- for titulo in janelas_rdp:
76
- if not any(char.isdigit() for char in titulo):
77
- console.print(f"Fechando pop-up de conexão sem IP: {titulo}")
78
- janela: Win32Window = gw.getWindowsWithTitle(titulo)[0]
79
- if janela is None:
80
- raise RuntimeError(f"Janela {titulo} não existe")
81
- try:
82
- janela.close()
83
- except Exception as e:
84
- logger.error(f"Erro ao fechar janela {titulo}: {e}")
85
- time.sleep(2)
86
-
87
-
88
- def fechar_janela_existente(ip: str):
89
- """
90
- Fecha a janela existente com o IP informado.
91
-
92
- Args:
93
- ip (str): IP da janela a ser fechada.
94
-
95
- Raises:
96
- Exception: Erro ao tentar fechar a janela.
97
- """
98
- try:
99
- janelas_encontradas = gw.getAllTitles()
100
- for titulo in janelas_encontradas:
101
- if ip in titulo:
102
- janela: Win32Window = gw.getWindowsWithTitle(titulo)[0]
103
- if janela is None:
104
- raise RuntimeError(f"Janela {titulo} não existe")
105
- console.print(f"Fechando janela existente: {titulo}")
106
- janela.activate()
107
- pyautogui.hotkey("alt", "f4")
108
- time.sleep(1)
109
- break
110
- else:
111
- console.print(f"Nenhuma janela encontrada com o IP: {ip}")
112
-
113
- fechar_janelas_rdp_sem_ip()
114
-
115
- except Exception as e:
116
- console.print(f"Erro ao tentar fechar a janela: {e}", style="bold red")
117
-
118
-
119
- def restaurar_janelas_rdp():
120
- """
121
- Função para restaurar todas as janelas de Conexão de área de Trabalho Remota
122
- que estão minimizadas e mover elas para uma posicão na tela.
123
- """
124
- janelas_rdp = [
125
- win
126
- for win in gw.getAllTitles()
127
- if "Conexão de Área de Trabalho Remota" in win
128
- or "Remote Desktop Connection" in win
129
- ]
130
-
131
- offset_x = 0
132
- offset_y = 0
133
- step_x = 30
134
- step_y = 30
135
-
136
- for titulo in janelas_rdp:
137
- janela: Win32Window = gw.getWindowsWithTitle(titulo)[0]
138
- if janela is None:
139
- console.print(
140
- f"Erro ao restaurar janela {titulo}: janela não existe",
141
- style="bold red",
142
- )
143
- continue
144
-
145
- console.print(f"Processando janela: {titulo}")
146
- if janela.isMinimized:
147
- try:
148
- janela.restore()
149
- except Exception as e:
150
- console.print(
151
- f"Erro ao restaurar janela {titulo}: {e}", style="bold red"
152
- )
153
- else:
154
- console.print(f"Janela restaurada: {titulo}")
155
- else:
156
- console.print(f"Janela já está aberta: {titulo}")
157
-
158
- try:
159
- janela.moveTo(offset_x, offset_y)
160
- except Exception as e:
161
- console.print(f"Erro ao mover janela {titulo}: {e}", style="bold red")
162
- else:
163
- offset_x += step_x
164
- offset_y += step_y
165
-
166
- try:
167
- janela.activate()
168
- except Exception as e:
169
- console.print(f"Erro ao ativar janela {titulo}: {e}", style="bold red")
170
- time.sleep(2)
171
-
172
-
173
- def redimensionar_janela_rdp(largura: int, altura: int):
174
- """
175
- Redimensiona a janela da Conexão de Área de Trabalho Remota.
176
-
177
- :param largura: Largura da janela em pixels
178
- :type largura: int
179
- :param altura: Altura da janela em pixels
180
- :type altura: int
181
- """
182
- janelas_rdp = [
183
- win
184
- for win in gw.getAllTitles()
185
- if "Conexão de Área de Trabalho Remota" in win
186
- or "Remote Desktop Connection" in win
187
- ]
188
-
189
- if janelas_rdp:
190
- try:
191
- janela_rdp: Win32Window = gw.getWindowsWithTitle(janelas_rdp[0])[0]
192
- if janela_rdp is None:
193
- raise RuntimeError("Janela RDP não existe")
194
- janela_rdp.resizeTo(largura, altura)
195
- janela_rdp.moveTo(20, 20)
196
- console.print(f"Janela redimensionada para {largura}x{altura}.")
197
- janela_rdp.activate()
198
- janela_rdp.restore()
199
- time.sleep(1)
200
- except Exception as e:
201
- console.print(f"Erro ao redimensionar janela RDP: {e}", style="bold red")
202
- else:
203
- console.print("Não foi possível encontrar a janela RDP para redimensionar.")
204
-
205
-
206
- async def conexao_rdp(task: RpaProcessoEntradaDTO) -> RpaRetornoProcessoDTO:
207
-
208
- caminhos_screenshots = []
209
- try:
210
- if not task or not task.configEntrada:
211
- raise ValueError("Task inválida ou sem configurações de entrada.")
212
-
213
- ip = task.configEntrada.get("ip", "")
214
- user = task.configEntrada.get("user", "")
215
- password = task.configEntrada.get("password", "")
216
-
217
- if not ip or not user or not password:
218
- raise ValueError(
219
- "Configurações de entrada inválidas. Verifique se o IP, Usuário e Senha estão preenchidos."
220
- )
221
-
222
- pyautogui.hotkey("win", "d")
223
- console.print("1 - Minimizando todas as telas...")
224
- await asyncio.sleep(2)
225
-
226
- fechar_janela_existente(ip)
227
-
228
- subprocess.Popen("mstsc")
229
- console.print("2 - Abrindo conexão de trabalho remota...")
230
- await asyncio.sleep(2)
231
-
232
- redimensionar_janela_rdp(500, 500)
233
-
234
- await asyncio.sleep(2)
235
-
236
- janelas_rdp = [
237
- win
238
- for win in gw.getAllTitles()
239
- if "Conexão de Área de Trabalho Remota" in win
240
- or "Remote Desktop Connection" in win
241
- ]
242
- if not janelas_rdp:
243
- raise RuntimeError("Nenhuma janela RDP foi encontrada.")
244
-
245
- janela_rdp: Win32Window = gw.getWindowsWithTitle(janelas_rdp[0])[0]
246
- if janela_rdp is None:
247
- raise RuntimeError("Janela RDP não existe.")
248
-
249
- janela_rdp.activate()
250
- janela_rdp.restore()
251
- await asyncio.sleep(1)
252
-
253
- caminhos_screenshots.append(tirar_screenshot("antes_de_inserir_ip"))
254
- console.print("3 - Inserindo o IP...")
255
- pyautogui.write(ip)
256
- await asyncio.sleep(10)
257
- caminhos_screenshots.append(tirar_screenshot("depois_de_inserir_ip"))
258
- pyautogui.press("enter")
259
- await asyncio.sleep(5)
260
- caminhos_screenshots.append(tirar_screenshot("depois_de_inserir_usuario"))
261
- await asyncio.sleep(5)
262
-
263
- console.print("5 - Inserindo a Senha...")
264
- pyautogui.write(password)
265
- pyautogui.press("enter")
266
- await asyncio.sleep(10)
267
- caminhos_screenshots.append(tirar_screenshot("depois_de_inserir_senha"))
268
-
269
- console.print("6 - Apertando left...")
270
- pyautogui.press("left")
271
- await asyncio.sleep(2)
272
- console.print("7 - Apertando Enter...")
273
- pyautogui.press("enter")
274
- await asyncio.sleep(20)
275
- caminhos_screenshots.append(tirar_screenshot("depois_do_certificado"))
276
-
277
- console.print("8 - Minimizando todas as telas no final...")
278
- pyautogui.hotkey("win", "d")
279
- await asyncio.sleep(2)
280
- caminhos_screenshots.append(tirar_screenshot("depois_de_minimizar_todas"))
281
-
282
- restaurar_janelas_rdp()
283
- caminhos_screenshots.append(tirar_screenshot("depois_de_restaurar_janelas"))
284
-
285
- deletar_screenshots(caminhos_screenshots)
286
-
287
- return RpaRetornoProcessoDTO(
288
- sucesso=True,
289
- retorno="Processo de conexão ao RDP executado com sucesso.",
290
- status=RpaHistoricoStatusEnum.Sucesso,
291
- )
292
-
293
- except Exception as ex:
294
- err_msg = f"Erro ao executar conexao_rdp: {ex}"
295
- logger.error(err_msg)
296
- console.print(err_msg, style="bold red")
297
- caminhos_screenshots.append(tirar_screenshot("erro"))
298
- deletar_screenshots(caminhos_screenshots)
299
- return RpaRetornoProcessoDTO(
300
- sucesso=False,
301
- retorno=err_msg,
302
- status=RpaHistoricoStatusEnum.Falha,
303
- )