mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 09:20:22 +08:00
为每个 ProviderAPIKey 生成并持久化独立的请求指纹配置,涵盖 TLS impersonate profile、浏览器 UA、Stainless SDK 头部、Node/Chrome/Electron 版本等维度。 指纹基于 key ID 确定性生成,支持手动编辑和批量重新生成。 - 新增 fingerprint 模块:生成、加载、校验、懒持久化 - 数据库迁移:provider_api_keys 新增 fingerprint JSON 列 - 请求链路注入:handler 基类设置上下文指纹,request_builder 和 envelope 消费 - HTTP Client 支持动态 impersonate profile 选择 - Antigravity 适配器使用指纹覆盖 UA/session/Node 版本 - 前端移除手动 TLS 指纹开关,新增批量 regenerate_fingerprint 操作 - 号池管理 UI 优化:token 缩写格式、blocked 行样式、时间显示改为日期格式
40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from types import SimpleNamespace
|
|
|
|
from src.services.provider.fingerprint import (
|
|
CHROME_IMPERSONATE_PROFILES,
|
|
ensure_key_fingerprint,
|
|
generate_fingerprint,
|
|
load_fingerprint,
|
|
)
|
|
|
|
|
|
def test_generate_fingerprint_is_deterministic_with_seed() -> None:
|
|
first = generate_fingerprint(seed="key-123")
|
|
second = generate_fingerprint(seed="key-123")
|
|
assert first == second
|
|
|
|
|
|
def test_load_fingerprint_falls_back_for_invalid_impersonate() -> None:
|
|
profile = load_fingerprint({"impersonate": "invalid-profile"}, "key-abc")
|
|
assert profile.impersonate in CHROME_IMPERSONATE_PROFILES
|
|
|
|
|
|
def test_ensure_key_fingerprint_returns_profile_when_missing() -> None:
|
|
key = SimpleNamespace(id="key-xyz", fingerprint=None)
|
|
profile = ensure_key_fingerprint(key, persist_if_missing=False)
|
|
|
|
assert profile.impersonate in CHROME_IMPERSONATE_PROFILES
|
|
# Deterministic: same key_id produces same profile
|
|
profile2 = ensure_key_fingerprint(key, persist_if_missing=False)
|
|
assert profile.impersonate == profile2.impersonate
|
|
|
|
|
|
def test_ensure_key_fingerprint_uses_existing_fingerprint() -> None:
|
|
existing = generate_fingerprint(seed="key-existing")
|
|
key = SimpleNamespace(id="key-existing", fingerprint=existing)
|
|
profile = ensure_key_fingerprint(key, persist_if_missing=False)
|
|
|
|
assert profile.impersonate == existing["impersonate"]
|