Не-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"
- але для вашої системи, які можуть мати інші значення. Отже, якщо це відрізняється від використовуваного в даний час у коді С, просто змініть відповідний рядок (так, рядок int fd = open("/dev/input/event4", O_RDWR);
і розмістіть свій пристрій замість event4
)
Демонстраційна версія для цієї програми (низька частота кадрів, на жаль, тому зберігайте зображення не надто великі) тут .
Маленька бічна примітка (якщо ви не знаєте, що робити з кодом C) - для компіляції програми вище, просто використовуйте:
user@host:/path$ gcc -std=gnu99 file.c -o m
де file.c
назва вашого файлу вихідного коду С, тоді ви отримаєте виконуваний файл, названий m
у вашому каталозі. Швидше за все, вам знадобляться дозволи для прямого запису в пристрій миші, тож ви можете використовувати sudo
:
user@host:/path$ sudo ./m
Інші ОС
Логіка залишиться такою ж:
- Знайдіть спосіб отримати доступ до пристрою миші
- Написати подію переміщення миші
- Застосуйте рандомізацію до своєї події
Це воно. Наприклад, Mac OS має свій власний шлях до роботи з мишею (не як Linux, Mac має не procfs
так), це добре описано тут .
Як висновок
Що краще - JavaScript або орієнтовані на пристрої рішення - вирішувати тільки вам, оскільки певна умова (наприклад, крос-браузер або крос-ОС) може вирішити все в цьому випадку. Тому я надав рекомендації разом із певним робочим прикладом того, як це реалізувати на рівні ОС. Перевага тут полягає в тому, що рішення є перехресним браузером, але як вартість ми маємо програму, пов’язану з ОС.