type: 收敛测试 schemas 与协议层类型

This commit is contained in:
yml2213
2026-08-30 20:35:08 +08:00
parent 92dc461e52
commit c891ac982e
26 changed files with 1846 additions and 882 deletions
+66 -71
View File
@@ -4,7 +4,9 @@ from typing import Any, Optional
# 生成类人的鼠标轨迹
def generate_realistic_trajectory(start_x:int, start_y:int, end_x:int, end_y:int, start_time:int) -> list[Any]:
def generate_realistic_trajectory(
start_x: int, start_y: int, end_x: int, end_y: int, start_time: int
) -> list[Any]:
"""生成类人的鼠标轨迹"""
trajectory = []
@@ -41,70 +43,56 @@ def generate_realistic_trajectory(start_x:int, start_y:int, end_x:int, end_y:int
# 随机时间间隔(3-25ms,符合人类反应)
time_delta = random.choices(
[3, 4, 5, 6, 7, 8, 10, 12, 15, 20, 24],
weights=[5, 8, 10, 12, 10, 8, 5, 3, 2, 1, 1]
weights=[5, 8, 10, 12, 10, 8, 5, 3, 2, 1, 1],
)[0]
current_time += time_delta
trajectory.append([
"move",
current_x,
current_y,
current_time,
"pointermove"
])
trajectory.append(["move", current_x, current_y, current_time, "pointermove"])
# 偶尔在同一位置停留(模拟视觉确认)
if random.random() < 0.15:
trajectory.append([
"move",
current_x,
current_y,
current_time + random.randint(5, 15),
"pointermove"
])
trajectory.append(
[
"move",
current_x,
current_y,
current_time + random.randint(5, 15),
"pointermove",
]
)
current_time += random.randint(5, 15)
# 到达目标后的悬停
hover_time = random.randint(50, 150)
for _ in range(random.randint(2, 5)):
current_time += random.randint(8, 25)
trajectory.append([
"move",
end_x + random.randint(-1, 1),
end_y + random.randint(-1, 1),
current_time,
"pointermove"
])
trajectory.append(
[
"move",
end_x + random.randint(-1, 1),
end_y + random.randint(-1, 1),
current_time,
"pointermove",
]
)
current_time += hover_time
# 点击事件
trajectory.append([
"down",
end_x,
end_y,
current_time,
"pointerdown"
])
trajectory.append(["down", end_x, end_y, current_time, "pointerdown"])
trajectory.append([
"focus",
current_time + 1
])
trajectory.append(["focus", current_time + 1])
click_duration = random.randint(80, 130)
trajectory.append([
"up",
end_x,
end_y,
current_time + click_duration,
"pointerup"
])
trajectory.append(["up", end_x, end_y, current_time + click_duration, "pointerup"])
return trajectory
# 处理原始轨迹数组
def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None) -> dict[str,Any]:
def process_mouse_trajectory(
events: list[Any], max_records: Optional[int] = None
) -> dict[str, Any]:
"""
处理鼠标/触摸轨迹数据,将绝对坐标转换为相对坐标和时间差
@@ -116,7 +104,7 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
处理后的事件列表
"""
if not events or len(events) == 0:
return []
return {"data": [], "first_event": None, "last_event": None, "total_events": 0}
# 初始化变量
prev_x = 0 # 上一个X坐标
@@ -130,8 +118,17 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
MOVE_EVENTS = ["move", "mousemove", "touchmove", "pointermove"]
# 点击类事件(仅时间信息)
CLICK_EVENTS = ["down", "up", "click", "mousedown", "mouseup",
"touchstart", "touchend", "pointerdown", "pointerup"]
CLICK_EVENTS = [
"down",
"up",
"click",
"mousedown",
"mouseup",
"touchstart",
"touchend",
"pointerdown",
"pointerup",
]
# 特殊事件(仅时间信息)
TIME_ONLY_EVENTS = ["focus", "blur", "keydown", "keyup"]
@@ -168,11 +165,7 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
time_diff = timestamp - prev_time
# 添加到结果数组
result.append([
event_type,
[delta_x, delta_y],
time_diff
])
result.append([event_type, [delta_x, delta_y], time_diff])
# 更新上一次的值
prev_x = x
@@ -190,11 +183,7 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
time_diff = timestamp - prev_time
# 添加到结果数组(坐标差为[0,0])
result.append([
event_type,
[0, 0],
time_diff
])
result.append([event_type, [0, 0], time_diff])
prev_time = timestamp
@@ -209,10 +198,7 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
time_diff = timestamp - prev_time
# 添加到结果数组(仅包含时间差)
result.append([
event_type,
time_diff
])
result.append([event_type, time_diff])
prev_time = timestamp
@@ -220,10 +206,11 @@ def process_mouse_trajectory(events:list[Any], max_records: Optional[int] = None
"data": result,
"first_event": first_event,
"last_event": last_event,
"total_events": len(result)
"total_events": len(result),
}
def compress_trajectory(e:list[Any]) -> str:
def compress_trajectory(e: list[Any]) -> str:
"""
压缩轨迹数据的完整实现
@@ -242,7 +229,7 @@ def compress_trajectory(e:list[Any]) -> str:
"focus": 4,
"blur": 5,
"unload": 6,
"unknown": 7
"unknown": 7,
}
def h(e, t):
@@ -434,11 +421,13 @@ def compress_trajectory(e:list[Any]) -> str:
"""Base64编码"""
t = ""
n = len(e) // 6
base64_chars = "()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"
base64_chars = (
"()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"
)
for r in range(n):
# 每次取6位二进制
binary_str = e[6 * r: 6 * (r + 1)]
binary_str = e[6 * r : 6 * (r + 1)]
index = int(binary_str, 2)
t += base64_chars[index]
@@ -446,9 +435,12 @@ def compress_trajectory(e:list[Any]) -> str:
return u(c_str)
class TrajectoryEncoder:
def __init__(self) -> None:
self.CHARSET = "()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqr"
self.CHARSET = (
"()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqr"
)
self.BASE = len(self.CHARSET) # 64
self.DIRECTION_CHARS = "stuvwxyz~"
self.DIRECTION_PATTERNS = [
@@ -460,7 +452,7 @@ class TrajectoryEncoder:
[0, -1], # x
[3, 0], # y
[2, -1], # z
[2, 1] # ~
[2, 1], # ~
]
def encode_number(self, num):
@@ -546,9 +538,11 @@ class TrajectoryEncoder:
t_encoded.append(self.encode_number(dt))
# 拼接:x坐标 !! y坐标 !! 时间戳
return "".join(x_encoded) + "!!" + "".join(y_encoded) + "!!" + "".join(t_encoded)
return (
"".join(x_encoded) + "!!" + "".join(y_encoded) + "!!" + "".join(t_encoded)
)
def encrypt_string(self,e, t, n):
def encrypt_string(self, e, t, n):
"""
JS加密函数的Python实现
@@ -568,7 +562,7 @@ class TrajectoryEncoder:
# 每次读取2个字符(十六进制)
while o < len(n):
r = n[o:o + 2] # 取2个字符
r = n[o : o + 2] # 取2个字符
if len(r) < 2:
break
o += 2
@@ -587,7 +581,8 @@ class TrajectoryEncoder:
return i
def H(t:int, e:str) -> str:
def H(t: int, e: str) -> str:
# 解析后缀
n = e[-2:]
r = []
@@ -625,4 +620,4 @@ def H(t:int, e:str) -> str:
g.pop(d)
d -= 1
return p
return p