Manera no javascript
En realidad, me gustan las soluciones, que pueden estar basadas en javascript, ya que es más probable que estén relacionadas con la web, y es muy probable que sean independientes del sistema operativo. Sin embargo, estaba pensando en cómo resolver su problema para todos los navegadores, ya que las soluciones de JavaScript, en este caso, serán difíciles de ajustar para todos los navegadores posibles (no estoy seguro de si es posible).
Entonces, como mencionó, hay otra forma, es decir, emular el comportamiento a nivel del sistema operativo. Esto también tiene otra ventaja: puede estar seguro de que para el navegador se ve 100% como si fuera humano (porque, bueno, es el controlador el que está enviando la señal). Por lo tanto, puede usar soluciones basadas en controladores / dispositivos con cualquier navegador (o incluso en una situación en la que JavaScript esté deshabilitado).
Linux
Desafortunadamente, la participación del controlador / dispositivo causa inmediatamente la dependencia del sistema operativo. Entonces, para cada sistema operativo, necesitará su propia solución. En esta publicación, estoy centrado en la solución basada en Linux (por lo tanto, funcionará con Linux) y Mac OS un poco. Con Linux, es posible escribir eventos en el dispositivo explícitamente, por lo que a continuación se muestra una muestra de la función con el bucle principal:
int main()
{
struct input_event event, event_end;
int fd = open("/dev/input/event4", O_RDWR);
long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
if (fd < 0)
{
printf("Mouse access attempt failed:%s\n", strerror(errno));
return -1;
}
memset(&event, 0, sizeof(event));
memset(&event, 0, sizeof(event_end));
gettimeofday(&event.time, NULL);
event.type = EV_REL;
gettimeofday(&event_end.time, NULL);
event_end.type = EV_SYN;
event_end.code = SYN_REPORT;
event_end.value = 0;
while(1)
{
event.code = rand() % 2 ? REL_X : REL_Y;
event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
write(fd, &event, sizeof(event));
write(fd, &event_end, sizeof(event_end));
usleep(randomTill(ta));
}
close(fd);
return 0;
}
Mi código completo para el problema se encuentra aquí . El programa solicitará la amplitud del "temblor" y su frecuencia (por lo tanto, cuánto tiempo en microsegundos hay entre "temblores"). Para emular la situación, obligará al mouse a moverse aleatoriamente por 0..X
puntos en dirección aleatoria (arriba-abajo-izquierda-abajo) y esperará 0..Y
microsegundos al azar hasta el próximo "temblor", hay X
una amplitud de "temblor" yY
es frecuencia de "temblor". "
Otra cosa puede ser adaptar el programa a su sistema. El programa es "ficticio" y no puede detectar el mouse por sí mismo, por lo que "/dev/input/event4"
está codificado. Para darse cuenta de lo que puede ser un identificador para su sistema, puede intentar:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Y así, las posibilidades son "event3"
y "event4"
, pero para su sistema, eso puede tener otros valores. Entonces, si eso es diferente del que se usa actualmente en el código C, simplemente cambie la línea correspondiente (así, alinee int fd = open("/dev/input/event4", O_RDWR);
y coloque su dispositivo en lugar deevent4
)
Una demostración de gif para este programa (baja velocidad de fotogramas, desafortunadamente, así que mantenga la imagen no demasiado grande) aquí .
Una pequeña nota al margen (si no sabe qué hacer con el código C): para compilar el programa anterior, solo use:
user@host:/path$ gcc -std=gnu99 file.c -o m
donde file.c
está el nombre de su archivo de código fuente C, entonces obtendrá el ejecutable, llamado m
en su directorio. Lo más probable es que necesite permisos para escribir directamente en el dispositivo del mouse, por lo que puede usar sudo
:
user@host:/path$ sudo ./m
Otro sistema operativo
La lógica seguirá siendo la misma:
- Encuentre una manera de acceder a su dispositivo de mouse
- Escribir evento de mover el mouse
- Aplicar aleatorización a su evento
Eso es. Por ejemplo, Mac OS tiene su propia forma de trabajar con el mouse (no como Linux, Mac tampoco procfs
), está bien descrito aquí .
Como conclusión
Lo que es mejor, javascript o soluciones orientadas a dispositivos, depende de usted, porque ciertas condiciones (como el navegador cruzado o el sistema operativo cruzado) pueden decidir todo en este caso. Por lo tanto, he proporcionado pautas junto con cierto ejemplo de trabajo de cómo implementar eso en el nivel del sistema operativo. El beneficio aquí es que la solución es un navegador cruzado, pero como costo tenemos un programa vinculado al sistema operativo.