1282 lines
37 KiB
Python
1282 lines
37 KiB
Python
# import datetime
|
|
import json
|
|
import urllib
|
|
import os
|
|
from typing import List
|
|
|
|
import requests
|
|
|
|
class Wingui:
|
|
"""
|
|
Classe que representa um proxy para um robo remoto.
|
|
mapeia o robo através da propriedade rid
|
|
ep significa endpoint, e aponta para o endereco na web on se hostea o serviço
|
|
Por padrão é: https://localhost:8443
|
|
"""
|
|
|
|
ep: str = ""
|
|
|
|
def __init__(self):
|
|
self.ep = "https://localhost:8443"
|
|
|
|
def __requestget__(self, data: str):
|
|
|
|
"""
|
|
Metodo que realiza requisições HTTP do tipo GET.
|
|
"""
|
|
|
|
url = self.ep + data
|
|
print("Calling: " + url)
|
|
|
|
apikey = os.environ.get('REPLAY_APIKEY')
|
|
headers = {"X-API-KEY": apikey}
|
|
res = requests.get(url, headers=headers, verify=False)
|
|
|
|
if res.status_code >= 400:
|
|
raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}")
|
|
if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1:
|
|
return json.loads(res.text)
|
|
else:
|
|
return res.text
|
|
|
|
def __requestpost__(self, data: str, object: dict):
|
|
|
|
"""
|
|
Metodo que realiza requisições HTTP do tipo POST.
|
|
"""
|
|
|
|
url = self.ep + data
|
|
print("Calling: " + url)
|
|
|
|
apikey = os.environ.get('REPLAY_APIKEY')
|
|
headers = {"X-API-KEY": apikey}
|
|
res = requests.post(url, json = object, headers = headers, verify = False)
|
|
|
|
if res.status_code >= 400:
|
|
raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}")
|
|
if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1:
|
|
return json.loads(res.text)
|
|
else:
|
|
return res.text
|
|
|
|
# Funções Clip
|
|
def clip_read(self) -> str:
|
|
"""
|
|
## Clip Read
|
|
Le o conteudo da clipboard na maquina do robo, e retorna como string
|
|
|
|
---
|
|
#### Parâmetros:
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Conteúdo da ClipBoard.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/clip/read")
|
|
|
|
def clip_write(self, m: str) -> str:
|
|
"""
|
|
## Clip Write
|
|
Grava um texto na ClipBoard da máquina.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- m: Texto que se deseja inserir na ClipBoard
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
str = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f"/ipc/wingui/clip/write?str={str}")
|
|
|
|
# Funções Screen
|
|
def screen_click(self, img: str):
|
|
|
|
"""
|
|
## Screen Click
|
|
Realiza um click na tela, desde que encontre uma correspondência à imagem fornecida.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- img: Caminho absoluto para a imagem a ser clicada na tela.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
img = urllib.parse.quote(img, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/click?f={img}")
|
|
|
|
def screen_clickcenter(self, img: str):
|
|
|
|
"""
|
|
## Screen Click Center
|
|
Semelhante a screen_click, porém realiza o clique no centro da imagem localizada.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- img: Caminho absoluto para a imagem a ser clicada na tela.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
img = urllib.parse.quote(img, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/clickcenter?f={img}")
|
|
|
|
def screen_capture(self, f: str, x: int, y: int, w: int, h: int):
|
|
"""
|
|
## Screen Capture
|
|
Realiza uma captura de tela e salva a imagem no diretório que abriga o serviço do winGUI.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Nome do arquivo a ser salvo
|
|
- x: X da origem da imagem - coordenada mais à esquerda do retangulo
|
|
- y: Y da origem da imagem - coordenada mais acima do retangulo
|
|
- w: Comprimento da imagem
|
|
- h: altura da imagem.
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
|
|
---
|
|
#### Exemplo:
|
|
Para capturar um retangulo, do Pixel (10,10) ate o Pixel (110,100), utiliza-se:
|
|
|
|
screen_capture("c:\\arq.png",10,10,100,100)
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/capture?x={x}&y={y}&w={w}&h={h}&f={f}")
|
|
|
|
def screen_find(self, f: str):
|
|
|
|
"""
|
|
## Screen Find
|
|
Busca a imagem cujo caminho foi fornecido na tela.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Caminho absoluto da imagem que se deseja buscar.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/find?f={f}")
|
|
|
|
def screen_findall (self, f: str):
|
|
|
|
"""
|
|
## Screen Find All
|
|
Busca todas as ocorrências da imagem fornecida como parâmetro na tela.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Caminho absoluto da imagem que se deseja buscar.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array de todas as ocorrências da imagem na tela. As ocorrências são representadas por dicionários cujas chaves são o eixo da coordenada e o valor é o valor do mesmo.
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/findall?f={f}")
|
|
|
|
def screen_wait(self, f: str, m: int = 30):
|
|
|
|
"""
|
|
## Screen Wait
|
|
Procura pela imagem fornecida na tela por determinado tempo.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Caminho da imagem que se está buscando.
|
|
- m: Tempo máximo pelo qual se buscará a imagem na tela.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/wait?f={f}&m={m}")
|
|
|
|
def screen_waitclick(self, f: str, m: int = 30):
|
|
"""
|
|
## Screen WaitClick
|
|
Análogo a screen_wait, mas realiza click na coordenada x = 0, y = 0 da imagem.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Caminho da imagem que se está buscando.
|
|
- m: Tempo máximo pelo qual se buscará a imagem na tela.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/waitclick?f={f}&m={m}")
|
|
|
|
def screen_waitclickcenter(self, f: str, m: int = 30):
|
|
"""
|
|
## Screen WaitClick
|
|
Análogo a screen_waitclick, mas realiza click nas coordenadas centrais da imagem fornecida.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- f: Caminho da imagem que se está buscando.
|
|
- m: Tempo máximo pelo qual se buscará a imagem na tela.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as coordenadas iniciais da imagem localizada na tela, as dimensões de comprimento e altura, assim como o caminho fornecido ao parâmetro img.
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f"/ipc/wingui/screen/waitclickcenter?f={f}&m={m}")
|
|
|
|
def screen_scale(self):
|
|
"""
|
|
## Screen Scale
|
|
Busca nas configurações de vídeo do sistema a escala do monitor.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo a escala do monitor.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/screen/scale")
|
|
|
|
def screen_size(self):
|
|
|
|
"""
|
|
## Screen Scale
|
|
Busca nas configurações de vídeo do sistema o tamanho da tela do monitor.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array contendo as dimensões da tela.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/screen/size")
|
|
|
|
# def screen_res(self, d: int) -> List[int]:
|
|
|
|
# """
|
|
# Retorna a resolução da tela, em um array [x,y]
|
|
# """
|
|
# return self.__requestget__(f"/ipc/wingui/screen/res?d={d}")
|
|
|
|
# def screen_setres(self, x: int, y: int, c: int):
|
|
# """
|
|
# Set resolução e cor da tela [DESCONTINUADA. VER display_setres]
|
|
# """
|
|
# return self.__requestget__(f"/ipc/wingui/screen/setres?x={x}&y={y}&c={c}")
|
|
|
|
def screen_shot(self, fmt: str = "b64"):
|
|
|
|
"""
|
|
## Screen shot
|
|
Faz uma captura completa da tela.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- fmt: Formato de codificação da imagem capturada. Por padrão está codificada em Base64.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Captura da tela completa exibida no monitor codificada.
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/screen/shot?fmt={fmt}")
|
|
|
|
def screen_dsinternal(self):
|
|
"""
|
|
## Screen Display Internal
|
|
Faz com que o monitor definido como primário (através das configurações do windows) seja o único ativo.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/screen/dsinternal")
|
|
|
|
def screen_dsexternal(self):
|
|
"""
|
|
## Screen Display External
|
|
Faz com que o monitor definido como secundário (através das configurações do windows) seja o único ativo.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/screen/dsexternal")
|
|
|
|
def screen_dsclone(self):
|
|
"""
|
|
## Screen Display Clone
|
|
Faz com que o vídeo exibido no monitor definido como primário seja clonado para o secundário.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/screen/dsclone")
|
|
|
|
def screen_dsextend(self):
|
|
"""
|
|
## Screen Display Extend
|
|
Faz com que o vídeo de ambos os monitores seja independente.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/screen/dsextend")
|
|
|
|
# Funções Draw
|
|
def draw_addbox(self, x: int, y: int, w: int = 100, h: int = 100, t: int = 3):
|
|
"""
|
|
## Draw Box
|
|
Adiciona uma caixa à tela de overlay
|
|
|
|
---
|
|
#### Parâmetros:
|
|
-x: Ponto inicial do eixo x para o desenho.
|
|
-y: Ponto inicial do eixo y para o desenho.
|
|
-w: Largura da caixa a ser desenhada.
|
|
-h: Altura da caixa a ser desenhada.
|
|
-t: Largura do pincel que desenhará a caixa.
|
|
|
|
Todos os parâmetros devem ser dados em píxels.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/draw/addbox?x={x}&y={y}&w={w}&h={h}&t={t}")
|
|
|
|
def draw_addrect(self, x: int, y: int, w: int = 100, h: int = 100):
|
|
"""
|
|
## Draw Rectangle
|
|
Adiciona um retângulo opaco à tela de overlay
|
|
|
|
---
|
|
#### Parâmetros:
|
|
-x: Ponto inicial do eixo x para o desenho.
|
|
-y: Ponto inicial do eixo y para o desenho.
|
|
-w: Largura do retângulo a ser desenhado.
|
|
-h: Altura do retângulo a ser desenhado.
|
|
|
|
Todos os parâmetros devem ser dados em píxels.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/draw/addrect?x={x}&y={y}&w={w}&h={h}")
|
|
|
|
def draw_addtext(self, x: int, y: int, t: str = "No text set"):
|
|
"""
|
|
## Draw Text
|
|
Adiciona um texto à tela de overlay
|
|
|
|
---
|
|
#### Parâmetros:
|
|
-x: Ponto inicial do eixo x para a escrita.
|
|
-y: Ponto inicial do eixo y para a escrita.
|
|
-t: Texto a ser escrito.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
t = urllib.parse.quote(t, "")
|
|
return self.__requestget__(f"/ipc/wingui/draw/addtext?x={x}&y={y}&t={t}")
|
|
|
|
def draw_clear(self):
|
|
"""
|
|
## Draw Clear
|
|
Limpa tela de overlay
|
|
|
|
---
|
|
#### Parâmetros:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/draw/clear")
|
|
|
|
# def draw_show(self):
|
|
# """mostra tela de overlay"""
|
|
# return self.__requestget__("/ipc/wingui/draw/show")
|
|
|
|
# Funções KB
|
|
def kb_tap(self, s: str) -> str:
|
|
"""
|
|
## KB Tap
|
|
Envia uma tecla ou teclas para serem clicadas no componente com foco onde o robo é executado. Em caso de teclas alteradoras, elas devem ser sempre posicionadas após a tecla alvo sem espaço entre a vírgula e o texto.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- s: Sequência de teclas que se deve apertar.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
|
|
---
|
|
#### Exemplo:
|
|
Para enviar ALT+d, você envia o string "d,alt". Para enviar C maiusculo, você utiiliza "c,shift".
|
|
"""
|
|
str = urllib.parse.quote(s, "")
|
|
return self.__requestget__(f'/ipc/wingui/kb/tap?str={str}')
|
|
|
|
def kb_type(self, s: str) -> str:
|
|
"""
|
|
## KB Type
|
|
Semelhante a tap, mas envia textos completos.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- s: Texto que se quer digitar.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
str = urllib.parse.quote(s, "")
|
|
return self.__requestget__(f"/ipc/wingui/kb/type?str={str}")
|
|
|
|
def kb_toggle(self, s: str) -> str:
|
|
"""
|
|
## KB Toggle
|
|
Semelhante a tap, porém mantem a tecla ou o conjunto de teclas pressionado até que elas sejam pressionadas novamente manualmente ou pelo robô. Pode-se utilizar o método kb_tap para interromper o pressionamento por exemplo.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- s: Tecla ou sequência de teclas que se deseja pressionar.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
str = urllib.parse.quote(s, "")
|
|
return self.__requestget__(f"/ipc/wingui/kb/toggle?str={str}")
|
|
|
|
# Funções Dialog
|
|
def dialog_color(self, t: str = "Selecione Cor", d: str = "BEBEBE") -> bool:
|
|
"""
|
|
## Dialog Color
|
|
Apresenta uma janela de diálogo para que o usuário selecione uma cor.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo
|
|
- d: Cor padrao
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Dicionário cujas chaves são "R", "G", "B" e "A" e os valores são os valores RGBA específicos da cor para cada uma das chaves.
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
d = urllib.parse.quote(d, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/color?t={t}&d={d}')
|
|
|
|
def dialog_date(self, t: str = "Selecione Data", m: str = "", d="", f="") -> str:
|
|
"""
|
|
## Dialog Date
|
|
Apresenta uma janela de diálogo para que o usuário selecione uma data.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Título
|
|
- m: Mensagem de texto
|
|
- d: Data Padrao (se vazio = hoje)
|
|
- f: formato para parse
|
|
|
|
---
|
|
#### Retorna:
|
|
-> String contendo a data selecionada. Ex: 2021-12-15T00:00:00Z
|
|
"""
|
|
|
|
f = urllib.parse.quote(f, "")
|
|
d = urllib.parse.quote(d, "")
|
|
m = urllib.parse.quote(m, "")
|
|
t = urllib.parse.quote(t, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/date?t={t}&m={m}&d={d}&f={f}')
|
|
|
|
def dialog_entry(self, t: str = "Favor inserir", m: str = "Valor", d: str = "Valor") -> str:
|
|
"""
|
|
## Dialog Entry
|
|
Apresenta uma janela de diálogo para entrada de um texto curto.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo
|
|
- m: Mensagem de texto
|
|
- d: valor padrao
|
|
|
|
---
|
|
#### Retorna:
|
|
-> String digitada.
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
d = urllib.parse.quote(d, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/entry?t={t}&m={m}&d={d}')
|
|
|
|
def dialog_error(self, t: str = "Erro", m: str = "Houve um erro") -> bool:
|
|
"""
|
|
## Dialog Error
|
|
Apresenta uma janela de dialog exibindo um erro definido pelo programador.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo
|
|
- m: Mensagem de texto
|
|
|
|
---
|
|
#### Retorna:
|
|
-> "ok"
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/error?t={t}&m={m}')
|
|
|
|
def dialog_file(self, t: str = "Selecionar arquivo", f: str = ".", d: str = "false") -> str:
|
|
"""
|
|
## Dialog File
|
|
Apresenta uma janela de seleção de arquivos ou pastas.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela.
|
|
- f: Diretório inicial ("." por padrão)
|
|
- d: true -> Seleciona diretórios; false -> Seleciona arquivos
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Caminho absoluto do arquivo selecionado
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
f = urllib.parse.quote(f, "")
|
|
d = urllib.parse.quote(d, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/file?t={t}&f={f}&d={d}')
|
|
|
|
def dialog_file_multi(self, t: str = "Selecionar arquivos", f: str = ".") -> List[str]:
|
|
"""
|
|
## Dialog File Multi
|
|
Apresenta uma janela de seleção de múltiplos arquivos.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela.
|
|
- f: Diretório inicial ("." por padrão)
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Lista com os caminhos absolutos dos arquivos selecionados.
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
f = urllib.parse.quote(f, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/filemulti?t={t}&f={f}')
|
|
|
|
def dialog_info(self, t: str = "Info", m: str = "Info Msg") -> bool:
|
|
"""
|
|
## Dialog Info
|
|
Apresenta uma janela de diálogo exibindo uma informação definida pelo programador.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem exibida
|
|
|
|
---
|
|
#### Retorna:
|
|
-> "ok"
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/info?t={t}&m={m}')
|
|
|
|
def dialog_list(self, t: str = "Selecionar", m: str = "Selecione uma entrada", f: List[str] = []) -> str:
|
|
"""
|
|
## Dialog List
|
|
Apresenta uma janela de diálogo com uma lista. Permite o usuário selecionar um dos itens.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem da janela
|
|
- f: Opções para escolher
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Opção escolhida
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
f = urllib.parse.quote(",".join(f), "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/list?t={t}&m={m}&f={f}')
|
|
|
|
def dialog_listmulti(self, t: str = "Selecionar", m: str = "Selecione uma entrada", f: List[str] = []) -> List[str]:
|
|
"""
|
|
## Dialog List Multi
|
|
Apresenta uma janela de diálogo. Permite o usuário selecionar todos os itens que quiser.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem da janela
|
|
- f: Opções para escolher
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Lista com as opções escolhidas
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
f = urllib.parse.quote(",".join(f), "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/listmulti?t={t}&m={m}&f={f}')
|
|
|
|
def dialog_password(self, t: str = "Entrar com Senha", m: str = "Favor fornecer sua senha") -> str:
|
|
"""
|
|
## Dialog Password
|
|
Apresenta uma janela de diálogo para entrada de senha/informações confidenciais.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem de texto exibida
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Texto digitado.
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/password?t={t}&m={m}')
|
|
|
|
def dialog_question(self, t: str = "Question", m: str = "Question Msg") -> bool:
|
|
"""
|
|
## Dialog Question
|
|
Apresenta uma janela de diálogo com uma pergunta, que apresenta as opções sim/não
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem exibida.
|
|
|
|
---
|
|
#### Retorna:
|
|
- True: Caso clique em sim
|
|
- False: Caso clique em não
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/question?t={t}&m={m}')
|
|
|
|
def dialog_warn(self, t: str = "Warn", m: str = "Warn") -> bool:
|
|
"""
|
|
## Dialog Warn
|
|
Apresenta uma janela de diálogo exibindo uma mensagem de aviso.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Titulo da janela
|
|
- m: Mensagem exibida
|
|
|
|
---
|
|
#### Retorna:
|
|
-> "ok"
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f'/ipc/wingui/dialog/warn?t={t}&m={m}')
|
|
|
|
# def dialog_yesno(self, t: str, m: str) -> bool:
|
|
# """
|
|
# Apresenta dialogo para que usuario escolha sim ou nao
|
|
# Params:
|
|
# - t: Titulo
|
|
# - m: Mensagem
|
|
# Retorna:
|
|
# bool
|
|
# """
|
|
# return self.__requestget__("dialog/yesno?t={}&m={}".format(urllib.parse.quote(t, ""), urllib.parse.quote(m, "")))
|
|
#
|
|
# def dialog_filesave(self, t: str, d: str, x: List[str]) -> str:
|
|
# """
|
|
# Apresenta dialogo usuario arquivo para salvar arquivo
|
|
# Params:
|
|
# - t: Titulo
|
|
# - d: descricao
|
|
# - x: lista de extensoes SEM PONTO - ex: ["pdf","xls","py"]
|
|
# Retorna:
|
|
# str: Nome do arquivo
|
|
# """
|
|
# xstr = ",".join(x)
|
|
# return self.__requestget__(
|
|
# "dialog/filesave?t={}&d={}&x={}".format(urllib.parse.quote(t, ""), urllib.parse.quote(d, ""),
|
|
# urllib.parse.quote(xstr, "")))
|
|
#
|
|
# def dialog_fileload(self, t: str, d: str, x: List[str]) -> str:
|
|
# """
|
|
# Apresenta dialogo usuario arquivo para carregar arquivo
|
|
# Params:
|
|
# - t: Titulo
|
|
# - d: descricao
|
|
# - x: lista de extensoes SEM PONTO - ex: ["pdf","xls","py"]
|
|
# Retorna:
|
|
# str: Nome do arquivo
|
|
# """
|
|
# xstr = ",".join(x)
|
|
# return self.__requestget__(
|
|
# "dialog/fileload?t={}&d={}&x={}".format(urllib.parse.quote(t, ""), urllib.parse.quote(d, ""),
|
|
# urllib.parse.quote(xstr, "")))
|
|
#
|
|
# def dialog_dir(self, t: str) -> str:
|
|
# """"
|
|
# Apresenta dialogo usuario selecionar pasta
|
|
# Params:
|
|
# - t: Titulo
|
|
# Retorna:
|
|
# str: Nome do diretorio
|
|
# """
|
|
# return self.__requestget__("dialog/dir?t={}".format(urllib.parse.quote(t, "")))
|
|
|
|
# Funções Mouse
|
|
def mouse_move(self, x: int, y: int) -> str:
|
|
"""
|
|
## Mouse Move
|
|
Move o mouse para a coordenada X, Y
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- x: Posição absoluta da tela no eixo x
|
|
- y: Posição absoluta da tela no eixo y
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/mouse/move?x={x}&y={y}")
|
|
|
|
def mouse_drag(self, x: int, y: int, btn: str = "left") -> str:
|
|
"""
|
|
## Mouse Drag
|
|
Move o mouse para a coordenada X, Y
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- x: Coordenada final do eixo x
|
|
- y: Coordenada final do eixo y
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
btn = urllib.parse.quote(btn, "")
|
|
return self.__requestget__(f'/ipc/wingui/mouse/drag?x={x}&y={y}&btn={btn}')
|
|
|
|
def mouse_click(self) -> str:
|
|
"""
|
|
## Mouse Click
|
|
Clica no local onde o mouse está repousado
|
|
|
|
---
|
|
#### Parâmetros:
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
---
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/mouse/click")
|
|
|
|
def mouse_moverelative(self, x: int, y: int) -> str:
|
|
"""
|
|
## Mouse Move Relative
|
|
Move o mouse para a coordenada X, Y, relativo a coordenada atual
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- x: Quantidade de píxeis que o mouse será movido no eixo x
|
|
- y: Quantidade de píxeis que o mouse será movido no eixo y
|
|
##### No caso de valores negativos, moverá relativamente o mouse para a esquerda (x) e/ou para cima (y)
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
return self.__requestget__(f"/ipc/wingui/mouse/moverelative?x={x}&y={y}")
|
|
|
|
def mouse_clickat(self, x: int, y: int):
|
|
"""
|
|
## Mouse Click At
|
|
Move o mouse e clica em uma única operação
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- x: Coordenada absoluta do eixo x no qual o robô fará o clique
|
|
- y: Coordenada absoluta do eixo y no qual o robô fará o clique
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/mouse/clickat?x={x}&y={y}")
|
|
|
|
def mouse_clickatrelative(self, x: int, y: int):
|
|
"""
|
|
## Mouse Click At
|
|
Move o mouse e clica em uma única operação
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- x: Quantidade em píxels que o mouse se moverá no eixo X a partir da posição atual
|
|
- y: Quantidade em píxels que o mouse se moverá no eixo Y a partir da posição atual
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
return self.__requestget__(f"/ipc/wingui/mouse/clickatrelative?x={x}&y={y}")
|
|
|
|
# Funções Notify
|
|
def notify_alert(self, t: str, m: str):
|
|
|
|
"""
|
|
## Notify Alert
|
|
Cria um alerta do windows.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Título da notificação.
|
|
- m: Mensagem exibida pela notificação.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f"/ipc/wingui/notify/alert?msg={m}&title={t}")
|
|
|
|
def notify_beep(self, t: str, m: str):
|
|
|
|
"""
|
|
## Notify Alert
|
|
Cria um alerta do windows.
|
|
|
|
---
|
|
#### Parâmetros:
|
|
- t: Título da notificação.
|
|
- m: Mensagem exibida pela notificação.
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
|
|
t = urllib.parse.quote(t, "")
|
|
m = urllib.parse.quote(m, "")
|
|
return self.__requestget__(f"/ipc/wingui/notify/notify?msg={m}&title={t}")
|
|
|
|
# Funções proc
|
|
def proc_exec(self, cmd: str):
|
|
|
|
"""
|
|
## Process execute
|
|
Executa um comando cmd localmente na máquina. Para abertura de arquivos, é necessário informar o caminho absoluto do arquivo. No caso de arquivos nativos da Microsoft pode-se apenas escrever o nome do mesmo.
|
|
|
|
---
|
|
### Ex:
|
|
- wg.proc_exec("C:\\Program Files\\Internet Explorer\\iexplore.exe")
|
|
- wg.proc_exec("mspaint")
|
|
|
|
---
|
|
Params:
|
|
- cmd: Comando CMD a ser executado
|
|
---
|
|
Retorna:
|
|
|
|
-> "ok"
|
|
"""
|
|
cmd = urllib.parse.quote(cmd, "")
|
|
return self.__requestget__(f"/ipc/wingui/proc/exec?cmd={cmd}")
|
|
|
|
def proc_kill(self, pid: int):
|
|
|
|
"""
|
|
## Process kill
|
|
Finaliza o processo com PID informado como parâmetro.
|
|
|
|
---
|
|
Params:
|
|
- pid: Identificador do processo que se deseja finalizar.
|
|
---
|
|
Retorna:
|
|
|
|
- Sucesso: "Êxito, o processo com PID {num_do_pid} foi finalizado.".
|
|
- Falha: Erro.
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/proc/kill?cmd={pid}")
|
|
|
|
def proc_all(self):
|
|
|
|
"""
|
|
## Process All
|
|
Lista todos os processos em execução na maquina robo.
|
|
|
|
---
|
|
#### Params:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
Um array de dicionários python. Cada um deles tem o formato:
|
|
{
|
|
"Pid": xxx
|
|
"Name":"str"
|
|
}
|
|
Onde Pid é um inteiro representando o PID do processo, e Name é o nome do processo.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/proc/all")
|
|
|
|
def proc_name(self, pid: int):
|
|
"""
|
|
## Process Name
|
|
Obtem o nome do processo através de seu PID.
|
|
|
|
---
|
|
#### Params:
|
|
|
|
- pid: Número do identificador de processo que se quer saber o nome.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Nome do processo correspondente ao PID.
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/proc/name?pid={pid}")
|
|
|
|
def proc_path(self, pid: int):
|
|
"""
|
|
## Process Path
|
|
Retorna o caminho do arquivo que corresponde ao PID informado.
|
|
|
|
---
|
|
#### Params:
|
|
- pid: Identificador do processo ativo que se quer saber o caminho.
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Caminho do arquivo correspondente ao PID.
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/proc/path?pid={pid}")
|
|
|
|
def proc_pids(self):
|
|
"""
|
|
## Process PIDS
|
|
Busca todos os processos ativos na máquina e retorna o PID deles.
|
|
|
|
---
|
|
#### Params:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
-> Array de inteiros contendo todos os PIDS ativos da máquina.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/proc/pids")
|
|
|
|
# Funções Window
|
|
def window_activehwnd(self) -> int:
|
|
"""
|
|
## Window Active HWND
|
|
Procura o HWND da janela ativa entre as informações de processos ativos do Windows.
|
|
|
|
---
|
|
#### info:
|
|
HWND é um indicador unico de um componente ajanelado no windows.
|
|
|
|
---
|
|
#### Params:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
-> HWND da janela ativa.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/window/activehwnd")
|
|
|
|
def window_activetitle(self) -> str:
|
|
"""
|
|
## Window Active Title
|
|
Procura o título da janela ativa entre as informações de processos ativos do Windows.
|
|
|
|
---
|
|
#### Params:
|
|
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
|
|
-> Título da janela ativa
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/window/activetitle")
|
|
|
|
def window_list(self, s: str = "") -> List[dict]:
|
|
|
|
"""
|
|
## Window List
|
|
Lista as janelas disponiveis, fitrando pelo nome passado em "s", caso ele seja fornecido.
|
|
|
|
---
|
|
#### Params:
|
|
- s: Substring do nome das janelas que se quer buscar.
|
|
---
|
|
#### Retorna:
|
|
- "s" recebe um valor: Lista de dicinários contendo todos os processos que contenham a substring de "s".
|
|
- "s" não recebe um valor: Lista de dicionários contendo todos os processos ativos da máquina.
|
|
##### Formato de saída:
|
|
{
|
|
|
|
"Hwnd":0,
|
|
|
|
"Pid":0,
|
|
|
|
"Title":"str"
|
|
}
|
|
|
|
Onde Hwnd é o identificador da janela, pid é o numero do processo, e Title é o titulo da janela
|
|
"""
|
|
|
|
s = urllib.parse.quote(s, "")
|
|
return self.__requestget__(f"/ipc/wingui/window/list?s={s}")
|
|
|
|
def window_hwnd(self, s: str) -> List[int]:
|
|
"""
|
|
## Window HWND
|
|
Faz uma busca nos processos ativos do windows, identifica os que possuem a susbtring informada em "s" e retorna o HWND de todos eles.
|
|
|
|
---
|
|
#### Params
|
|
- s: Substring contida na janela para busca. Este parâmetro é OBRIGATÓRIO.
|
|
---
|
|
#### Retorna:
|
|
-> Lista de todos os HWNDs cujo nome da janela possua a substring "s".
|
|
"""
|
|
s = urllib.parse.quote(s, "")
|
|
return self.__requestget__(f"/ipc/wingui/window/hwnd?s={s}")
|
|
|
|
def window_activate(self, hwnd: int):
|
|
"""
|
|
## Window Activate
|
|
Ativa uma janela de acordo com seu hwnd.
|
|
|
|
---
|
|
#### Params:
|
|
- hwnd: Número HWND da janela que se deseja ativar.
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/window/activate?Hwnd={hwnd}")
|
|
|
|
def window_close(self, hwnd: int):
|
|
"""
|
|
## Window Close
|
|
Fecha janela de acordo com o hwnd.
|
|
|
|
---
|
|
#### Params:
|
|
- hwnd: Número HWND da janela que se quer fechar.
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/window/close?Hwnd={hwnd}")
|
|
|
|
def window_max(self, hwnd: int):
|
|
"""
|
|
## Window Maximize
|
|
Maximiza janela de acordo com o hwnd.
|
|
|
|
---
|
|
#### Params:
|
|
- hwnd: Número HWND da janela que se quer maximizar.
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/window/max?Hwnd={hwnd}")
|
|
|
|
def window_min(self, s: int):
|
|
"""
|
|
## Window Minimize
|
|
Minimiza janela de acordo com o hwnd.
|
|
|
|
---
|
|
#### Params:
|
|
- hwnd: Número HWND da janela que se quer minimizar.
|
|
---
|
|
#### Retorna:
|
|
|
|
---
|
|
"""
|
|
return self.__requestget__(f"/ipc/wingui/window/min?Hwnd={s}")
|
|
|
|
def window_waitactivetitle(self, t: str, m: int = 30):
|
|
"""
|
|
## Window Wait for Active Title
|
|
Aguarda um determinado tempo até que apareça uma janela ativa cujo título contenha a substring "t".
|
|
|
|
---
|
|
#### Params:
|
|
- t: Substring que deve estar contida no título da janela ativa.
|
|
- m: Tempo limite até a janela aparecer.
|
|
|
|
---
|
|
#### Retorna:
|
|
- Dicionário contendo informações sobre a janela ativa com a substring encontrada.
|
|
##### Formato de saída:
|
|
{
|
|
|
|
'Title': 'xxxxxxxx',
|
|
|
|
'Hwnd': xxxx
|
|
}
|
|
"""
|
|
t = urllib.parse.quote(t, "")
|
|
return self.__requestget__(f"/ipc/wingui/window/waitactivetitle?t={t}&m={m}")
|
|
|
|
# Funções Display
|
|
def display_res (self):
|
|
"""
|
|
## Display Resolution
|
|
Faz uma busca nas configurações de sistema do windows para encontrar informações sobre o mesmo. Entre as informações encontradas, está a resolução do monitor ativo.
|
|
|
|
---
|
|
#### Params:
|
|
---
|
|
|
|
---
|
|
#### Retorna:
|
|
- Dicionário contendo informações do sistema.
|
|
##### Formato de saída:
|
|
{
|
|
|
|
"nome_da_propriedade": valor_da_propriedade
|
|
|
|
.
|
|
|
|
.
|
|
|
|
.
|
|
|
|
"nome_da_propriedade": valor_da_propriedade
|
|
}
|
|
|
|
As informações de comprimento e altura da tela podem ser encontradas através das chaves "DmPelsWidth" e "DmPelsHeight" respectivamente.
|
|
"""
|
|
return self.__requestget__("/ipc/wingui/display/res")
|
|
|
|
def display_setres (self, DEVMODE: dict):
|
|
"""
|
|
## Display Set Resolution
|
|
Acessa as configurações do sistema e faz alterações na resolução da tela de acordo com os valores informados para a mesma.
|
|
|
|
---
|
|
#### Params:
|
|
- DEVMODE: Estrutura de dados com informações do sistema. Para mais informações, acesse: https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-devmodea
|
|
|
|
---
|
|
#### Retorno:
|
|
-> "ok"
|
|
"""
|
|
return self.__requestpost__("/ipc/wingui/display/setres", DEVMODE) |