快速开始

简介

随着互联网技术的发展,鼠标轨迹识别算法在很多人机交互产品中的需求日益增加, 比如,一些网站为了防止被爬,增加了一些滑块验证码,但是一些软件已经可以模拟人的行为破解滑块验证码。 本项目就是通过对鼠标轨迹的特征分析,判定是否是人的行为还是机器行为。常见应用场景:网站反爬虫、在线考试系统脚本刷题。

Github: https://github.com/itmorn/robot-mouse-track

安装

robot_mouse_track 支持 python 3.5, 3.6, 3.7, 3.8, 3.9.

$ pip install robot_mouse_track

简单使用robot_mouse_track

步骤1: 引入模型

from robot_mouse_track.mouse_track import MouseTrack

步骤2: 创建鼠标轨迹对象

trace_itmorn = [[404, 0, 1655035839721], [409, 11, 1655035839734], [420, 29, 1655035839748], [425, 40, 1655035839761], [436, 59, 1655035839774], [443, 71, 1655035839788], [454, 90, 1655035839801], [458, 98, 1655035839814], [468, 113, 1655035839827], [474, 122, 1655035839841], [480, 131, 1655035839854], [483, 134, 1655035839868], [484, 136, 1655035839881], [484, 137, 1655035840098], [479, 139, 1655035840107], [474, 140, 1655035840121], [467, 142, 1655035840134], [450, 146, 1655035840148], [444, 147, 1655035840161], [427, 149, 1655035840174], [421, 150, 1655035840188], [420, 150, 1655035840201], [420, 151, 1655035840214], [422, 151, 1655035840254], [428, 151, 1655035840268], [440, 151, 1655035840281], [452, 151, 1655035840294], [470, 150, 1655035840308], [479, 150, 1655035840321], [492, 149, 1655035840334], [498, 149, 1655035840348], [508, 149, 1655035840361], [511, 150, 1655035840375], [513, 152, 1655035840388], [513, 153, 1655035840401], [513, 156, 1655035840414], [513, 158, 1655035840428], [513, 159, 1655035840441], [507, 166, 1655035840454], [495, 184, 1655035840468], [481, 209, 1655035840481], [463, 239, 1655035840494], [450, 258, 1655035840508], [433, 283, 1655035840521], [429, 289, 1655035840535], [417, 307, 1655035840548], [407, 324, 1655035840561], [403, 334, 1655035840574], [402, 338, 1655035840588], [402, 346, 1655035840601], [402, 349, 1655035840615], [403, 350, 1655035840628], [405, 352, 1655035840641], [412, 352, 1655035840655], [421, 349, 1655035840668], [435, 343, 1655035840681], [449, 337, 1655035840694], [461, 330, 1655035840708], [472, 326, 1655035840721], [476, 323, 1655035840735], [485, 320, 1655035840749], [490, 319, 1655035840761], [491, 319, 1655035840775], [491, 318, 1655035840824], [491, 317, 1655035840888], [492, 316, 1655035840895], [493, 313, 1655035840908], [498, 301, 1655035840921], [504, 292, 1655035840935], [515, 273, 1655035840949], [523, 260, 1655035840961], [525, 254, 1655035840975], [528, 244, 1655035840988], [529, 241, 1655035841001], [533, 226, 1655035841015], [536, 218, 1655035841028], [536, 215, 1655035841041], [537, 211, 1655035841055], [537, 208, 1655035841068], [537, 205, 1655035841081], [537, 204, 1655035841095], [536, 201, 1655035841108], [536, 200, 1655035841121], [536, 198, 1655035841135], [535, 198, 1655035841175], [537, 198, 1655035841218], [540, 198, 1655035841228], [548, 197, 1655035841242], [556, 197, 1655035841255], [575, 194, 1655035841268], [581, 194, 1655035841281], [593, 191, 1655035841295], [597, 190, 1655035841308], [601, 189, 1655035841322], [602, 189, 1655035841335], [602, 188, 1655035841375], [602, 187, 1655035841388], [602, 186, 1655035841404], [602, 185, 1655035841416], [602, 181, 1655035841429], [600, 177, 1655035841442], [596, 164, 1655035841455], [591, 144, 1655035841468], [590, 140, 1655035841482], [590, 129, 1655035841495], [590, 123, 1655035841508], [589, 117, 1655035841522], [589, 110, 1655035841535], [589, 107, 1655035841548], [589, 102, 1655035841562], [589, 98, 1655035841575], [589, 96, 1655035841588], [589, 94, 1655035841602], [589, 95, 1655035841724], [588, 98, 1655035841735], [588, 100, 1655035841749], [588, 105, 1655035841762], [587, 114, 1655035841775], [587, 115, 1655035841788], [585, 123, 1655035841802], [584, 129, 1655035841815], [583, 133, 1655035841829], [582, 140, 1655035841842], [581, 144, 1655035841855], [580, 153, 1655035841869], [579, 160, 1655035841882], [578, 170, 1655035841895], [578, 174, 1655035841908], [577, 182, 1655035841922], [576, 187, 1655035841935], [575, 196, 1655035841949], [574, 209, 1655035841962], [573, 221, 1655035841975], [573, 229, 1655035841988], [572, 243, 1655035842002], [571, 251, 1655035842016], [570, 267, 1655035842028], [570, 274, 1655035842042], [570, 279, 1655035842055], [570, 282, 1655035842068], [570, 286, 1655035842082], [570, 287, 1655035842095], [570, 291, 1655035842109], [570, 292, 1655035842122], [570, 295, 1655035842135], [570, 297, 1655035842149], [570, 299, 1655035842162], [570, 300, 1655035842175], [572, 302, 1655035842189], [573, 303, 1655035842202], [575, 304, 1655035842215], [582, 305, 1655035842229], [588, 306, 1655035842242], [592, 306, 1655035842255], [603, 306, 1655035842268], [609, 306, 1655035842282], [610, 306, 1655035842296], [611, 306, 1655035842309], [611, 305, 1655035842608], [613, 301, 1655035842616], [619, 292, 1655035842629], [622, 290, 1655035842642], [633, 278, 1655035842655], [637, 273, 1655035842669], [649, 255, 1655035842682], [664, 227, 1655035842696], [668, 217, 1655035842709], [676, 199, 1655035842722], [681, 183, 1655035842735], [682, 178, 1655035842749], [684, 174, 1655035842762], [685, 167, 1655035842775], [685, 165, 1655035842789], [685, 163, 1655035842802], [685, 160, 1655035842816], [685, 159, 1655035842829], [684, 156, 1655035842842], [683, 149, 1655035842855], [683, 147, 1655035842869], [683, 144, 1655035842882], [683, 141, 1655035842897], [683, 140, 1655035842918], [684, 139, 1655035842941], [687, 139, 1655035842963], [692, 145, 1655035842976], [694, 149, 1655035842989], [700, 163, 1655035843002], [705, 186, 1655035843016], [706, 194, 1655035843029], [706, 218, 1655035843043], [706, 227, 1655035843056], [706, 248, 1655035843069], [703, 284, 1655035843083], [700, 297, 1655035843096], [696, 316, 1655035843109], [695, 325, 1655035843122], [694, 327, 1655035843136], [694, 320, 1655035843190], [694, 306, 1655035843203], [696, 285, 1655035843216], [697, 273, 1655035843229], [699, 264, 1655035843243], [701, 237, 1655035843256], [706, 207, 1655035843274], [709, 194, 1655035843288], [711, 184, 1655035843297], [714, 172, 1655035843311], [717, 164, 1655035843322], [718, 162, 1655035843335], [719, 160, 1655035843349], [720, 159, 1655035843362], [721, 159, 1655035843375], [722, 159, 1655035843388], [724, 159, 1655035843402], [725, 159, 1655035843415], [729, 161, 1655035843429], [733, 172, 1655035843442], [735, 182, 1655035843455], [736, 197, 1655035843468], [736, 225, 1655035843482], [736, 242, 1655035843495], [736, 258, 1655035843510], [736, 266, 1655035843523], [736, 285, 1655035843536], [736, 303, 1655035843550], [736, 310, 1655035843563], [736, 315, 1655035843576], [736, 316, 1655035843589], [736, 315, 1655035843616], [736, 313, 1655035843630], [736, 298, 1655035843643], [738, 265, 1655035843656], [740, 239, 1655035843669], [742, 227, 1655035843683], [748, 205, 1655035843696], [750, 196, 1655035843709], [754, 185, 1655035843723], [755, 177, 1655035843736], [757, 167, 1655035843749], [759, 163, 1655035843763], [762, 157, 1655035843777], [764, 154, 1655035843789], [768, 151, 1655035843803], [772, 148, 1655035843817], [774, 146, 1655035843829], [775, 146, 1655035843843], [776, 146, 1655035843856], [778, 146, 1655035843869], [780, 146, 1655035843883], [781, 146, 1655035843896], [785, 147, 1655035843910], [788, 149, 1655035843923], [792, 154, 1655035843936], [797, 159, 1655035843949], [800, 163, 1655035843963], [801, 165, 1655035843976], [805, 170, 1655035843990], [807, 174, 1655035844003], [808, 179, 1655035844016], [809, 190, 1655035844029], [810, 194, 1655035844043], [810, 198, 1655035844056], [810, 207, 1655035844070], [811, 217, 1655035844083], [811, 226, 1655035844096], [811, 234, 1655035844109], [811, 239, 1655035844123], [810, 247, 1655035844136], [809, 253, 1655035844150], [809, 262, 1655035844163], [807, 270, 1655035844178], [807, 274, 1655035844190], [807, 281, 1655035844205], [807, 289, 1655035844218], [807, 292, 1655035844230], [807, 295, 1655035844243], [808, 299, 1655035844256], [808, 300, 1655035844270], [808, 299, 1655035844369], [807, 295, 1655035844390], [806, 294, 1655035844404], [812, 289, 1655035844750], [820, 284, 1655035844763], [820, 283, 1655035844777], [821, 283, 1655035844790], [822, 283, 1655035844803], [824, 283, 1655035844818], [824, 284, 1655035844857], [829, 286, 1655035844871], [835, 289, 1655035844883], [847, 289, 1655035844898], [866, 288, 1655035844910], [878, 285, 1655035844923], [897, 276, 1655035844937], [910, 264, 1655035844950], [921, 248, 1655035844963], [927, 238, 1655035844976], [941, 206, 1655035844990], [946, 193, 1655035845003], [949, 185, 1655035845017], [953, 171, 1655035845031], [955, 158, 1655035845043], [955, 148, 1655035845057], [955, 143, 1655035845070], [954, 142, 1655035845083], [951, 141, 1655035845098], [946, 140, 1655035845110], [943, 140, 1655035845124], [938, 140, 1655035845137], [929, 146, 1655035845150], [924, 150, 1655035845163], [920, 157, 1655035845177], [916, 171, 1655035845190], [915, 182, 1655035845204], [915, 212, 1655035845217], [915, 222, 1655035845231], [916, 244, 1655035845245], [919, 263, 1655035845257], [924, 275, 1655035845270], [927, 279, 1655035845283], [930, 282, 1655035845298], [940, 285, 1655035845312], [951, 285, 1655035845323], [963, 283, 1655035845337], [969, 280, 1655035845351], [983, 271, 1655035845364], [993, 263, 1655035845377], [999, 257, 1655035845390], [1005, 247, 1655035845403], [1012, 228, 1655035845417], [1012, 222, 1655035845431], [1014, 200, 1655035845445], [1014, 181, 1655035845462], [1014, 167, 1655035845472], [1013, 161, 1655035845484], [1011, 156, 1655035845498], [1008, 150, 1655035845511], [1003, 145, 1655035845524], [999, 143, 1655035845537], [994, 143, 1655035845550], [987, 142, 1655035845564], [982, 141, 1655035845578], [965, 140, 1655035845590], [953, 140, 1655035845604], [947, 140, 1655035845620], [941, 140, 1655035845632], [939, 140, 1655035845647], [937, 141, 1655035845658], [936, 143, 1655035845688], [936, 144, 1655035845709], [936, 145, 1655035845917], [940, 147, 1655035845989], [949, 150, 1655035846007], [952, 150, 1655035846018], [968, 155, 1655035846030], [978, 158, 1655035846046], [985, 159, 1655035846058], [996, 160, 1655035846070], [1014, 162, 1655035846084], [1021, 162, 1655035846097], [1033, 162, 1655035846112], [1042, 162, 1655035846124], [1059, 162, 1655035846137], [1069, 162, 1655035846151], [1083, 159, 1655035846164], [1086, 157, 1655035846178], [1088, 156, 1655035846191], [1089, 154, 1655035846204], [1090, 151, 1655035846217], [1090, 150, 1655035846232], [1090, 147, 1655035846245], [1090, 145, 1655035846257], [1090, 142, 1655035846271], [1087, 140, 1655035846310], [1086, 139, 1655035846322], [1087, 139, 1655035846383], [1088, 141, 1655035846393], [1089, 146, 1655035846405], [1092, 157, 1655035846418], [1093, 165, 1655035846432], [1095, 185, 1655035846445], [1099, 204, 1655035846457], [1100, 213, 1655035846471], [1103, 238, 1655035846484], [1103, 246, 1655035846498], [1103, 272, 1655035846511], [1103, 290, 1655035846525], [1103, 294, 1655035846538], [1103, 291, 1655035846591], [1103, 284, 1655035846604], [1103, 279, 1655035846618], [1103, 274, 1655035846632], [1105, 254, 1655035846647], [1110, 221, 1655035846664], [1116, 190, 1655035846681], [1119, 174, 1655035846696], [1124, 163, 1655035846716], [1129, 155, 1655035846730], [1134, 151, 1655035846744], [1141, 149, 1655035846757], [1153, 149, 1655035846770], [1169, 149, 1655035846790], [1182, 150, 1655035846807], [1192, 151, 1655035846819], [1196, 152, 1655035846830], [1198, 153, 1655035846843], [1199, 153, 1655035847148], [1207, 152, 1655035847164], [1210, 152, 1655035847179], [1218, 151, 1655035847193], [1223, 150, 1655035847205], [1231, 146, 1655035847218], [1233, 145, 1655035847231], [1235, 142, 1655035847245], [1235, 141, 1655035847258], [1235, 137, 1655035847271], [1235, 136, 1655035847284], [1235, 134, 1655035847299], [1235, 132, 1655035847313], [1235, 131, 1655035847324], [1235, 130, 1655035847351], [1235, 129, 1655035847365], [1237, 129, 1655035847398], [1238, 130, 1655035847410], [1241, 134, 1655035847423], [1244, 139, 1655035847436], [1251, 150, 1655035847450], [1258, 159, 1655035847462], [1261, 163, 1655035847474], [1266, 170, 1655035847487], [1272, 185, 1655035847501], [1277, 214, 1655035847514], [1277, 226, 1655035847527], [1277, 246, 1655035847539], [1274, 256, 1655035847551], [1268, 271, 1655035847565], [1260, 282, 1655035847579], [1256, 287, 1655035847593], [1254, 288, 1655035847606], [1254, 287, 1655035847641], [1254, 279, 1655035847654], [1254, 265, 1655035847666], [1256, 252, 1655035847681], [1259, 236, 1655035847694], [1263, 219, 1655035847712], [1270, 201, 1655035847725], [1274, 191, 1655035847738], [1278, 178, 1655035847755], [1280, 172, 1655035847769], [1283, 163, 1655035847783], [1284, 158, 1655035847797], [1285, 157, 1655035847810], [1285, 156, 1655035847823], [1286, 154, 1655035847836], [1287, 153, 1655035847850], [1287, 152, 1655035847871], [1288, 152, 1655035847886], [1289, 151, 1655035847899], [1290, 151, 1655035847917], [1291, 151, 1655035847930], [1292, 151, 1655035847952], [1296, 151, 1655035847968], [1301, 155, 1655035847982], [1304, 156, 1655035847996], [1309, 159, 1655035848008], [1312, 160, 1655035848022], [1314, 162, 1655035848038], [1315, 167, 1655035848052], [1316, 171, 1655035848066], [1317, 180, 1655035848080], [1318, 192, 1655035848095], [1319, 201, 1655035848110], [1319, 209, 1655035848125], [1320, 215, 1655035848138], [1321, 225, 1655035848152], [1321, 241, 1655035848178], [1321, 249, 1655035848192], [1320, 259, 1655035848205], [1320, 262, 1655035848218], [1320, 269, 1655035848232], [1320, 275, 1655035848249], [1321, 281, 1655035848264], [1323, 285, 1655035848279], [1324, 286, 1655035848292], [1327, 288, 1655035848306], [1336, 291, 1655035848321], [1347, 292, 1655035848338], [1358, 292, 1655035848352], [1366, 291, 1655035848366], [1371, 289, 1655035848379], [1376, 286, 1655035848393], [1377, 285, 1655035848409], [1378, 285, 1655035848729], [1379, 285, 1655035848752], [1380, 285, 1655035848767], [1381, 285, 1655035848782], [1378, 286, 1655035848955], [1359, 297, 1655035848970], [1337, 307, 1655035848983], [1291, 324, 1655035848996], [1231, 347, 1655035849011], [1198, 360, 1655035849026], [1091, 408, 1655035849041], [969, 450, 1655035849055], [830, 488, 1655035849068], [696, 518, 1655035849084], [601, 539, 1655035849100], [545, 551, 1655035849115], [468, 567, 1655035849129], [408, 581, 1655035849143], [363, 592, 1655035849159], [336, 601, 1655035849179], [329, 604, 1655035849193], [319, 613, 1655035849209], [304, 630, 1655035849231], [293, 639, 1655035849246], [283, 646, 1655035849260], [265, 655, 1655035849274], [238, 669, 1655035849290], [223, 676, 1655035849306], [205, 683, 1655035849321], [194, 688, 1655035849336], [185, 693, 1655035849352], [168, 698, 1655035849372], [162, 699, 1655035849386], [153, 700, 1655035849400], [140, 701, 1655035849411], [122, 703, 1655035849421], [112, 704, 1655035849431], [106, 704, 1655035849445], [93, 706, 1655035849459], [81, 706, 1655035849475], [69, 709, 1655035849493], [58, 710, 1655035849509], [47, 710, 1655035849525], [43, 710, 1655035849542], [39, 710, 1655035849559], [38, 710, 1655035849573], [37, 710, 1655035849588], [36, 710, 1655035849606], [35, 711, 1655035849621], [32, 714, 1655035849639], [27, 717, 1655035849654], [23, 719, 1655035849669], [21, 721, 1655035849683], [21, 723, 1655035849700]]
mouse_track = MouseTrack(trace_itmorn)

