Modo non javascript
In realtà, mi piacciono le soluzioni, che possono essere basate su javascript, dal momento che sono più probabilmente legate al web, e buone probabilità sono - indipendenti dal sistema operativo. Tuttavia, stavo pensando: come risolvere il problema per tutti i browser, poiché le soluzioni javascript, in questo caso, saranno difficili da regolare per tutti i browser possibili (non sono sicuro che sia possibile).
Quindi, come hai già detto, esiste un altro modo, ovvero emulare il comportamento a livello di sistema operativo. Questo ha anche un altro vantaggio: potresti essere sicuro che per il browser sembra al 100% come era umano (perché, beh, è il driver che sta inviando il segnale). Quindi è possibile utilizzare soluzioni basate su driver / dispositivo con qualsiasi browser (o anche in situazioni, quando javascript è disabilitato).
Linux
Sfortunatamente, coinvolgere il driver / dispositivo provoca immediatamente la dipendenza del sistema operativo. Quindi per ogni sistema operativo avrai bisogno della tua soluzione. In questo post mi concentro sulla soluzione basata su Linux (quindi, funzionerà con Linux) e Mac OS un po '. Con Linux, è possibile scrivere eventi sul dispositivo in modo esplicito, quindi di seguito è riportato un esempio di funzione con loop principale:
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;
}
Il mio codice completo per il problema è disponibile qui . Il programma chiederà l'ampiezza del "tremore" e la sua frequenza (quindi, quante volte in micro-secondi sono tra i "tremori"). Per emulare la situazione, costringerà il mouse a muoversi casualmente per i 0..X
punti in direzione casuale (su-giù-sinistra-fondo) e ad attendere casualmente i 0..Y
micro-secondi fino al prossimo "tremore", vi X
è ampiezza di "tremore" eY
è la frequenza di "tremore "
Un'altra cosa potrebbe essere quella di adattare il programma al proprio sistema. Il programma è "fittizio" e non è in grado di rilevare il mouse da solo, quindi "/dev/input/event4"
è codificato. Per capire quale potrebbe essere l'identificatore del tuo sistema, puoi provare:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
E così le possibilità sono "event3"
e "event4"
- ma per il tuo sistema che potrebbero avere altri valori. Quindi, se è diverso da quello attualmente utilizzato nel codice C, basta cambiare la riga corrispondente (quindi, allineare int fd = open("/dev/input/event4", O_RDWR);
e posizionare il dispositivo anzichéevent4
)
Una demo gif per questo programma (frame rate basso, sfortunatamente, quindi tieni l'immagine non troppo grande) qui .
Una piccola nota a margine (se non sai cosa fare con il codice C) - per compilare il programma sopra, basta usare:
user@host:/path$ gcc -std=gnu99 file.c -o m
dov'è file.c
il nome del tuo file di codice sorgente C, quindi otterrai eseguibile, chiamato m
nella tua directory. Molto probabilmente avrai bisogno delle autorizzazioni per scrivere direttamente nel dispositivo del mouse, quindi puoi usare sudo
:
user@host:/path$ sudo ./m
Altro sistema operativo
La logica rimarrà la stessa:
- Trova un modo per accedere al tuo dispositivo mouse
- Scrivi evento di spostamento del mouse
- Applica la randomizzazione al tuo evento
Questo è tutto. Ad esempio, Mac OS ha il suo modo di lavorare con il mouse (non come Linux, anche Mac non lo è procfs
), è ben descritto qui .
Come conclusione
Cosa c'è di meglio - javascript o soluzioni orientate al dispositivo - dipende da te, perché determinate condizioni (come cross-browser o cross-OS) possono decidere tutto in questo caso. Pertanto, ho fornito linee guida insieme ad alcuni esempi di funzionamento su come implementarlo a livello di sistema operativo. Il vantaggio qui è che la soluzione è cross-browser, ma come costo abbiamo un programma associato al sistema operativo.