feat(qs): 汽水音乐平台接入——匿名搜索/试听、抖音扫码登录、解密流代理
- sdk/qs 平台模块(安卓参数指纹匿名搜索)+ sdk/apis/qs 取流: 匿名 30s 试听,登录态走签名 track_v2 + spade key AES-CTR 解密 - /login/qs/qr 抖音扫码登录(授权后 sessionid 解锁完整曲目) - /stream/qs/:id 解密流代理,/url 返回的相对地址按请求 host 补全 - 回归测试覆盖 kw 双通道(VIP 真音频/降级链)与 qs 试听;start.bat 去掉 SOURCE_ENABLED 直启
This commit is contained in:
1 parent
aa4f2eec67
commit
0f9cff2a08
26 files changed
+2172
-9
No files matched your search
@@ -0,0 +1,18 @@
|
||||
import { b64encode, getCrypto } from "./index.ts";
|
||||
import { generateLadonKey, speckEncrypt } from "./speck.ts";
|
||||
import type { UnidbgConfig } from "./unidbgconfig.ts";
|
||||
|
||||
export async function getLadon(timestamp: number, config: UnidbgConfig): Promise<string> {
|
||||
const randomBytes = getCrypto().getRandomValues(new Uint8Array(4));
|
||||
|
||||
const plaintext = new TextEncoder().encode(
|
||||
`${timestamp}-${config.licenseId}-${config.aid}`,
|
||||
);
|
||||
const key = await generateLadonKey(randomBytes, config.aid);
|
||||
const encrypted = speckEncrypt(key, plaintext);
|
||||
|
||||
const result = new Uint8Array(randomBytes.length + encrypted.length);
|
||||
result.set(randomBytes);
|
||||
result.set(encrypted, randomBytes.length);
|
||||
return b64encode(result.buffer);
|
||||
}
|
||||
Reference in new issue
Block a user