trace_example,表示鼠标轨迹的序列;其中,每一项为[坐标x,坐标y,时间戳t]

步骤3: 可视化观察轨迹

mouse_track.show_track()

_images/trace_itmorn.png

其对应的收集客户端为浏览器,下图展示了用户鼠标浏览器上移动的轨迹 _images/trace_itmorn_browser.png 如果你想为自己的客户端添加收集鼠标轨迹的JavaScript代码, 可以参考鼠标轨迹数据的收集

步骤4: 添加要检测的机器行为类型

这里我们以检测鼠标移动速度和加速度过大(直观感觉就是鼠标在跳动)为例

rule_mouse_jump = JumpMotion(th_velocity=20, th_acceleration=1.4)

其中,th_velocity为速度阈值(单位是px/ms),经过评测,一般用户移动鼠标的速度不会超过该值; th_accelerationth_velocity为加速度阈值,经过评测,一般用户移动鼠标的加速度不会超过该值 更多的机器行为可以参考 机器行为类

步骤5: 计算风险值

flag, (exceed_times_velocity, exceed_times_acceleration) = rule_mouse_jump.judge_risk(mouse_track)
>>> False 0.5542333048572756 0.25969806234590154

flag表示是否触发风险;exceed_times_velocity 表示速度触发风险等级,越高表示风险越高; exceed_times_acceleration 表示加速度触发风险等级,越高表示风险越高

