非JavaScript方式
实际上,我喜欢可能基于javascript的解决方案,因为它们更可能与Web相关,并且很可能与OS无关。但是,我当时正在考虑-如何解决所有浏览器的问题,因为在这种情况下,很难针对所有可能的浏览器调整javascript解决方案(我不确定是否可能)。
因此,正如您所提到的,还有另一种方法-即在OS级别上模拟行为。这也有另一个优势-您可以确定,对于浏览器,它看起来像是人类的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或面向设备的解决方案)由您决定,因为在这种情况下,某些条件(例如跨浏览器或跨OS)可能会决定一切。因此,我提供了指导方针以及如何在OS级别上实现该目标的某些工作示例。这样做的好处是解决方案是跨浏览器的,但是作为代价,我们有OS绑定程序。