worker-automate-hub 0.4.426__py3-none-any.whl → 0.4.428__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -1,301 +1,207 @@
1
1
  import asyncio
2
- import os
2
+ import platform
3
3
  import subprocess
4
- import time
5
-
4
+ import socket
6
5
  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
6
+ import pygetwindow as gw
11
7
  from rich.console import Console
12
-
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
13
12
  from worker_automate_hub.utils.logger import logger
13
+ from worker_automate_hub.utils.util import worker_sleep
14
14
 
15
15
  console = Console()
16
16
 
17
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}")
18
+ class RDPConnection:
19
+ def __init__(self, task: RpaProcessoRdpDTO):
20
+ self.task = task
21
+ self.ip = task.configEntrada.get("ip")
22
+ self.user = task.configEntrada.get("user")
23
+ self.password = task.configEntrada.get("password")
24
+ self.processo = task.configEntrada.get("processo")
25
+ self.uuid_robo = task.configEntrada.get("uuid_robo")
26
+
27
+ async def verificar_conexao(self) -> bool:
28
+ sistema_operacional = platform.system().lower()
29
+ logger.info(f"Sistema operacional detectado: {sistema_operacional}")
30
+ if sistema_operacional == "windows":
31
+ comando_ping = ["ping", "-n", "1", "-w", "1000", self.ip]
155
32
  else:
156
- console.print(f"Janela está aberta: {titulo}")
157
-
33
+ comando_ping = ["ping", "-c", "1", "-W", "1", self.ip]
34
+ logger.info(f"Executando comando de ping: {' '.join(comando_ping)}")
158
35
  try:
159
- janela.moveTo(offset_x, offset_y)
36
+ resposta_ping = subprocess.run(comando_ping, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
37
+ ping_alcancado = resposta_ping.returncode == 0
38
+ logger.info(f"Ping {'sucesso' if ping_alcancado else 'falhou'}")
160
39
  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
-
40
+ logger.error(f"Erro ao executar ping: {e}")
41
+ ping_alcancado = False
42
+
43
+ porta_aberta = False
166
44
  try:
167
- janela.activate()
45
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
46
+ sock.settimeout(10)
47
+ logger.info(f"Verificando porta 3389 em {self.ip}")
48
+ resposta_porta = sock.connect_ex((self.ip, 3389))
49
+ porta_aberta = resposta_porta == 0
50
+ logger.info(f"Porta 3389 {'aberta' if porta_aberta else 'fechada'}")
168
51
  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
-
52
+ logger.error(f"Erro ao verificar a porta RDP: {e}")
53
+ porta_aberta = False
54
+
55
+ return ping_alcancado and porta_aberta
56
+
57
+ async def clicar_no_titulo(self):
58
+ """
59
+ Função para clicar no título das janelas de Conexão de Área de Trabalho Remota
60
+ com o botão direito do mouse e executar comandos.
61
+ """
236
62
  janelas_rdp = [
237
63
  win
238
64
  for win in gw.getAllTitles()
239
65
  if "Conexão de Área de Trabalho Remota" in win
240
66
  or "Remote Desktop Connection" in win
241
67
  ]
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
68
 
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"))
69
+ for titulo in janelas_rdp:
70
+ janela = gw.getWindowsWithTitle(titulo)[0]
71
+ if not janela:
72
+ print(f"Erro ao localizar a janela: {titulo}")
73
+ continue
268
74
 
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"))
75
+ print(f"Processando janela: {titulo}")
276
76
 
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"))
77
+ # Obtém as coordenadas da janela
78
+ x, y = janela.left, janela.top
281
79
 
282
- restaurar_janelas_rdp()
283
- caminhos_screenshots.append(tirar_screenshot("depois_de_restaurar_janelas"))
284
-
285
- deletar_screenshots(caminhos_screenshots)
80
+ try:
81
+ # Move o mouse para o título da janela e clica com o botão direito
82
+ pyautogui.moveTo(x + 10, y + 10) # Ajuste para alinhar ao título da janela
83
+ pyautogui.click(button="right")
84
+
85
+ await worker_sleep(5)
86
+ pyautogui.press("down", presses=7, interval=0.1)
87
+ await worker_sleep(5)
88
+ pyautogui.hotkey("enter")
89
+ await worker_sleep(5)
90
+ pyautogui.hotkey("enter")
286
91
 
287
- return RpaRetornoProcessoDTO(
288
- sucesso=True,
289
- retorno="Processo de conexão ao RDP executado com sucesso.",
290
- status=RpaHistoricoStatusEnum.Sucesso,
291
- )
92
+ except Exception as e:
93
+ print(f"Erro ao interagir com a janela {titulo}: {e}")
94
+
95
+ async def conectar(self):
96
+ logger.info(f"Iniciando cliente RDP para {self.ip}")
97
+ try:
98
+ pyautogui.hotkey("win", "d")
99
+ await worker_sleep(5) # Tempo para garantir que todas as janelas sejam minimizadas
100
+ logger.info("Todas as janelas minimizadas com sucesso.")
101
+
102
+ subprocess.Popen(["mstsc", f"/v:{self.ip}"], close_fds=True, start_new_session=True)
103
+ await worker_sleep(10) # Tempo aumentado para garantir abertura
104
+
105
+ logger.info("Procurando janela 'Conexão de Área de Trabalho Remota'")
106
+ windows = gw.getWindowsWithTitle("Conexão de Área de Trabalho Remota")
107
+ if not windows:
108
+ logger.warning("Tentando encontrar janela com título em inglês 'Remote Desktop Connection'")
109
+ windows = gw.getWindowsWithTitle("Remote Desktop Connection")
110
+
111
+ if not windows:
112
+ logger.error("Janela de RDP não encontrada.")
113
+ return False
114
+
115
+ rdp_window = windows[0]
116
+ logger.info(f"Janela '{rdp_window.title}' encontrada. Focando na janela.")
117
+
118
+ # Restaurar janela se estiver minimizada
119
+ if rdp_window.isMinimized:
120
+ rdp_window.restore()
121
+ await worker_sleep(5)
122
+
123
+ # Redimensionar para 50% da tela
124
+ screen_width, screen_height = pyautogui.size()
125
+ new_width = screen_width // 2
126
+ new_height = screen_height // 2
127
+ rdp_window.resizeTo(new_width, new_height)
128
+ rdp_window.moveTo(screen_width // 4, screen_height // 4)
129
+ logger.info(f"Janela redimensionada para {new_width}x{new_height}.")
130
+
131
+ rdp_window.activate()
132
+ await worker_sleep(5) # Tempo extra para garantir que a janela está ativa
133
+
134
+ # Clique para garantir o foco
135
+ pyautogui.click(rdp_window.left + 50, rdp_window.top + 50)
136
+ await worker_sleep(3)
137
+
138
+ # Inserir credenciais
139
+
140
+ try:
141
+ app = Application(backend="uia").connect(title="Segurança do Windows")
142
+ dialog = app.window(title="Segurança do Windows")
143
+
144
+ edit_field = dialog.child_window(auto_id="EditField_1", control_type="Edit")
145
+
146
+ if edit_field.exists():
147
+ logger.info("Inserindo usuário.")
148
+ pyautogui.write(self.user, interval=0.1)
149
+ pyautogui.press("tab")
150
+ await worker_sleep(5)
151
+ except:
152
+ pass
153
+
154
+ logger.info("Inserindo senha.")
155
+ pyautogui.write(self.password, interval=0.1)
156
+ pyautogui.press("enter")
157
+ await worker_sleep(5)
158
+ pyautogui.press("left")
159
+ await worker_sleep(5)
160
+ pyautogui.press("enter")
161
+ logger.info("Credenciais inseridas.")
162
+ await worker_sleep(5) # Tempo para conexão ser concluída
163
+
164
+ logger.info("Conexão RDP ativa. Mantendo o script em execução.")
165
+ return True
166
+ except Exception as e:
167
+ logger.error(f"Erro ao tentar conectar via RDP: {e}")
168
+ return False
292
169
 
170
+ async def conexao_rdp(task: RpaProcessoRdpDTO) -> RpaRetornoProcessoDTO:
171
+ try:
172
+ logger.info("Iniciando processo de conexão RDP.")
173
+ rdp = RDPConnection(task)
174
+ conectado = await rdp.verificar_conexao()
175
+ if not conectado:
176
+ logger.warning("Não foi possível estabelecer conexão RDP. Verifique o IP e a disponibilidade da porta.")
177
+ return RpaRetornoProcessoDTO(
178
+ sucesso=False,
179
+ retorno="Não foi possível estabelecer conexão RDP. Verifique o IP e a disponibilidade da porta.",
180
+ status=RpaHistoricoStatusEnum.Falha,
181
+ )
182
+ sucesso_conexao = await rdp.conectar()
183
+ if sucesso_conexao:
184
+ logger.info("Processo de conexão RDP executado com sucesso.")
185
+
186
+ await rdp.clicar_no_titulo()
187
+
188
+ # Mantém o script ativo para manter a conexão RDP aberta
189
+ return RpaRetornoProcessoDTO(
190
+ sucesso=True,
191
+ retorno="Conexão RDP estabelecida com sucesso.",
192
+ status=RpaHistoricoStatusEnum.Sucesso,
193
+ )
194
+ else:
195
+ logger.error("Falha ao tentar conectar via RDP.")
196
+ return RpaRetornoProcessoDTO(
197
+ sucesso=False,
198
+ retorno="Falha ao tentar conectar via RDP.",
199
+ status=RpaHistoricoStatusEnum.Falha,
200
+ )
293
201
  except Exception as ex:
294
202
  err_msg = f"Erro ao executar conexao_rdp: {ex}"
295
203
  logger.error(err_msg)
296
204
  console.print(err_msg, style="bold red")
297
- caminhos_screenshots.append(tirar_screenshot("erro"))
298
- deletar_screenshots(caminhos_screenshots)
299
205
  return RpaRetornoProcessoDTO(
300
206
  sucesso=False,
301
207
  retorno=err_msg,
@@ -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.428
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
@@ -25,11 +25,12 @@ worker_automate_hub/models/dao/rpa_processo.py,sha256=AfOUhJKL-AAOyjON4g7f6B7Bxa
25
25
  worker_automate_hub/models/dto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  worker_automate_hub/models/dto/rpa_historico_request_dto.py,sha256=tFTAfNUwHp9fuZQq4JTpyrOHFhm0PfVz3BrSyFxKwXQ,1371
27
27
  worker_automate_hub/models/dto/rpa_processo_entrada_dto.py,sha256=NP2SNJ4Eq4xPQgwdw1CSwErB_g1RmBQR7pdQnOZipAE,678
28
+ worker_automate_hub/models/dto/rpa_processo_rdp_dto.py,sha256=2TKA9CzFGj_9tWXfN84gVzHWZtAMN22QrNMcmNGHZD8,356
28
29
  worker_automate_hub/models/dto/rpa_sistema_dto.py,sha256=sLkmJei8x6sl-1-IXUKDmYQuKx0sotYQREPyhQqPmRg,161
29
30
  worker_automate_hub/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
31
  worker_automate_hub/tasks/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
32
  worker_automate_hub/tasks/jobs/coleta_dje_process.py,sha256=rf4fW-FaHUl1MS7b03z4cwI3zHfNw8FWxvjvNY3Xn20,28773
32
- worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=0-oLMupu6zucZ9kVshLjG94i0W9v4pbcgYHvI6uipGc,10376
33
+ worker_automate_hub/tasks/jobs/conexao_rdp.py,sha256=NXmLcdeeXPo4CGP_PZ0bN_TDLppQN8v-TlI-xeHlNy0,8989
33
34
  worker_automate_hub/tasks/jobs/descartes.py,sha256=RIjrZIzkW77NiKeXbxFN9k872cz3fl9cG1m5TJpjmmY,40134
34
35
  worker_automate_hub/tasks/jobs/ecac_estadual_go.py,sha256=aPckQRlRozFS_OK3C9wNdMCmqO6AM4djwqY2uSSaPmo,20687
35
36
  worker_automate_hub/tasks/jobs/ecac_estadual_main.py,sha256=FFpAdtZLO4uelWZooCVpm4JePv_iDt5nwVKrk1ipZJQ,1599
@@ -67,7 +68,7 @@ worker_automate_hub/utils/updater.py,sha256=en2FCGhI8aZ-JNP3LQm64NJDc4awCNW7UhbV
67
68
  worker_automate_hub/utils/util.py,sha256=JpRM3ltfGNkzui0RAjUK1FhWT3aWUjt3ljEyQez3Sbw,120156
68
69
  worker_automate_hub/utils/utils_nfe_entrada.py,sha256=7ju688sD52y30taGSm5rPMGdQyByUUwveLeKV4ImEiE,28401
69
70
  worker_automate_hub/worker.py,sha256=KDBU3L2kVobndrnN5coRZFTwVmBLKmPJjRv20sCo5Hc,4697
70
- worker_automate_hub-0.4.426.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
71
- worker_automate_hub-0.4.426.dist-info/METADATA,sha256=F1pEFiv7lyjlK5XAO0rgAjYnqX4g6tDuPoeWalvStS8,2895
72
- worker_automate_hub-0.4.426.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
73
- worker_automate_hub-0.4.426.dist-info/RECORD,,
71
+ worker_automate_hub-0.4.428.dist-info/entry_points.txt,sha256=sddyhjx57I08RY8X7UxcTpdoOsWULAWNKN9Xr6pp_Kw,54
72
+ worker_automate_hub-0.4.428.dist-info/METADATA,sha256=45g5L__zfjgGifUrxsyIAxOibd--GDLTAHDD6o-_bIk,2895
73
+ worker_automate_hub-0.4.428.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
74
+ worker_automate_hub-0.4.428.dist-info/RECORD,,