Méthode sans javascript
En fait, je préfère les solutions qui peuvent être basées sur le javascript, car elles sont plus susceptibles d'être liées au web, et il y a de bonnes chances qu'elles soient indépendantes du système d'exploitation. Cependant, j'ai réfléchi à la manière de résoudre votre problème pour tous les navigateurs, puisque les solutions javascript, dans ce cas, seront difficiles à adapter à tous les navigateurs possibles (je ne suis pas sûr que ce soit possible du tout).
Donc, comme vous l'avez mentionné, il y a une autre solution - c'est-à-dire émuler le comportement au niveau du système d'exploitation. Cela présente également un autre avantage : vous pouvez être sûr que pour le navigateur, le comportement est 100% identique à celui de l'homme (car c'est le pilote qui envoie le signal). Vous pouvez donc utiliser des solutions basées sur le pilote ou le dispositif avec n'importe quel navigateur (ou même lorsque javascript est désactivé).
Linux
Malheureusement, l'implication d'un pilote/dispositif entraîne immédiatement une dépendance du système d'exploitation. Ainsi, pour chaque système d'exploitation, vous aurez besoin de votre propre solution. Dans ce billet, je me concentre sur une solution basée sur Linux (donc, qui fonctionnera avec Linux) - et un peu sur Mac OS. Avec Linux, il est possible d'écrire des événements sur le périphérique explicitement, donc ci-dessous un exemple de fonction avec une 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;
}
Mi code complet pour que la question soit trouvée aquí . Le programme demandera l'amplitude du "tremblement" et sa fréquence (c'est-à-dire le nombre de microsecondes entre les "tremblements"). Pour simuler la situation, il va forcer la souris à se déplacer de façon aléatoire pour 0..X
points dans une direction aléatoire (haut-bas-gauche-bas) et attendre de façon aléatoire. 0..Y
micro-secondes jusqu'au prochain "tremblement", il y a X
est l'amplitude du "tremblement" et Y
est la fréquence du "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, donc il faut l'adapter à votre système. "/dev/input/event4"
est codée en dur. Pour réaliser ce qui peut être un identifiant pour 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"
y "event4"
- mais pour votre système cela peut avoir d'autres valeurs. Donc, si cela est différent de ce qui est actuellement utilisé dans le code C, il suffit de changer la ligne correspondante (ainsi, la ligne avec int fd = open("/dev/input/event4", O_RDWR);
et placez votre appareil à la place de event4
)
Une démo en gif pour ce programme (la fréquence d'images est faible, malheureusement, donc l'image ne doit pas être trop grande). aquí .
Une petite note complémentaire (si vous ne savez pas quoi faire avec du code C) - pour compiler le programme ci-dessus, il suffit d'utiliser :
user@host:/path$ gcc -std=gnu99 file.c -o m
où file.c
est le nom de votre fichier de code source C, alors vous obtiendrez un exécutable, appelé m
dans votre répertoire. Le plus souvent, vous aurez besoin de permissions pour écrire directement dans le périphérique de la souris, donc vous pouvez utiliser sudo
:
user@host:/path$ sudo ./m
Autres OS
La logique restera la même :
- Trouvez un moyen d'accéder au périphérique de votre souris
- Écriture de l'événement de déplacement de la souris
- Appliquer la randomisation à votre événement
C'est tout. Par exemple, Mac OS a sa propre façon de travailler avec la souris (contrairement à Linux, Mac n'a pas d'interface avec la souris). procfs
également), il est bien décrit aquí .
En guise de conclusion
C'est à vous de décider ce qui est le mieux - javascript ou des solutions orientées vers les dispositifs - car certaines conditions (comme le croisement des navigateurs ou des systèmes d'exploitation) peuvent tout décider dans ce cas. Par conséquent, j'ai fourni des lignes directrices ainsi que certains exemples de travail sur la façon de mettre en œuvre cette solution au niveau du système d'exploitation. L'avantage ici est que la solution est multi-navigateurs, mais le prix à payer est un programme lié au système d'exploitation.