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 | 常量 | 来源 |
|---|---|---|
| 55 | 170b070da9654622 | webpack module 12471, Kt[22] |
| 66 | d6537d845a964081 | webpack module 12471, Kt[38] |
| 77 | 863f08689c97435b | webpack module 12471, BatcW |
| 1 | URL path | btoa(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 包含:
- AES-ECB 加解密 — CryptoJS 实现
- FP 函数 — GET + 加密 + 解密响应
- xW 函数 — 普通请求,不加密
- Zl 函数 — POST + 加密
- 请求拦截器 — 自动注入
encryption: true、cache-ts-v2等 headers - 字符串混淆 —
Qt(offset, seed)查表函数
密钥派生在 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,覆盖:
- 现货数据 — RSI、市值、价格变动
- 合约数据 — 资金费率、持仓量、爆仓、多空比
- 期权 — OI、成交量、Max Pain
- ETF 资金流 — BTC/ETH/SOL/XRP
- 链上指标 — SOPR、MVRV、活跃地址、CDD 等 50+ 指标
- 链上指数 — CGDI、CGRI、Pi Cycle、AHR999、Puell Multiple
- 宏观经济 — 经济日历、传统金融概览
- Hyperliquid — vaults、大户持仓、用户分布
完整列表在 discovered_endpoints.py
免责
项目仅供教育和研究用途。加密方案从公开可访问的前端代码中逆向得出。使用时请遵守 Coinglass 的服务条款