Cách không javascript
Trên thực tế, tôi thích các giải pháp, có thể dựa trên javascript, vì chúng có nhiều khả năng liên quan đến web và cơ hội tốt là - độc lập với hệ điều hành. Tuy nhiên, tôi đã suy nghĩ về - cách giải quyết vấn đề của bạn cho tất cả các trình duyệt, vì các giải pháp javascript, trong trường hợp này, sẽ khó điều chỉnh cho tất cả các trình duyệt có thể (tôi không chắc là có thể không).
Vì vậy, như bạn đã đề cập, có một cách khác - tức là mô phỏng hành vi ở cấp độ HĐH. Điều này cũng có một lợi thế khác - bạn có thể chắc chắn rằng đối với trình duyệt, nó trông giống 100% như con người (bởi vì, đó là trình điều khiển đang gửi tín hiệu). Vì vậy, bạn có thể sử dụng các giải pháp dựa trên trình điều khiển / thiết bị với bất kỳ trình duyệt nào (hoặc thậm chí trong tình huống, khi javascript bị tắt).
Linux
Thật không may, liên quan đến trình điều khiển / thiết bị ngay lập tức gây ra sự phụ thuộc hệ điều hành. Vì vậy, đối với mỗi hệ điều hành, bạn sẽ cần giải pháp riêng. Trong bài đăng này, tôi tập trung vào giải pháp dựa trên Linux (vì vậy, sẽ hoạt động với Linux) - và Mac OS một chút. Với Linux, bạn có thể viết các sự kiện vào thiết bị một cách rõ ràng, vì vậy bên dưới là mẫu hàm với vòng lặp chính:
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ã đầy đủ của tôi cho vấn đề được tìm thấy ở đây . Chương trình sẽ yêu cầu biên độ của "rung" và tần số của nó (do đó, bao nhiêu thời gian tính bằng micro giây nằm giữa "rung"). Để mô phỏng tình huống, nó sẽ buộc chuột di chuyển ngẫu nhiên cho 0..X
các điểm theo hướng ngẫu nhiên (lên xuống dưới bên trái) và đợi ngẫu nhiên 0..Y
micro giây cho đến khi "rung" tiếp theo, có X
biên độ "rung" và Y
là tần số của "rung" "
Một điều khác có thể là để điều chỉnh chương trình cho hệ thống của bạn. Chương trình này là "giả" và không thể tự phát hiện chuột, do đó, "/dev/input/event4"
được mã hóa cứng. Để nhận ra những gì có thể là định danh cho hệ thống của bạn, bạn có thể thử:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Và vì vậy, các khả năng là "event3"
và "event4"
- nhưng đối với hệ thống của bạn có thể có các giá trị khác. Vì vậy, nếu điều đó khác với hiện đang được sử dụng trong mã C, chỉ cần thay đổi dòng tương ứng (vì vậy, dòng int fd = open("/dev/input/event4", O_RDWR);
và đặt thiết bị của bạn thay vì event4
)
Một bản demo gif cho chương trình này (tốc độ khung hình thấp, thật không may, vì vậy hãy giữ hình ảnh không quá lớn) ở đây .
Một lưu ý nhỏ (nếu bạn không biết phải làm gì với mã C) - để biên dịch chương trình ở trên, chỉ cần sử dụng:
user@host:/path$ gcc -std=gnu99 file.c -o m
nơi file.c
là tên của tập tin mã nguồn C của bạn, sau đó bạn sẽ nhận được thực thi, gọi là m
trong thư mục của bạn. Rất có thể bạn sẽ cần quyền để ghi trực tiếp vào thiết bị chuột, vì vậy bạn có thể sử dụng sudo
:
user@host:/path$ sudo ./m
Hệ điều hành khác
Logic sẽ vẫn như cũ:
- Tìm cách truy cập thiết bị chuột của bạn
- Viết sự kiện chuột di chuyển
- Áp dụng ngẫu nhiên cho sự kiện của bạn
Đó là nó. Chẳng hạn, Mac OS có cách riêng để làm việc với chuột (không giống như Linux, Mac procfs
cũng vậy), nó được mô tả kỹ ở đây .
Là một kết luận
Điều gì là tốt hơn - giải pháp javascript hoặc định hướng thiết bị - tùy thuộc vào bạn, bởi vì điều kiện nhất định (như trình duyệt chéo hoặc hệ điều hành chéo) có thể quyết định mọi thứ trong trường hợp này. Do đó, tôi đã cung cấp các hướng dẫn cùng với ví dụ hoạt động nhất định về cách triển khai điều đó ở cấp độ HĐH. Lợi ích ở đây là giải pháp đó là trình duyệt chéo, nhưng với chi phí chúng tôi có chương trình liên kết với hệ điều hành.