Autoclicker en kde wayland

 Buenas, 

He estado buscando como automatizar cosas en un escritorio bajo fedora kde con wayland (Fedora 41). Resulta que wayland ofrece más seguridad e impide que scripts custom toqueteen el escritorio, como mover el ratón, hacer clicks, escribir con el teclado.... muy bonito, pero a la mierda mis scripts para automatizar cosas.

Con python hay librerias que permiten hacerlo, pero de vez en cuando sale un aviso que tienes que aceptar para permitir que ese script te mueva el ratón. Claro, si lo que tu quieres es automatizar, es para hacer cosas cuando tu NO estás, como no estás, no puedes aceptar el permiso, el script no mueve nada, no sirve de nada.

La solución que he encontrado es usar evemu, para enviar eventos de movimiento/clicks del ratón o pulsaciones de tecla del teclado. Lo malo es que se requieren permisos de root para poder escribir en los "/dev/" que toca evemu... en fin...

Ejemplo en python:

def start_position():
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_X", "--value", "-4500", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_X", "--value", "-500", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_Y", "--value", "-3000", "--sync"])

def go_to_position(x: int, y: int, click: bool):
start_position()
pos_x = x/2
pos_y = y/2
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_X", "--value", f"{pos_x:.0f}", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_Y", "--value", f"{pos_y:.0f}", "--sync"])
time.sleep(0.2)
if click: lclick()

def move_n_pixels(x: int, y: int, click: bool):
pos_x = x/2
pos_y = y/2
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_X", "--value", f"{pos_x:.0f}", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_REL", "--code", "REL_Y", "--value", f"{pos_y:.0f}", "--sync"])
time.sleep(0.2)
if click: lclick()
def lclick():
subprocess.run(["evemu-event", mouse_device, "--type", "EV_KEY", "--code", "BTN_LEFT", "--value", "1", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_KEY", "--code", "BTN_LEFT", "--value", "0", "--sync"])
time.sleep(0.5)

def rclick():
subprocess.run(["evemu-event", mouse_device, "--type", "EV_KEY", "--code", "BTN_RIGHT", "--value", "1", "--sync"])
subprocess.run(["evemu-event", mouse_device, "--type", "EV_KEY", "--code", "BTN_RIGHT", "--value", "0", "--sync"])
time.sleep(0.5)

def press_key(KEY: str):
#print(f"TECLA: {KEY}")
subprocess.run(["evemu-event", keyboard_device, "--type", "EV_KEY", "--code", KEY, "--value", "1", "--sync"])
time.sleep(0.1)
subprocess.run(["evemu-event", keyboard_device, "--type", "EV_KEY", "--code", KEY, "--value", "0", "--sync"])
time.sleep(0.2)

def merge_all():
iteration = 1
positions = []
positions.append([{'x':345, 'y':244}, {'x':295, 'y':354}])
positions.append([{'x':817, 'y':248}, {'x':772, 'y':354}])
positions.append([{'x':1299,'y':221}, {'x':1248,'y':342}])
positions.append([{'x':1766,'y':221}, {'x':1730,'y':342}])
while True:
for window in positions:
#print(window)
go_to_position(window[0]["x"], window[0]["y"], True)
go_to_position(window[1]["x"], window[1]["y"], True)
#input("Press a key to continue...")

print(f"Iteration {iteration}")
iteration += 1
time.sleep(600)

De esta forma puedo hacer un mierda-script en python que mueva el puntero por las posiciones que me interese y que haga click donde me interese.


Comentarios