1 votos

Herramienta de línea de comandos para Mac OS que simula clics de ratón o entradas de teclado

Necesito escribir una herramienta que simule pulsaciones periódicas de ratón o teclado en mi mac.

El objetivo es simular la actividad del usuario, concretamente en MS Teams, sin interferir en el uso normal del ordenador/programas. La no interferencia es crucial aquí, es decir, una pulsación de tecla simulada debe ser registrada por el sistema operativo/aplicaciones como una pulsación de tecla, pero NO DEBE "promulgar" una interacción real con nada (he leído que esto sería posible para Windows mediante la simulación de pulsar una tecla F13 sólo teóricamente existente, por lo tanto, no funcional).

Es importante que no se trate de una aplicación/programa que se instale habitualmente, sino de una herramienta de línea de comandos que se ejecute al iniciar el sistema y se ejecute en segundo plano (como un cronjob).

¿Cómo escribo algo así?

PS: ¿Cómo hago que el ratón haga clic en la ubicación actual utilizando AppleScript? sólo tiene respuestas para los clics del ratón.

2voto

Wolf Puntos 1

Me las arreglé para escribir un simple Python script para hacer exactamente lo que necesitaba:

Básicamente, pulsa la tecla de bloqueo de mayúsculas (que debe desactivarse a través de la configuración del sistema) en intervalos aleatorios, imitando así la interacción del usuario e impidiendo que tu Mac entre en reposo, que se inicie el salvapantallas o que los equipos de MS te muestren como "ausente". Al mismo tiempo, esto no aparece como un programa instalado, por lo que no levantará sospechas.

El script consta de dos archivos, uno de arranque-parada-script y otro que se encarga de la pulsación de teclas. Ambos archivos van en el mismo directorio:

pressy.py

import time
import random
from Quartz.CoreGraphics import CGEventCreateKeyboardEvent, CGEventPost, kCGEventKeyUp, kCGEventKeyDown
from Quartz import kCGHIDEventTap

def simulate_key_press(key_code, delay=0.05):
    # Press the key
    key_down_event = CGEventCreateKeyboardEvent(None, key_code, True)
    CGEventPost(kCGHIDEventTap, key_down_event)

    # Add a small delay to simulate a real key press
    time.sleep(delay)

    # Release the key
    key_up_event = CGEventCreateKeyboardEvent(None, key_code, False)
    CGEventPost(kCGHIDEventTap, key_up_event)

if __name__ == "__main__":
    while True:
        # 57 is caps_lock
        key_code = 57

        # Generate a random interval (in seconds) for the key presses
        random_interval = random.uniform(10, 50)

        # Simulate the key press
        simulate_key_press(key_code)

        # Wait for the random interval before the next key press
        time.sleep(random_interval)

pressy

#!/usr/bin/env python3

import sys
import os
import subprocess
import signal
from pathlib import Path

pid_file = Path("pressy.pid")

def start():
    if pid_file.exists():
        print("Pressy is already running.")
        return

    script_path = Path(__file__).parent / "pressy.py"
    process = subprocess.Popen([sys.executable, str(script_path)])
    with open(pid_file, "w") as f:
        f.write(str(process.pid))
    print("Pressy has started.")

def stop():
    if not pid_file.exists():
        print("Pressy is not running.")
        return

    with open(pid_file, "r") as f:
        pid = int(f.read())
    try:
        os.kill(pid, signal.SIGTERM)
        pid_file.unlink()
        print("Pressy has stopped.")
    except ProcessLookupError:
        print("Pressy process not found. Cleaning up...")
        pid_file.unlink()

def status():
    if pid_file.exists():
        print("Pressy is running.")
    else:
        print("Pressy is not running.")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: ./pressy <start|stop|status>")
        sys.exit(1)

    command = sys.argv[1].lower()
    if command == "start":
        start()
    elif command == "stop":
        stop()
    elif command == "status":
        status()
    else:
        print("Invalid command. Usage: ./pressy <start|stop|status>")

Requisitos:

  • Python 3 (creado y probado con Python 3.11)

Instalación:

  • Instala pyobjc: pip3 install pyobjc
  • chmod +x pressy
  • Tecla de desactivación pulsada: Configuración del sistema -> teclado -> atajos de teclado -> teclas modificadoras -> poner "Tecla Bloq Mayús" en "Sin acción". Obviamente, puede utilizar cualquier otra tecla ( https://web.archive.org/web/20100501161453/http://www.classicteck.com/rbarticles/mackeyboard.php )
  • Permitir el acceso a "Terminal" en la configuración de "Accesibilidad" (Se solicitará cuando se inicie por primera vez).

Úsalo:

  • Inicio: ./pressy start
  • Parada: ./pressy stop
  • Estado: ./pressy status

Actualmente se trabaja en una pequeña interfaz de usuario que permite controlar todo con un conjunto de botones de la barra de tareas

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X