Sposób bez javascript
Właściwie to lubię rozwiązania, które mogą być oparte na javascript, ponieważ są one bardziej prawdopodobne związane z siecią, a duże szanse są niezależne od systemu operacyjnego. Zastanawiałem się jednak - jak rozwiązać problem ze wszystkimi przeglądarkami, ponieważ rozwiązania javascript w tym przypadku będą trudne do dostosowania dla wszystkich możliwych przeglądarek (nie jestem pewien, czy to w ogóle możliwe).
Jak już wspomniałeś, istnieje inny sposób - tj. Naśladowanie zachowania na poziomie systemu operacyjnego. Ma to również inną zaletę - możesz być pewien, że dla przeglądarki wygląda ona w 100% tak, jak była ludzka (ponieważ cóż, to sterownik wysyła sygnał). Możesz więc używać rozwiązań opartych na sterownikach / urządzeniach z dowolnymi przeglądarkami (lub nawet w sytuacji, gdy javascript jest wyłączony).
Linux
Niestety, włączenie sterownika / urządzenia natychmiast powoduje zależność systemu operacyjnego. Tak więc dla każdego systemu operacyjnego potrzebujesz własnego rozwiązania. W tym poście koncentruję się na rozwiązaniach opartych na systemie Linux (więc będę działał z Linuksem) - i trochę Mac OS. W systemie Linux możliwe jest jawne zapisywanie zdarzeń na urządzeniu, dlatego poniżej znajduje się przykład funkcji z główną pętlą:
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;
}
Mój pełny kod problemu znajduje się tutaj . Program poprosi o amplitudę „drżenia” i jego częstotliwości (a zatem ile czasu w mikrosekundach przypada na „drżenie”). Aby naśladować sytuację, zmusi mysz do losowego przemieszczania się w poszukiwaniu 0..X
punktów w losowym kierunku (góra-dół-lewo-dół) i losowo 0..Y
mikrosekundy czeka do następnego „drżenia”, występuje X
amplituda „drżenia” i Y
częstotliwość „drżenia” „
Inną rzeczą może być dostosowanie programu do twojego systemu. Program jest „obojętny” i nie może sam wykryć myszy, więc "/dev/input/event4"
jest mocno zakodowany. Aby zrozumieć, co może być identyfikatorem twojego systemu, możesz spróbować:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Możliwości są "event3"
i "event4"
- ale dla twojego systemu, który może mieć inne wartości. Jeśli więc różni się od obecnie używanego w kodzie C, po prostu zmień odpowiedni wiersz (więc wstaw int fd = open("/dev/input/event4", O_RDWR);
i umieść urządzenie zamiast event4
)
Demo gif dla tego programu (niska częstotliwość klatek, niestety, więc nie przechowuj zbyt dużego obrazu) tutaj .
Mała uwaga dodatkowa (jeśli nie wiesz, co zrobić z kodem C) - aby skompilować program powyżej, użyj:
user@host:/path$ gcc -std=gnu99 file.c -o m
gdzie file.c
jest nazwa pliku kodu źródłowego C. Otrzymasz plik wykonywalny, wywoływany m
w twoim katalogu. Najprawdopodobniej będziesz potrzebować uprawnień do bezpośredniego zapisu na urządzeniu myszy, więc możesz użyć sudo
:
user@host:/path$ sudo ./m
Inny system operacyjny
Logika pozostanie taka sama:
- Znajdź sposób na dostęp do urządzenia myszy
- Napisz zdarzenie poruszającej się myszy
- Zastosuj randomizację do swojego wydarzenia
Otóż to. Na przykład Mac OS ma swój własny sposób pracy z myszą (nie tak jak Linux, Mac nie ma procfs
tak dobrze), jest dobrze opisany tutaj .
Jako podsumowanie
Co jest lepsze - javascript lub rozwiązania zorientowane na urządzenie - zależy od ciebie, ponieważ pewne warunki (takie jak przeglądarka lub system operacyjny) mogą decydować o wszystkim w tym przypadku. Dlatego podałem wytyczne wraz z pewnym działającym przykładem implementacji tego na poziomie systemu operacyjnego. Korzyścią jest to, że rozwiązaniem jest przeglądarka, ale jako koszt mamy program powiązany z systemem operacyjnym.