Files

185 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
> KuGouMusicApi 项目指南 — 酷狗音乐 NodeJS 版 API
## 项目概述
本项目是酷狗音乐的非官方 NodeJS API 服务,通过伪造请求头和调用官方 API 实现酷狗音乐的全部功能。支持两种运行模式:HTTP 服务模式(Express)和编程式调用模式(作为库引入)。
- **作者**: Lines(基于 MakcRe 的项目)
- **版本**: 1.5.1
- **Node 要求**: >= 12
- **License**: MIT
## 技术栈
- **运行时**: Node.js
- **HTTP 框架**: Express 4.x
- **HTTP 客户端**: Axios
- **加密库**: crypto-jsAES/MD5)、node-forgeRSA
- **压缩库**: pakozlib 解压,用于 KRC 歌词解码)
- **大整数库**: big-integer(用于 MID 计算)
- **开发工具**: nodemon、prettier、esbuild、pkg
## 项目结构
```
KuGouMusicApi/
├── app.js # CLI 入口(shebang),调用 server.startService()
├── index.js # 开发入口,require('./app')
├── main.js # 编程式 API 入口(作为库使用时)
├── server.js # Express 服务器核心(CORS、Cookie、路由注册)
├── module/ # API 模块目录(约 160 个接口)
│ ├── search.js # 搜索
│ ├── login.js # 登录
│ ├── login_cellphone.js # 手机登录
│ ├── song_url.js # 歌曲 URL
│ ├── playlist_detail.js # 歌单详情
│ └── ... # 其他接口
├── util/ # 工具库
│ ├── index.js # 统一导出入口
│ ├── config.json # 平台配置(appid、clientver 等)
│ ├── crypto.js # 加密函数(AES、RSA、MD5、SHA1
│ ├── helper.js # 签名函数(signature、sign、signKey
│ ├── request.js # HTTP 请求封装(签名、代理、响应处理)
│ ├── util.js # 通用工具(随机数、Cookie、歌词解码、MID、WebGL 指纹)
│ ├── runtime.js # 运行时配置(CLI 参数、代理解析)
│ ├── generate_simulate.js # 行为指纹模拟生成(AES+RSA 加密)
│ ├── apicache.js # API 响应缓存中间件
│ └── memory-cache.js # 内存缓存实现
├── public/ # 前端页面
│ ├── index.html # 接口文档首页
│ ├── login_captcha.html # 登录页(依赖 WASM
│ ├── login_captcha_simulate.html # 登录页(纯 JS 模拟,不依赖 WASM)
│ ├── sid_edt_generator.html # SID/EDT 生成工具页
│ └── verify-pkg/ # WASM 验证码包
├── docs/ # 接口文档
├── .env.example # 环境变量配置示例
├── Dockerfile # Docker 部署配置
├── vercel.json # Vercel 部署配置
└── package.json
```
## 核心架构
### 请求流程
```
客户端请求 → Express 中间件(CORS → Cookie 解析 → 平台标识注入 → 缓存)
→ 路由处理器(参数合并 → Cookie 格式化 → Authorization 头解析)
→ API 模块函数(构建请求参数 → 生成签名 → 调用 createRequest
→ createRequest(注入设备标识 → 签名 → 代理 → 发送请求 → 响应处理)
→ 酷狗服务器
```
### 签名机制
所有 API 请求都需要签名验证,支持三种签名类型:
- **Android 签名**(默认): `MD5(盐值 + 排序参数 + 请求体 + 盐值)`
- **Web 签名**: `MD5(盐值 + 排序参数 + 盐值)`
- **Register 签名**: `MD5("1014" + 排序值 + "1014")`
区分标准版和概念版(lite),使用不同的盐值和 appid。
### 行为指纹(SID/EDT
酷狗服务端会检测请求的行为指纹,需要生成模拟数据:
- **SID**: RSA-OAEP 加密的 AES 密钥(Base64
- **EDT**: AES-128-CBC 加密的行为数据(Base64
- 行为数据包括:鼠标轨迹(贝塞尔曲线)、滚动事件、窗口事件、WebGL 指纹
### 双平台支持
通过 `.env` 中的 `platform` 环境变量切换:
- **标准版**(默认): `appid=1005`, `clientver=20489`
- **概念版 lite**: `appid=3116`, `clientver=11440`
## 常用命令
```bash
# 安装依赖
npm install
# 开发模式(热重载)
npm run dev
# 生产模式
npm start
# 自定义端口
PORT=4000 npm run dev
# 使用代理
KUGOU_API_PROXY=http://127.0.0.1:7890 npm run dev
# CLI 参数方式设置代理
node app.js --proxy=http://127.0.0.1:7890 --platform=lite
```
## 环境变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `platform` | 平台类型:`lite`(概念版)或空(标准版) | 空 |
| `PORT` | 服务端口 | 3000 |
| `HOST` | 监听地址 | 空(所有地址) |
| `KUGOU_API_PROXY` | HTTP 代理地址 | 空 |
| `KUGOU_API_GUID` | 设备 GUID(建议 UUID v4 | 自动生成 |
| `KUGOU_API_DEV` | 开发设备标识(10位大写字符串) | 自动生成 |
| `KUGOU_API_MAC` | 设备 MAC 地址 | 02:00:00:00:00:00 |
| `KUGOU_API_WEBGL` | WebGL 指纹哈希 | 自动生成随机值 |
## 开发规范
### 添加新接口
1.`module/` 目录下创建新的 `.js` 文件
2. 文件名即为路由路径(`_` 替换为 `/`),如 `user_detail.js``/user/detail`
3. 模块导出一个函数:`(params, useAxios) => Promise`
- `params`: 合并后的请求参数(含 cookie、query、body
- `useAxios`: 请求工厂函数,调用 `createRequest` 发送请求
```javascript
// module/example.js
module.exports = (params, useAxios) => {
return new Promise((resolve, reject) => {
useAxios({
baseURL: 'https://gateway.kugou.com',
url: '/v1/example',
method: 'GET',
params: { keyword: params.keyword },
cookie: params.cookie,
}).then(resolve).catch(reject);
});
};
```
### 签名选择
- 大多数接口使用 `android` 签名(默认)
- Web 相关接口使用 `web` 签名
- 设备注册接口使用 `register` 签名
### Cookie 传递
Cookie 通过以下方式传递:
- URL 查询参数: `?cookie=token%3Dxxx%3Buserid%3Dxxx`
- 请求体: `{ cookie: "token=xxx;userid=xxx" }`
- Authorization 头: `Authorization: token=xxx;userid=xxx`
服务端会自动将 Cookie 字符串转换为 JSON 对象并合并。
## 代码风格
- 使用 Prettier 格式化(配置见 `.prettierrc.json`
- 2 空格缩进
- 单引号
- 无分号(Prettier 默认)
## 部署
- **Docker**: 使用项目根目录的 `Dockerfile`
- **Vercel**: 使用 `vercel.json` 配置
- **pkg 打包**: `npm run pkgwin` / `npm run pkglinux` / `npm run pkgmacos`
- **esbuild 打包**: `npm run pkgjs`