48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
"""Weapon ``W.pr(99999, 2, ...)`` 的纯 Python KAS 生成器。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import base64
|
|
import urllib.parse
|
|
from dataclasses import dataclass
|
|
|
|
from .weapon_vimg import _generate_ai_hex, _java_modified_utf8
|
|
|
|
|
|
# ``WeaponHI.g(context)`` 在 ``z_y_x_a`` 尚未下发时使用的 APK 内置值。
|
|
APK_DEFAULT_WEAPON_KAW = (
|
|
"MDAgOGjoRLeHCT6xRdsOAngNH4RQOdDTY7WVEbnxKJqLVJUDnvV26jVwacDZJjYLO8Uz"
|
|
"N8PYNaiJslgA"
|
|
)
|
|
|
|
|
|
def build_weapon_signature_input(url: str, kaw: str) -> str:
|
|
"""还原 ``WeaponSigInterceptor`` 传给 ``W.pr`` 的明文。"""
|
|
|
|
parsed = urllib.parse.urlsplit(url)
|
|
query = urllib.parse.parse_qs(parsed.query, keep_blank_values=True)
|
|
sig3 = query.get("__NS_sig3", [""])[0]
|
|
return f"{parsed.path}{sig3}{kaw}"
|
|
|
|
|
|
def generate_weapon_kas(payload: str) -> str:
|
|
"""复现 ``W.pr(99999, 2, len(payload) * 2, payload)``。"""
|
|
|
|
payload_base64 = base64.b64encode(_java_modified_utf8(payload)).decode("ascii")
|
|
return "00" + _generate_ai_hex(payload_base64)
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class WeaponProofProvider:
|
|
"""根据最终签名 URL 生成对应的 ``kaw`` / ``kas`` 请求头。"""
|
|
|
|
kaw: str = APK_DEFAULT_WEAPON_KAW
|
|
|
|
def __post_init__(self) -> None:
|
|
if not self.kaw or self.kaw.strip() != self.kaw:
|
|
raise ValueError("weapon kaw must be a non-empty value without outer whitespace")
|
|
|
|
def __call__(self, url: str) -> dict[str, str]:
|
|
payload = build_weapon_signature_input(url, self.kaw)
|
|
return {"kaw": self.kaw, "kas": generate_weapon_kas(payload)}
|