Skip to content
Xeron
Go back

Coinglass 接口算法解密

编辑此页

Coinglass 的公开 API 全部加密。response body 是密文,但密钥就放在 response headers 里

加密方案

Coinglass 用 AES-128-ECB 加两层 gzip,密钥通过 response header 传递:

请求 → GET /api/spot/rsi/list (带 encryption: true header)
响应 → Headers: { user: <base64 token>, v: "55" }

解密流程:
1. v=55 → 查表取常量 "170b070da9654622"
2. base64(常量)[:16] → Key0
3. AES-ECBdecrypt(user_token, Key0) → gzip(实际密钥)
4. 解压 → 16 字符 hex 密钥
5. AES-ECBdecrypt(加密body, 实际密钥) → gzip(JSON)
6. 解压 → 明文 JSON

不需要 API key、cookie、session。任何能发 HTTP 请求的人都能解密任何 endpoint

密钥常量

v header 决定用哪个常量派生第一层密钥:

v常量来源
55170b070da9654622webpack module 12471, Kt[22]
66d6537d845a964081webpack module 12471, Kt[38]
77863f08689c97435bwebpack module 12471, BatcW
1URL pathbtoa(url_path)[:16]

这些常量硬编码在前端 webpack bundle 里。v=55/66/77 是固定值,v=1 是动态的——从请求路径派生

逆向过程

加密逻辑藏在 Next.js 的 webpack module 12471 里。bundle 文件在 S3 上公开可访问:

https://s3.coinglass.com/v1/cg/_next/static/chunks/pages/_app-f75bb33a408a04d3.js

module 12471 包含:

密钥派生在 Yt 函数里。三个常量分别对应 Kt[22]Kt[38]BatcW 变量。混淆不深,字符串直接可见

代码实现

# decrypt.py 核心逻辑

_KEY_TABLE = {
    "55": "170b070da9654622",
    "66": "d6537d845a964081",
    "77": "863f08689c97435b",
}

def decrypt(encrypted_body, user_token_b64, v, url=""):
    outer = json.loads(encrypted_body)
    payload = base64.b64decode(outer["data"])
    token = base64.b64decode(user_token_b64)

    # 派生 Key0
    constant = _KEY_TABLE.get(v) if v != "1" else urlparse(url).path
    key0 = base64.b64encode(constant.encode()).decode()[:16]

    # 第一层:解密 user token → 实际密钥
    step1 = unpad(AES.new(key0.encode(), AES.MODE_ECB).decrypt(token), 16)
    actual_key = gzip.decompress(step1).decode()

    # 第二层:解密 body → 明文
    step2 = unpad(AES.new(actual_key.encode(), AES.MODE_ECB).decrypt(payload), 16)
    return json.loads(gzip.decompress(step2).decode())

调用方式:

from decrypt import fetch_and_decrypt

data = fetch_and_decrypt(
    "https://capi.coinglass.com/api/spot/rsi/list",
    {"pageSize": 500, "pageNum": 1},
)
print(data["list"][0]["rsi4h"])  # → "62.34"

接口规模

逆向发现了 280+ 个加密 endpoint,覆盖:

完整列表在 discovered_endpoints.py

免责

项目仅供教育和研究用途。加密方案从公开可访问的前端代码中逆向得出。使用时请遵守 Coinglass 的服务条款

仓库:github.com/Xeron2000/coinglass-decrypt


编辑此页
Share this post on:

Previous Post
Pi 工具链
Next Post
MiMo Code 免费模型反代