วิธีที่ไม่ใช่จาวาสคริปต์
ที่จริงแล้วฉันชอบวิธีแก้ปัญหาซึ่งอาจเป็นไปตามจาวาสคริปต์เนื่องจากมีความเกี่ยวข้องกับเว็บมากขึ้นและมีโอกาสที่ดี - ระบบปฏิบัติการอิสระ อย่างไรก็ตามฉันคิดว่าจะแก้ไขปัญหาของคุณสำหรับเบราว์เซอร์ทั้งหมดได้อย่างไรเนื่องจากในกรณีนี้โซลูชัน javascript จะปรับได้ยากสำหรับเบราว์เซอร์ที่เป็นไปได้ทั้งหมด (ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่)
ดังที่คุณได้กล่าวมามีวิธีอื่น - นั่นคือเพื่อเลียนแบบพฤติกรรมในระดับระบบปฏิบัติการ นี่ก็มีข้อดีอีกอย่างเช่นกัน - คุณอาจมั่นใจได้ว่าเบราว์เซอร์นั้นดูเหมือนมนุษย์ 100% (เพราะเป็นคนขับที่กำลังส่งสัญญาณ) ดังนั้นคุณอาจใช้โซลูชันที่ใช้ไดรเวอร์ / อุปกรณ์กับเบราว์เซอร์ใด ๆ (หรือแม้กระทั่งในสถานการณ์เมื่อปิดการใช้งานจาวาสคริปต์)
ลินุกซ์
น่าเสียดายที่การเกี่ยวข้องกับไดรเวอร์ / อุปกรณ์ทำให้การพึ่งพาระบบปฏิบัติการเกิดขึ้นทันที ดังนั้นสำหรับแต่ละระบบปฏิบัติการคุณจะต้องมีโซลูชันของตัวเอง ในโพสต์นี้ฉันมุ่งเน้นโซลูชันที่ใช้ 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 หรืออุปกรณ์ที่มุ่งเน้น - ขึ้นอยู่กับคุณเพราะเงื่อนไขบางอย่าง (เช่น cross-browser หรือ cross-OS) อาจเป็นตัวตัดสินทุกอย่างในกรณีนี้ ดังนั้นฉันจึงได้ให้แนวทางพร้อมกับตัวอย่างการทำงานบางอย่างเกี่ยวกับวิธีการนำไปใช้ในระดับ OS ประโยชน์ที่นี่คือโซลูชันนั้นข้ามเบราว์เซอร์ แต่เป็นค่าใช้จ่ายที่เรามีโปรแกรม OS ผูกมัด