用户可以根据这两个风险等级,根据自身业务需求,调整计算风险的权重。

trace_itmorn是一段真实的鼠标轨迹;下面我们使用selenium操作浏览器,产生一段机器轨迹, 观察程序的识别效果 产生该轨迹的脚本为: use_selenium_jump.py

在浏览器上留下的轨迹只能看到一点点

_images/selenium_jump_browser.png

后端程序收集到轨迹为

_images/selenium_jump.png

接着,使用程序对该轨迹进行判定:

trace_selenium_jump = [[6, 83, 1655038106398], [6, 240, 1655038107474], [6, 376, 1655038108650], [285, 601, 1655038109698], [305, 601, 1655038110224], [325, 601, 1655038110738], [345, 601, 1655038111263], [365, 601, 1655038111782], [385, 601, 1655038112307], [405, 601, 1655038112831], [425, 601, 1655038113342], [445, 601, 1655038113884], [465, 601, 1655038114396], [485, 601, 1655038114921], [505, 601, 1655038115453], [525, 601, 1655038115973], [545, 601, 1655038116500], [565, 601, 1655038117035], [585, 601, 1655038117566], [605, 601, 1655038118095], [625, 601, 1655038118635], [645, 601, 1655038119177], [15, 721, 1655038120794]]
mouse_track = MouseTrack(trace_selenium_jump)
mouse_track.show_track()
rule_mouse_jump = JumpMotion(th_velocity=20, th_acceleration=1.4)
flag, (exceed_times_velocity, exceed_times_acceleration) = rule_mouse_jump.judge_risk(mouse_track)
print(flag,exceed_times_velocity,exceed_times_acceleration)
>>> True 1.603316874482396 1.1095120532017115

可以看出,flag表明触发了风险,速度和加速度权值也都大于1.0。