Не-JavaScript-способ
На самом деле, мне нравятся решения, которые могут быть основаны на javascript, поскольку они, скорее всего, связаны с сетью, и хорошие шансы - независимость от ОС. Однако я думал о том, как решить вашу проблему для всех браузеров, поскольку решения javascript в этом случае будет трудно настроить для всех возможных браузеров (я не уверен, возможно ли это вообще).
Итак, как вы упомянули, есть другой способ - т.е. эмулировать поведение на уровне ОС. Это также имеет еще одно преимущество - вы можете быть уверены, что для браузера он выглядит на 100% так, как это было с человеком (потому что, ну, это драйвер, который посылает сигнал). Таким образом, вы можете использовать решения на основе драйверов / устройств с любыми браузерами (или даже в ситуации, когда JavaScript отключен).
Linux
К сожалению, привлечение драйвера / устройства немедленно вызывает зависимость ОС. Поэтому для каждой ОС вам понадобится собственное решение. В этом посте я сосредоточен на Linux-решениях (а значит, буду работать с Linux) - и на Mac OS немного. В Linux можно явно записывать события на устройство, поэтому ниже приведен пример функции с основным циклом:
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;
}
Мой полный код проблемы можно найти здесь . Программа запросит амплитуду «тремора» и его частоту (таким образом, сколько времени в микросекундах между «треморами»). Чтобы эмулировать ситуацию, она заставит мышь перемещаться случайным образом для 0..X
точек в произвольном направлении (вверх-вниз-влево-вниз) и ждать случайным 0..Y
микросекундами до следующего «тремора», есть X
амплитуда «тремора» и Y
частота «тремора» "
Другая вещь может быть, чтобы адаптировать программу для вашей системы. Программа "пустышка" и не может самостоятельно определять мышь, поэтому "/dev/input/event4"
она жестко запрограммирована. Чтобы понять, что может быть идентификатором для вашей системы, вы можете попробовать:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
И поэтому возможности "event3"
и "event4"
- но для вашей системы , которые могут иметь другие значения. Так что, если это отличается от того, что в настоящее время используется в коде C, просто измените соответствующую строку (так, строка с int fd = open("/dev/input/event4", O_RDWR);
и поместите ваше устройство вместо event4
)
GIF демо для этой программы (низкая частота кадров, к сожалению, так держать изображение не слишком большой) здесь .
Небольшое примечание (если вы не знаете, что делать с кодом C) - чтобы скомпилировать программу выше, просто используйте:
user@host:/path$ gcc -std=gnu99 file.c -o m
где file.c
- имя вашего файла исходного кода на C, тогда вы получите исполняемый файл, который вызывается из m
вашего каталога. Скорее всего, вам понадобятся разрешения для прямой записи в устройство мыши, поэтому вы можете использовать sudo
:
user@host:/path$ sudo ./m
Другие ОС
Логика останется такой же:
- Найдите способ получить доступ к вашему устройству мыши
- Напишите событие перемещения мыши
- Применить рандомизацию к вашему событию
Вот и все. Например, у Mac OS есть свой собственный способ работы с мышью (не так, как у Linux, а у Mac нет procfs
), это хорошо описано здесь .
В заключение
Что лучше - JavaScript или ориентированные на устройства решения - решать только вам, потому что определенное условие (например, кросс-браузер или кросс-ОС) может решить все в этом случае. Поэтому я предоставил рекомендации вместе с определенным рабочим примером того, как реализовать это на уровне ОС. Преимущество здесь в том, что решение является кросс-браузерным, но в качестве стоимости у нас есть ОС-связанная программа.