import time import random from typing import Optional def generate_fake_performance_timing(base_time: Optional[int] = None) -> dict[str, int]: """ 生成伪造的浏览器性能时间戳数据 Args: base_time: 基准时间戳(毫秒),默认使用当前时间 Returns: dict: 包含所有性能时间戳的字典 """ if base_time is None: base_time = int(time.time() * 1000) # 定义合理的时间间隔范围(毫秒) intervals = { "fetch": random.randint(1, 2), "domain_lookup_start": random.randint(3, 5), "domain_lookup": random.randint(5, 15), "connect": random.randint(50, 150), "ssl_offset": random.randint(30, 50), "request": random.randint(1, 5), "response": random.randint(20, 100), "response_end": random.randint(1, 3), "unload_start": random.randint(1, 3), "unload": random.randint(1, 5), "dom_loading": random.randint(1, 3), "dom_interactive": random.randint(50, 200), "dom_content_loaded": random.randint(1, 3), "load_event": random.randint(0, 5), } timing = {} # 按照时间顺序构建 timing["navigationStart"] = base_time timing["fetchStart"] = timing["navigationStart"] + intervals["fetch"] timing["domainLookupStart"] = ( timing["fetchStart"] + intervals["domain_lookup_start"] ) timing["domainLookupEnd"] = timing["domainLookupStart"] + intervals["domain_lookup"] timing["connectStart"] = timing["domainLookupEnd"] timing["secureConnectionStart"] = timing["connectStart"] + intervals["ssl_offset"] timing["connectEnd"] = timing["connectStart"] + intervals["connect"] timing["requestStart"] = timing["connectEnd"] + intervals["request"] timing["responseStart"] = timing["requestStart"] + intervals["response"] timing["responseEnd"] = timing["responseStart"] + intervals["response_end"] timing["unloadEventStart"] = timing["responseEnd"] + intervals["unload_start"] timing["unloadEventEnd"] = timing["unloadEventStart"] + intervals["unload"] timing["domLoading"] = timing["unloadEventEnd"] + intervals["dom_loading"] timing["domInteractive"] = timing["domLoading"] + intervals["dom_interactive"] timing["domContentLoadedEventStart"] = timing["domInteractive"] timing["domContentLoadedEventEnd"] = ( timing["domInteractive"] + intervals["dom_content_loaded"] ) timing["domComplete"] = timing["domContentLoadedEventEnd"] timing["loadEventStart"] = timing["domComplete"] timing["loadEventEnd"] = timing["loadEventStart"] + intervals["load_event"] # 无重定向的情况 timing["redirectStart"] = 0 timing["redirectEnd"] = 0 return timing def __ease_out_expo(sep): """ 轨迹相关操作 """ if sep == 1: return 1 else: return 1 - pow(2, -10 * sep) def get_slide_track(distance): """ 根据滑动距离生成滑动轨迹 :param distance: 需要滑动的距离 :return: 滑动轨迹: [[x,y,t], ...] x: 已滑动的横向距离 y: 已滑动的纵向距离, 除起点外, 均为0 t: 滑动过程消耗的时间, 单位: 毫秒 """ if not isinstance(distance, int) or distance < 0: raise ValueError( f"distance类型必须是大于等于0的整数: distance: {distance}, type: {type(distance)}" ) # 初始化轨迹列表 slide_track = [ [random.randint(-50, -10), random.randint(-50, -10), 0], [0, 0, 0], ] # 共记录count次滑块位置信息 count = 10 + int(distance / 2) # 初始化滑动时间 t = random.randint(50, 100) # 记录上一次滑动的距离 _x = 0 _y = 0 for i in range(count): # 已滑动的横向距离 x = round(__ease_out_expo(i / count) * distance) # y = round(__ease_out_expo(i / count) * 14) # 滑动过程消耗的时间 t += random.randint(10, 50) if x == _x: continue slide_track.append([x, _y, t]) _x = x slide_track.append(slide_track[-1]) return slide_track, slide_track[-1][2]