151 lines
5.2 KiB
Python
151 lines
5.2 KiB
Python
"""虎牙网页 Cookie 字段生成器测试。"""
|
|
|
|
from core.huya.web_cookie_fields import (
|
|
_qimei_feature_string,
|
|
_qimei_uuid42_generate,
|
|
_x64hash128,
|
|
cookie_fields,
|
|
fill_web_cookie_fields,
|
|
missing_web_cookie_fields,
|
|
qimei_feature_from_device_profile,
|
|
qimei_fingerprint_generate,
|
|
)
|
|
|
|
|
|
def test_qimei_hash_matches_sdk_vectors():
|
|
assert _x64hash128("", 31) == "24700f9f1986800ab4fcc880530dd0ed"
|
|
assert _x64hash128("a", 31) == "f8b09930c1df727ef75677a1d6ae5bd6"
|
|
assert _x64hash128("abc", 31) == "31844fd43df93041e52bcddd13312671"
|
|
|
|
|
|
def test_qimei_fingerprint_uses_sdk_feature_string():
|
|
feature = {
|
|
"screen": {"resolution": "800x600", "availResolution": "800x600"},
|
|
"navigator": {
|
|
"deviceMemory": 16,
|
|
"pdfViewerEnabled": True,
|
|
"cookieEnabled": True,
|
|
"productSub": "20030107",
|
|
"hardwareConcurrency": 10,
|
|
},
|
|
"webgl": "Google Inc. (Apple)~ANGLE (Apple, ANGLE Metal Renderer: Apple M4, Unspecified Version)",
|
|
"timezoneOffset": -480,
|
|
}
|
|
assert _qimei_feature_string(feature).endswith("###-480###")
|
|
assert qimei_fingerprint_generate(feature) == "d07a45de567322edcd42312f38e610be"
|
|
fields = cookie_fields(fill_web_cookie_fields("", "", qimei_feature=feature))
|
|
assert fields["_qimei_fingerprint"] == "d07a45de567322edcd42312f38e610be"
|
|
|
|
|
|
def test_fill_replaces_empty_values_and_completes_core_fields():
|
|
result = fill_web_cookie_fields("guid=; __yamid_new=; game_did=", "a" * 32, 1)
|
|
fields = cookie_fields(result)
|
|
assert fields["guid"] == "a" * 32
|
|
assert fields["__yamid_new"]
|
|
assert fields["game_did"]
|
|
assert fields["_qimei_fingerprint"] == qimei_fingerprint_generate()
|
|
assert fields["_qimei_h38"] == fields["_qimei_uuid42"]
|
|
assert not missing_web_cookie_fields(result)
|
|
|
|
|
|
def test_qimei_h38_aliases_uuid42_without_overwriting_existing_value():
|
|
uuid42 = "1" * 42
|
|
fields = cookie_fields(
|
|
fill_web_cookie_fields(f"_qimei_uuid42={uuid42}; _qimei_h38=", "")
|
|
)
|
|
assert fields["_qimei_h38"] == uuid42
|
|
|
|
fields = cookie_fields(
|
|
fill_web_cookie_fields(f"_qimei_uuid42={uuid42}; _qimei_h38=historical", "")
|
|
)
|
|
assert fields["_qimei_h38"] == "historical"
|
|
|
|
|
|
def test_qimei_uuid42_matches_sdk_vectors_and_random_upper_bound():
|
|
base = 1700000000000000000
|
|
assert _qimei_uuid42_generate(base, random_value=0.25) == (
|
|
"17b0f060d14100037f4444444444444444444437df"
|
|
)
|
|
assert _qimei_uuid42_generate(base, random_value=0.5) == (
|
|
"17b0f060d1410053db888888888888888888883ff6"
|
|
)
|
|
upper = _qimei_uuid42_generate(base, random_value=1.0)
|
|
assert len(upper) == 42
|
|
assert upper[18:38] == "f" * 20
|
|
assert all(ch in "0123456789abcdef" for ch in upper)
|
|
|
|
|
|
def test_qimei_uuid42_uses_twenty_independent_random_draws(monkeypatch):
|
|
values = iter(value / 16 for value in (*range(16), *range(4)))
|
|
calls = 0
|
|
|
|
def next_random():
|
|
nonlocal calls
|
|
calls += 1
|
|
return next(values)
|
|
|
|
monkeypatch.setattr("core.huya.web_cookie_fields.random.random", next_random)
|
|
assert _qimei_uuid42_generate(1700000000000000000) == (
|
|
"17b0f060d14100b2230123456789abcdef012396a9"
|
|
)
|
|
assert calls == 20
|
|
|
|
|
|
def test_qimei_uuid42_encodes_local_date_and_cookie_flag():
|
|
base = 1700000000000000000
|
|
assert _qimei_uuid42_generate(base, random_value=0, cookie_enabled=False) == (
|
|
"17b0f060d140008b2b00000000000000000000dad6"
|
|
)
|
|
|
|
|
|
def test_qimei_uuid42_handles_year_zero_padding():
|
|
# 2000-01-01 08:00:00 local time; SDK emits 00 + 1 + 08 + 00 + 00 + 100.
|
|
value = _qimei_uuid42_generate(946684800000000000, random_value=0)
|
|
assert value[:14] == "00101080000100"
|
|
|
|
|
|
def test_sdk_uuid42_trace_vectors_have_confirmed_outer_layout():
|
|
"""锁定 SDK 追踪确认的 14+4+20+4 外层布局和固定随机向量。"""
|
|
vectors = {
|
|
0.0: "17b0f060d1410085cc000000000000000000003207",
|
|
0.25: "17b0f060d14100037f4444444444444444444437df",
|
|
0.5: "17b0f060d1410053db888888888888888888883ff6",
|
|
0.75: "17b0f060d14100966bcccccccccccccccccccc1cf3",
|
|
0.999: "17b0f060d141003174ffffffffffffffffffffd85d",
|
|
}
|
|
for random_value, value in vectors.items():
|
|
assert len(value) == 42
|
|
assert value[:14] == "17b0f060d14100"
|
|
assert value[18:38] == f"{int(random_value * 16):x}" * 20
|
|
assert all(char in "0123456789abcdef" for char in value)
|
|
|
|
|
|
def test_device_profile_builds_stable_webview_feature_approximation():
|
|
feature = qimei_feature_from_device_profile(
|
|
{
|
|
"vendor": "vivo",
|
|
"model": "V2370A",
|
|
"width": "1080",
|
|
"height": "2412",
|
|
}
|
|
)
|
|
assert feature["screen"] == {
|
|
"resolution": "1080x2412",
|
|
"availResolution": "1080x2412",
|
|
}
|
|
assert feature["navigator"]["pdfViewerEnabled"] is False
|
|
assert "Adreno" in str(feature["webgl"])
|
|
first = qimei_fingerprint_generate(feature)
|
|
second = qimei_fingerprint_generate(
|
|
qimei_feature_from_device_profile(
|
|
{
|
|
"vendor": "vivo",
|
|
"model": "V2370A",
|
|
"width": "1080",
|
|
"height": "2412",
|
|
}
|
|
)
|
|
)
|
|
assert first == second
|
|
assert first != qimei_fingerprint_generate()
|