feat(python): 完成 Python 全量迁移——剩余平台、登录通道与公共层修复

- 新增 5sing/apple/xm/me/qt/lr 平台包与取流实现(含 xm-sign、MissEvan 签名、蜻蜓 HMAC、Apple developer token)
- 新增 wy/kg/tx/lr 登录:扫码、手机号、账密(kg 20028 风控指纹)、cookie 绑定、kg/tx 续期
- request 层:保留多值 Set-Cookie;JSON body 紧凑化(修复 kg 网关验签);直连不经系统代理(对齐 Node)
- 登录路由统一 Body(embed=True),修复扫码轮询 422;lifespan 接入登录续期调度
- ruff/format/pyright 全绿;14 平台真实联网与 HTTP 路由验证通过
This commit is contained in:
snowy-yang committed 2026-10-23 21:55:45 +08:00
1 parent 800871ef6e
commit dfc06bf4de
182 files changed
+26620

No files matched your search

+38
View File
@@ -0,0 +1,38 @@
"""流代理签名 —— /stream/* 的无头客户端兼容方案。
/url 返回流地址时附加 `?exp=<秒级时间戳>&sig=<HMAC-SHA256(authKey, "path:exp") 前 32 位>`。
与裸 ?key= 的区别:签名值泄露只能在该时效窗口内拉这一条流,不能反推出秘钥、不能调用其它接口。
"""
from __future__ import annotations
import hashlib
import hmac
import time
# 流地址有效期(秒),与 mg 流票据 TTL(10 分钟)对齐;过期后客户端重新 /url 即可
STREAM_SIGN_TTL = 10 * 60
def _sign(auth_key: str, data: str) -> str:
return hmac.new(auth_key.encode(), data.encode(), hashlib.sha256).hexdigest()[:32]
def sign_stream(auth_key: str, path: str) -> str:
"""生成流地址的签名参数(path 为不含 query 的路径,如 /stream/mg/123)。"""
exp = int(time.time() + STREAM_SIGN_TTL)
return f"exp={exp}&sig={_sign(auth_key, f'{path}:{exp}')}"
def verify_stream_sign(auth_key: str, path: str, exp: object, sig: object) -> bool:
"""校验流地址签名(常量时间比较 + 时效窗口)。"""
try:
exp_num = int(float(str(exp)))
except (TypeError, ValueError):
return False
sig_str = str(sig or "")
if not sig_str:
return False
if time.time() > exp_num: # 过期即拒(客户端重新 /url 取新地址)
return False
return hmac.compare_digest(_sign(auth_key, f"{path}:{exp_num}"), sig_str)