Manière non javascript
En fait, j'aime les solutions, qui peuvent être basées sur javascript, car elles sont plus probablement liées au Web, et les bonnes chances sont - indépendantes du système d'exploitation. Cependant, je réfléchissais à - comment résoudre votre problème pour tous les navigateurs, car les solutions javascript, dans ce cas, seront difficiles à ajuster pour tous les navigateurs possibles (je ne suis pas sûr que ce soit possible).
Ainsi, comme vous l'avez mentionné, il existe un autre moyen - à savoir émuler le comportement au niveau du système d'exploitation. Cela a aussi un autre avantage - vous pouvez être sûr que pour le navigateur, il semble à 100% comme il était humain (car, bien, c'est le pilote qui envoie le signal). Vous pouvez donc utiliser des solutions basées sur les pilotes / périphériques avec tous les navigateurs (ou même en situation, lorsque javascript est désactivé).
Linux
Malheureusement, l'implication du pilote / périphérique entraîne immédiatement une dépendance au système d'exploitation. Ainsi, pour chaque système d'exploitation, vous aurez besoin de votre propre solution. Dans cet article, je me concentre sur une solution basée sur Linux (donc, cela fonctionnera avec Linux) - et Mac OS un peu. Avec Linux, il est possible d'écrire des événements sur le périphérique de manière explicite, voici donc un exemple de fonction avec boucle 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;
}
Mon code complet pour le problème se trouve ici . Le programme demandera l'amplitude du "tremblement" et sa fréquence (ainsi, combien de temps en micro-secondes sont entre les "tremblements"). Pour émuler la situation, il forcera la souris à se déplacer aléatoirement pour des 0..X
points dans une direction aléatoire (haut-bas-gauche-bas) et attendra aléatoirement des 0..Y
micro-secondes jusqu'au prochain "tremblement", il X
y a une amplitude de "tremblement" et une Y
fréquence de "tremblement" "
Une autre chose peut être d'adapter le programme à votre système. Le programme est "factice" et ne peut pas détecter la souris par lui-même, il "/dev/input/event4"
est donc codé en dur. Pour réaliser ce qui peut être l'identifiant de votre système, vous pouvez essayer:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Et donc les possibilités sont "event3"
et "event4"
- mais pour votre système qui peut avoir d'autres valeurs. Donc, si cela est différent de celui actuellement utilisé dans le code C, changez simplement la ligne correspondante (donc, ligne avec int fd = open("/dev/input/event4", O_RDWR);
et placez votre appareil à la place de event4
)
Une démo gif pour ce programme (faible taux de trame, malheureusement, donc gardez l'image pas trop grande) ici .
Une petite note (si vous ne savez pas quoi faire avec le code C) - pour compiler le programme ci-dessus, utilisez simplement:
user@host:/path$ gcc -std=gnu99 file.c -o m
où file.c
est le nom de votre fichier de code source C, vous obtiendrez alors l'exécutable, appelé m
dans votre répertoire. Vous aurez probablement besoin d'autorisations pour écrire directement sur le périphérique de la souris, vous pouvez donc utiliser sudo
:
user@host:/path$ sudo ./m
Autre OS
La logique restera la même:
- Trouvez un moyen d'accéder à votre souris
- Ecrire un événement de déplacement de la souris
- Appliquez la randomisation à votre événement
C'est tout. Par exemple, Mac OS a sa propre façon de travailler avec la souris (pas comme Linux, Mac non procfs
plus), c'est bien décrit ici .
Comme conclusion
Ce qui est mieux - javascript ou solutions orientées appareil - dépend de vous, car certaines conditions (comme cross-browser ou cross-OS) peuvent tout décider dans ce cas. Par conséquent, j'ai fourni des directives ainsi qu'un certain exemple de travail sur la façon de l'implémenter au niveau du système d'exploitation. L'avantage ici est que la solution est multi-navigateur, mais en tant que coût, nous avons un programme lié au système d'exploitation.