ksjsb/core/weapon_kas.py
2026-07-30 20:25:56 +08:00

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)}