# QQMusicApi

这是一个基于 Express + Axios 的 Nodejs 项目，一切仅供学习参考，该支持的还是要支持的，不然杰伦喝不起奶茶了。

其实有点点嫌弃qq音乐接口的数据格式，所以会对部分接口返回做一些处理，但是考虑到一些之前扒过接口的项目，有些人可能还是喜欢原汁原味，
可以在接口处增加一个参数 `raw=1` 。

对于所有处理过的返回数据，都会包含 `result`，`100` 表示成功，`500` 表示穿参错误，`400` 为 node 捕获的未知异常，`301` 表示缺少用户登陆的 cookie

关于如何在服务器上存储 cookie，可以查看接口 [设置用户Cookie](#设置用户Cookie)

灵感来源：[Binaryify/NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi)

## NPM 使用

```shell script
yarn add qq-music-api
```

```javascript
const qqMusic = require('qq-music-api');

// 部分接口依赖 cookie, 这里穿参可以使用字符串或对象
qqMusic.setCookie('xxx=xxx; xxx=xxx;');
// or
qqMusic.setCookie({ a: 'xxx', b: 'xxx' });

qqMusic.api('search', { key: '周杰伦' })
    .then(res => console.log(res))
    .catch(err => console.log('接口调用出错'))

qqMusic.api('search', { key: '周杰伦' })
    .then((res) => console.log('搜索周杰伦：', res))
    .catch(err => console.log('接口调用出错'))

qqMusic.api('search/hot')
    .then((res) => console.log('热搜词：', res))
    .catch(err => console.log('接口调用出错'))//

// 刷新登陆
qqMusic.api('user/refresh')
```

## Start

```shell
$ git clone git@github.com:jsososo/QQMusicApi.git

$ npm install

$ npm start
```

项目默认端口为 3300，默认qq号 1234567 (设置Cookie)，可以通过修改 `bin/config.js` 或设置启动参数 `PORT=3400 QQ=7654321 npm start`

如果使用的是微信号，则将 `bin/config.js` 中的 qq好改为 `wxuin`，具体数值可以在网页版qq音乐的 cookie 中获取

如果需要启用数据统计、ip拦截等，可以将 `bin/config.js` 中的 `useDataStatistics` 设为 `true` （会存在直接拦截部分来自其他后台的请求）

**在线接口测试网址：[http://api.qq.jsososo.com](http://api.qq.jsososo.com)**

## 用前须知

!> 公用 cookie 的形式会存在封号风险，因此现在默认取消了公用 cookie 方法，望注意

!> 该项目仅做接口转发，部分接口通过修改 `Referer` 实现，所有数据均不做存储处理，大家还是理性的保护好自己的个人信息，谨防诈骗

!> QQ音乐登陆的这个问题还是难绕过去，目前还是需要登陆并手动获取 [https://y.qq.com](https://y.qq.com) 的 `cookie`，注入网站或node，
如果又什么更好的解决办法，欢迎大家提 pr 给我

!> 另，可以通过 [qqmusic-cookie-porter](https://github.com/jsososo/qqmusic-cookie-porter) 这个 chrome 插件半自动获取 cookie

!> 本项目仅供学习使用，请尊重版权，请勿利用此项目从事商业行为!
本项目仅供学习使用，请尊重版权，请勿利用此项目从事商业行为!
本项目仅供学习使用，请尊重版权，请勿利用此项目从事商业行为!

!> 接口仅作为测试或者方便听歌使用，发现有人使用其他服务大量的调用接口导致服务经常性挂掉重启，所以加入了ip检测和黑白名单机制，
想用的童鞋请自行clone走项目启动，我也没钱升级我的服务器了！！

## 常见问题

1、为什么无法获取音乐链接等？

请确保已正确添加绿钻账号 Cookie 信息，具体操作可以查看 [设置用户cookie](#设置用户cookie)，检测是否设置成功可以查看 [查看当前cookie](#查看当前cookie)

2、为什么返回了 `自己起一个 node 服务 这么难？？?` 或 被加入了黑名单 ?

第一个，服务默认禁止了一些明显来源于爬虫的接口，可以将 `util/dataStatistics.js` 中相关代码注释重启，
如果短时大量请求会被拉入黑名单，可以通过移除黑名单、加入白名单，或者干脆在 `app.js` 里注释 `dataHandle` 相关代码


## 更新记录
21-09-10 🍌 bug fix: 获取专辑信息出错

21-08-22 🐚 新增刷新登陆 & mv 点赞 & bug fix

21-08-15 🦆 支持 npm 使用 & bug fix

21-06-27 🌰 修改部分接口cheerio调用

21-02-10 🦛 修复部分歌手页面报错 & 增加歌手名字获取

21-02-09 🍡 修复日推歌单 & 部分歌手详情格式问题

21-01-19 🐙 优化404报错

21-01-17 🐊 优化获取链接接口报错提示

21-01-06：🎄 底层格式修改，方便 electron 整合调用

20-12-15：❄️ 修复歌曲链接失效

20-08-03：😲 支持微信登录

20-08-03：🕶️ 部分接口增加缓存策略

20-07-14 修改了因图标导致的无法部署

20-06-24：🍑 获取用户创建歌单接口出错

20-05-21：🍇 新增推荐 banner、url 支持重定向、配置化启动

20-04-23：🎢 修复高品音质获取失败问题

20-04-18：📖 写死的参数替换

20-04-14：🚎 日推

20-04-07：🍰 接口记录问题

20-03-30：🌸 收藏歌单操作，获取用户收藏的歌单/专辑

20-03-22：🍃 去除 cookie 中 uin 的其他字母

20-02-15：👍 新增评论操作相关接口

20-02-01：🥤 新增多个歌单操作相关接口

20-01-31：🐑 配合 chrome 插件自动获取存储 cookie

20-01-30：🍲 增加快速搜索接口、歌单、专辑、歌单、mv的评论获取

20-01-19：😢 [issue#9](https://github.com/jsososo/QQMusicApi/issues/9)

20-01-17：👑 更新歌曲链接的域名ip

20-01-09：🦈 反馈

20-01-07：🔫 歌单搜索接口修改

19-12-23：🦑 排行榜相关接口优化、新增相似歌曲、相关歌单、相关mv

19-12-18：🍒 批量获取歌曲信息、top排行榜数据优化

19-12-11：🚀 高频ip黑白名单

19-12-05：🏎️ 获取 mp3 和无损 ape、flac 等格式链接

19-11-14：🐄 排行榜

19-10-29：🐝 搜索歌手，专辑信息查询

19-10-15：👖 url 获取

19-10-10：🤬 热搜词、关注歌手、关注粉丝列表

19-09-23：🏊 歌单、mv 的分类获取

19-09-21：🚢 新增 MV 信息、根据分类筛选歌手、新碟推荐、新 MV 推荐

19-09-20：🐬 支持在线测试

19-09-20：🐫 新增 mv 接口，返回结果优化

19-09-19：🙀 评论、推荐、歌手接口

19-09-18：🐧 init

## 公用参数说明

!> 非常重要，特别是和登陆 cookie 有关的参数

1、`raw` 前面提到的，默认为 `0`, 如果传了非0参数，则表示使用原汁原味的数据结构

2、`ownCookie` 默认为 `0`，使用服务器上预存的 `cookie` 信息, 非0表示使用浏览器传过来的 `cookie`，如果不使用的话，部分接口会遇到 `301`，
如果该用户非 vip，也无法获取大部分歌曲的播放链接，我自己会不定时的更新这个服务器上（api.qq.jsososo.com）的 `cookie`作为登陆用户

## 接口文档

### ~vkey & guid 获取（已废弃，直接看下个接口）~

19-10-11，因为企鹅音乐修改了对音乐播放链接的获取，因此这个接口已没有意义，获取播放链接的参考下面的接口

先介绍 vkey 和 guid 的获取，因为这是拼凑音乐链接的关键，也是播放音乐的核心一步

接口：`/vkey`

返回示例：
```javascript
{
  "data": {
    "vkey": "78159670DE0BF35ABEF86841070FDA6818BC95FB25E5C983547E9D29C9803D30971A3500E2D85D5204848BDC4E3E130BE9FCC63EB73F0F47",
    "guid": "5339940689",
    "domain": "http://ws.stream.qqmusic.qq.com/"
  },
  "result": 100,
  "success": true
}
```

下面是不同格式的音乐对应的 url 拼接，可稳定获取128k的播放链接，但是高品质会被403，还在摸索中。。。

```javascript
// content 参数里面的文件类型可以用在下载的时候，后端将歌曲转成流，并标注返回的类型（content）
const formatMap = {
          size128: {
            val: '128k',
            s: 'M500',
            e: '.mp3',
            content: 'audio/mpeg',
          },
          size320: {
            val: '320k',
            s: 'M800',
            e: '.mp3',
            content: 'audio/mpeg',
          },
          sizeape: {
            val: '无损ape',
            s: 'A000',
            e: '.ape',
            content: 'audio/ape',
          },
          sizeflac: {
            val: '无损flac',
            s: 'F000',
            e: '.flac',
            content: 'audio/x-flac',
          }
        }
      }
const format = 'size320';
const { s, e } = formatMap[format];

// 注意是 strMediaMid 不是 songid, 也不是 songmid，付费歌曲的strMediaMid 和 songmid 不同，非付费歌曲相同
const url = `${domain}${s}${strMediaMid}${e}?guid=${guid}&vkey=${vkey}&fromtag=8&uin=0`
```

### 播放链接

接口：`/song/urls`

参数：

`id`: 歌曲的 `songmid`，必填，多个用逗号分割，该接口可用 `post` 或 `get`

并不是所有的音乐都能获取到播放链接，如果是未登陆或非 vip 用户的 `cookie`，只能获取到非 vip 用户可听的歌曲，
其他像一些必须要购买数字专辑才能收听的歌曲，如果未购买也是无法获取的，无法获取到的播放链接则不会在返回的对象中出现，
这点需要大家自己做好兼容，我这里服务器会默认使用自己会员的 cookie，如果需要使用自己的 cookie，请参考上面文档

示例：[/song/urls?id=0039MnYb0qxYhV,004Z8Ihr0JIu5s](http://api.qq.jsososo.com/song/urls?id=0039MnYb0qxYhV,004Z8Ihr0JIu5s)

```json5
// 晴天和七里香
{
  "data": {
    "0039MnYb0qxYhV": "http://ws.stream.qqmusic.qq.com/C400002202B43Cq4V4.m4a?guid=2796982635&vkey=0A1ADCEDC042ABE27FE184A3436DBB6F15AFF286F0F06DDFAEA9ADAF2D82F67EF33746A9472F62B444B7E7CEB32EE0D34DFD53A6E2D97D7B&uin=1899&fromtag=66",
    "004Z8Ihr0JIu5s": "http://ws.stream.qqmusic.qq.com/C4000012Ez0a1tFcOI.m4a?guid=2796982635&vkey=DB0E16676C581AE2E762FCA5D32FBB52454EA229C6BD58D9BA2976BA7CC3E49532EA299860E0F219148005848530335ABC254EC7A3374F80&uin=1899&fromtag=66"
  },
  "result": 100
}

```

### 下载链接

接口：`/song/url`

参数：

`id`: songmid

`type`: 默认 128 // 128：mp3 128k，320：mp3 320k，m4a：m4a格式 128k，flac：flac格式 无损，ape：ape格式 无损

`mediaId`: 这个字段为其他接口中返回的 strMediaId 字段，可不传，不传默认同 songmid，但是部分歌曲不传可能会出现能获取到链接，但实际404，
所以有条件的大家都传吧

`isRedirect`: 默认 0，非 0 时直接重定向到播放链接

这个接口跟上个接口一样，也是依赖服务器的 Cookie 信息的，不支持批量获取，不一定是全部的歌曲都有无损、高品的，
要注意结合 size320，sizeape，sizeflac 等参数先判断下是否有播放链接

示例：[/song/url?id=0039MnYb0qxYhV](http://api.qq.jsososo.com/song/url?id=0039MnYb0qxYhV)

### 搜索

#### 搜索
接口：`/search`

参数：

`key`: 关键词 必填

`pageNo`: 页码，默认 1

`pageSize`: 一页返回数量，默认 20

`t`: 搜索类型 默认为 0  // 0：单曲，2：歌单，7：歌词，8：专辑，9：歌手，12：mv

示例：[/search?key=周杰伦](http://api.qq.jsososo.com/search?key=周杰伦)

#### 获取热搜词

接口：`/search/hot`

示例：[/search/hot](http://api.qq.jsososo.com/search/hot)

返回示例：`k` 为热搜词，`n` 为搜索量

```json5
{
  "result": 100,
  "data": [
    {
      "k": "PHOENIX 涅槃 ",
      "n": 440301
    },
    {
      "k": "嚣张 ",
      "n": 430912
    },
    ...
  ]
}
```

#### 快速搜索

接口: `/search/quick`

`key`: 关键词 必填

快速给出少量符合条件的歌曲、mv、专辑、歌手

示例：[/search/quick?key=周杰伦](http://api.qq.jsososo.com/search/quick?key=周杰伦)

### 查找音乐

#### 单个查找

接口：`/song/find`

参数：

`key`: 关键词

这个接口就像是简化版的搜索，根据关键词获取到搜出的第一个歌曲，不过他会直接带上播放链接，参数为 `url`，
如果没有则表示无法获取到播放链接。这个接口的作用是，对于其他平台的歌单如果需要获取到企鹅音乐的信息时，
可以通过 歌名 + 歌手 + 专辑 等关键词获取大致的歌曲，当然这是并不能保障稳定的。

示例：[/song/find?key=周杰伦%2f稻香](http://api.qq.jsososo.com/song/find?key=周杰伦%2f稻香)

#### 批量获取

接口：`/song/finds`

类型：仅支持`post`

参数：

`data`: 对象，`key` 为歌曲id，`value` 为搜索关键词

同样，并不是所有传过去的 id 都会有返回，没返回就是没有找到，返回的歌曲也都是会包含播放链接

示例：
```javascript
anxios({
	url: "/song/finds",
	method: "post",
	data: {
		298838: "笑忘书 王菲",
		abcdefg: "邮差 王菲"
	}
})

// 返回：

{
	data: {
		208838: obj,
		abcdefg: obj,
	},
	result: 100,
}

```


### 用户信息

#### 设置用户Cookie

接口：`/user/setCookie`

参数：

`data`: 字符串，cookie 信息，格式如下 `aaa=bbb; ccc=ddd; ....`

该方法仅支持 post 请求，`content-type` 选择 `application/json`，参考如下 ![设置cookie](http://static.jsososo.com/200521/140442/bd3dd265f2da8be02429436592876b5b.png)

使用建议：当获取到用户的 `cookie` 信息后可以通过这个接口存储到服务器

#### 获取用户Cookie

接口：`/user/getCookie`

参数：

`id`： QQ号或微信wxuin

从服务器上获取通过 `/user/setCookie` 接口存储的 `cookie`。（回直接将 `cookie` 注入浏览器）

#### 查看当前Cookie

接口：`/user/cookie`

无需参数，返回为当前网站下的 `cookie` (`Object` )。

#### 刷新登陆

接口：`/user/refresh`

无需参数，用于延长登陆有效期，仅限 QQ 登陆，需要用户已登陆，调用这个接口可以刷新 `cookie` 中的 `qm_keyst` 和 `qqmusic_key`

#### 用户主页信息

!> 这个接口是需要登陆 cookie 才能获取的，不然会返回 301，所以如果有误需要考虑一下可能是 cookie 过期

接口：`/user/detail`

参数：

`id`: qq号 必填

返回中 `mymusic` 为喜欢的音乐，`mydiss` 为用户创建的歌单，需要注意的是，喜欢的音乐中的歌单id为 `id`，歌单中的歌单id为 `dissid`

示例：[/user/detail?id=123456](http://api.qq.jsososo.com/user/detail?id=123456)

#### 用户创建的歌单

接口：`/user/songlist`

参数：

`id`: qq号 必填

这个接口比上一个接口更纯粹，只获取创建的歌单，且数据结构更简单，非必须登陆 Cookie，但如果用户未公开主页时，只有本人的 Cookie 才能获取数据

示例：[/user/songlist?id=123456](http://api.qq.jsososo.com/user/songlist?id=123456)

#### 用户收藏的歌单

接口：`/user/collect/songlist`

参数：

`id`: qq号，必填，默认取 cookie 中 `uin`

`pageNo`: 默认 1

`pageSize`: 默认 20

示例：[/user/collect/songlist?id=123456](http://api.qq.jsososo.com/user/collect/songlist?id=123456)

#### 用户收藏的专辑

接口：`/user/collect/album`

参数：

`id`: qq号，必填，默认取 cookie 中 `uin`

`pageNo`: 默认 1

`pageSize`: 默认 20

示例：[/user/collect/album?id=123456](http://api.qq.jsososo.com/user/collect/album?id=123456)

### 歌单

#### 1、获取歌单详情

接口：`/songlist`

参数：
`id`: 歌单id 必填

返回说明：

这些表示各种码率对应的文件大小，如果为0则表示该格式的文件不存在
```javascript
{
  "size128": 1922927,
  "size320": 4803503,
  "sizeape": 10810010,
  "sizeflac": 10827560,
}
```

示例：[/songlist?id=2429907335](http://api.qq.jsososo.com/songlist?id=2429907335)

#### 2、获取歌单分类

接口：`/songlist/category`

这个接口没有参数，返回几种类型下的小分类 `id` 和 `name`，不同于歌手的筛选，搜索歌单时只能用一个 `id`，不能用且关系。

示例：[/songlist/category](http://api.qq.jsososo.com/songlist/category)

#### 3、根据分类获取歌单

接口：`/songlist/list`

参数

`pageSize`: 默认为 20

`pageNo`: 默认为1

`sort`: 默认是 5，// 5: 推荐，2: 最新，其他数字的排列值最后都会返回推荐

`category`: 分类 id，默认 10000000 （全部），其他值从上面的分类接口获取

示例：[/songlist/list](http://api.qq.jsososo.com/songlist/list)

#### 4、歌曲id、mid的哈希表

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/map`

参数：

`dirid`: 默认 201 我喜欢的歌单

这个接口只能获取用户自己创建的歌单且只会返回歌曲的 id 和 mid 的哈希表，不包含其他数据

#### 5、添加歌曲到歌单

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/add`

参数：

`mid`: 歌曲 mid 必填，多个用 , 分割

`dirid`: 必填

#### 6、从歌单中移除歌曲

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/remove`

参数：

`id`: 歌曲 id 必填，多个用 , 分割

`dirid`: 必填

与上一个添加接口不同，移除需要 `id` 不是 `mid`

#### 7、新建歌单

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/create`

参数：

`name`: 歌单名，不能为空

如果歌单名重复，也会报错

#### 8、删除歌单

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/delete`

参数：

`dirid`: 必填

#### 9、收藏/取消收藏 歌单

!> 这个接口强制使用浏览器传来的用户 Cookie 信息

接口：`/songlist/collect`

参数：

`id`: 歌单id 必填

`op`: 必填 1 收藏；2 取消收藏

### 歌曲信息

#### 单个获取

接口：`/song`

参数：

`songmid`: 必填

这个接口包含了很多的歌曲信息，包括歌手、专辑、语种、曲风等，但是不包含歌词，`songinfo.data.track_info.album.mid` 为专辑的 mid，
下面为专辑封面图片的路径，在搜索接口中也能获取到这个参数。

```
`https://y.gtimg.cn/music/photo_new/T002R300x300M000${mid}.jpg`
```

示例：[/song?songmid=0039MnYb0qxYhV](http://api.qq.jsososo.com/song?songmid=0039MnYb0qxYhV)

#### 批量获取

接口：`/song/batch`

参数：

`songmids`: 必填

这个接口本质为上一个接口的批量调用

示例：[/song/batch?songmids=001PLl3C4gPSCI,0039MnYb0qxYhV](http://api.qq.jsososo.com/song/batch?songmids=001PLl3C4gPSCI,0039MnYb0qxYhV)

#### 相似歌曲
接口：`/song/similar`

参数：

`id`: 歌曲 `songid` 必填

返回相似歌曲列表

示例：[/song/similar?id=5105986](http://api.qq.jsososo.com/song/similar?id=5105986)

#### 相关歌单
接口：`/song/playlist`

参数：

`id`: 歌曲 `songid` 必填

返回相关歌单列表

示例：[/song/playlist?id=5105986](http://api.qq.jsososo.com/song/playlist?id=5105986)

#### 相关MV
接口：`/song/mv`

参数：

`id`: 歌曲 `songid` 必填

返回相关mv列表

示例：[/song/mv?id=5105986](http://api.qq.jsososo.com/song/mv?id=5105986)

### 歌词

接口：`/lyric`

参数：

`songmid`: 必填

返回的接口中 `lyric` 和 `trans` 分别是歌词和翻译，转成了base64，这里node进行了解码。

示例：[/lyric?songmid=0039MnYb0qxYhV](http://api.qq.jsososo.com/lyric?songmid=0039MnYb0qxYhV)

示例：[/lyric?songmid=000b3wiQ3z0VbG](http://api.qq.jsososo.com/lyric?songmid=000b3wiQ3z0VbG)

### 推荐歌单

#### 1、为你推荐歌单

接口：`/recommend/playlist/u`

这个接口不需要参数，需要注意，和下面这个接口的数据格式不同

示例：[/recommend/playlist/u](http://api.qq.jsososo.com/recommend/playlist/u)

#### 2、按分类推荐歌单

接口：`/recommend/playlist`

参数：

`id`: 分类id，默认为 3317 // 3317: 官方歌单，59：经典，71：情歌，3056：网络歌曲，64：KTV热歌

`pageNo`: 页码，默认为 1

`pageSize`: 每页返回数量，默认为 20

示例：[/recommend/playlist](http://api.qq.jsososo.com/recommend/playlist)

#### 3、日推

接口：`/recommend/daily`

这个接口无需参数，强制使用传进来的 Cookie，返回日推歌单信息

#### 4、轮播图Banner

接口：`/recommend/banner`

这个接口无需参数，目前仅已知会返回专辑推荐，但是只能获取 `albumid`，非 `albummid`

示例：[/recommend/banner](http://api.qq.jsososo.com/recommend/banner)

### 最新推荐

#### 1、新歌推荐

接口：`/new/songs`,

参数：

`type`: 地区分类，默认为 0 // 0: 最新 1：内地，2：港台，3：欧美，4：韩国，5：日本

ps: 官方的接口其实不是这几个type，但是为了考虑与下面的新专和mv接口做兼容，所以做了改动

示例：[/new/songs](http://api.qq.jsososo.com/new/songs)

#### 2、新碟推荐（专辑）

接口：`/new/album`

参数：

`type`: 地区分类，默认为 1 // 1：内地，2：港台，3：欧美，4：韩国，5：日本，6：其他

`num`: 默认 10

这里和官方接口的参数是一致的

示例：[/new/album](http://api.qq.jsososo.com/new/album)

#### 3、新 MV 推荐

接口：`/new/mv`

参数：

`type`: 类型，默认为 0 // 0: 精选 1：内地，2：港台，3：欧美，4：韩国，5：日本

官方这个参数就更乱了，中英结合，还把日本拼成了 janpan，真是捉鸡

示例：[/new/mv](http://api.qq.jsososo.com/new/mv)

### 歌手

#### 1、歌手介绍

接口：`/singer/desc`

参数：

`singermid`: 必填

获取歌手的一些详细信息介绍

示例：[/singer/desc?singermid=0025NhlN2yWrP4](http://api.qq.jsososo.com/singer/desc?singermid=0025NhlN2yWrP4)

#### 2、获取热门歌曲

接口：`/singer/songs`

参数：

`singermid`: 必填

`num`: 返回歌曲数量

`page`: 页数 默认为第一页

示例：[/singer/songs?singermid=0025NhlN2yWrP4&page=1&num=20](http://api.qq.jsososo.com/singer/songs?singermid=0025NhlN2yWrP4&page=1&num=20)

#### 3、获取歌手专辑

接口：`/singer/album`

参数：

`singermid`: 必填

`pageNo`: 默认 1

`pageSize`: 默认 20

示例：[/singer/album?singermid=0025NhlN2yWrP4](http://api.qq.jsososo.com/singer/album?singermid=0025NhlN2yWrP4)

#### 4、获取mv

接口：`/singer/mv`

参数：

`singermid`: 必填

`pageNo`: 默认 1

`pageSize`: 默认 20

示例：[/singer/mv?singermid=0025NhlN2yWrP4](http://api.qq.jsososo.com/singer/mv?singermid=0025NhlN2yWrP4)

#### 5、相似歌手

接口：`/singer/sim`

参数：

`singermid`: 必填

官方接口是有返回数量参数的，但是最多只返回10个，所以这里就写死返回 10 个

示例：[/singer/sim?singermid=0025NhlN2yWrP4](http://api.qq.jsososo.com/singer/sim?singermid=0025NhlN2yWrP4)

#### 6、获取歌手分类

接口：`/singer/category`

这个接口没有参数，会返回 地区：`area`，类型：`genre`，首字母：`index`，性别/组合：`sex` 这些分类项的各个数据

示例：[/singer/category](http://api.qq.jsososo.com/singer/category)

#### 7、根据分类获取歌手列表

接口：`/singer/list`

参数：

`area`: 地区，默认 -100

`genre`: 风格，默认 -100

`index`: 首字母，默认 -100

`sex`: 性别/组合，默认 -100

`pageNo`: 默认 1

这个接口固定返回 80 条信息

示例：[/singer/list](http://api.qq.jsososo.com/singer/list)

### 专辑

#### 1、获取专辑信息

接口：`/album`

参数：

`albummid`: 必填

示例：[/album?albummid=002MAeob3zLXwZ](http://api.qq.jsososo.com/album?albummid=002MAeob3zLXwZ)

#### 2、获取专辑内的歌曲

接口：`/album/songs`

参数：

`albummid`: 必填

示例：[/album/songs?albummid=002MAeob3zLXwZ](http://api.qq.jsososo.com/album/songs?albummid=002MAeob3zLXwZ)

### 评论

#### 1、获取评论

接口：`/comment`

参数：

`id`: singid, albumid, tid, topid, vid  必填

`pageNo`: 默认 1

`pageSize`: 默认 20

`type`: 默认 0  // 0：获取最新评论，1：获取热评

`biztype`: 获取评论类型 1: 歌曲 2: 专辑 3: 歌单 4: 排行榜 5: mv

当 `pageNo` 为 1 且 `type` 为 0 时，会返回15条热评 `hot_comment`

返回结果说明：`ispraise` 表示这条评论是否被赞过，1: 是，0: 否；`enable_delete` 表示这条评论是否能被删除，1: 是，0: 否

上述的判断以 cookie 中的 `uin` 账号为准

示例：[/comment?id=97773](http://api.qq.jsososo.com/comment?id=97773)

#### 2、发送评论

接口：`/comment/send`

类型：仅支持 post

该接口需要用户登陆 cookie

参数：

`id`: singid, albumid, tid, topid, vid  必填

`biztype`: 发送评论类型 1: 歌曲 2: 专辑 3: 歌单 4: 排行榜 5: mv

`content`: 评论内容，必填，不超过300字

#### 3、删除评论

接口：`/comment/del`

该接口需要用户登陆 cookie

参数：

`id`: commentid  必填

只要登陆情况下，一般这个接口返回的都是操作成功，不管 `id` 是否存真实在（是鹅厂这样返回的！）

#### 4、点赞评论

接口：`/comment/like`

该接口需要用户登陆 cookie

参数：

`id`: commentid  必填

`type`: 1：点赞，2：取消赞，默认 1

### 电台

#### 1、电台分类

接口：`/radio/category`

返回电台场景分类以及场景下的各个电台

示例：[/radio/category](http://api.qq.jsososo.com/radio/category)

#### 2、获取电台歌曲

接口：`/radio`

参数：

`id`: 电台id，从上面的分类接口中获取

获取电台中歌曲，其中个性电台需要登陆 cookie

示例：[/radio?id=568](http://api.qq.jsososo.com/radio?id=568)

### MV

#### 1、获取 MV 信息

接口：`/mv`

参数：

`id`: 视频的 vid，必填

返回 `info` 为 MV 信息，`recommend` 为相关推荐的 MV

示例：[/mv?id=t0032kwa29w](http://api.qq.jsososo.com/mv?id=t0032kwa29w)

#### 2、获取 MV 播放链接

接口：`/mv/url`

参数：

`id`: 视频的 vid , 必填，多个用,分割

返回的链接都是可以直接播放的完整mv视频

示例：[/mv/url?id=t0032kwa29w](http://api.qq.jsososo.com/mv/url?id=t0032kwa29w)

#### 3、获取 MV 分类

接口：`/mv/category`

和获取歌手分类接口类似

示例：[/mv/category](http://api.qq.jsososo.com/mv/category)

#### 4、根据分类获取 MV 列表

接口：`/mv/list`

参数

`pageNo`: 默认 1

`pageSize`: 默认 20

`area`: 地区，默认 15 全部，具体数值从上面分类接口获取

`version`: MV 类型，默认 7 全部，具体数值从上面分类接口获取

示例：[/mv/list](http://api.qq.jsososo.com/mv/list)

#### 5、MV 点赞

接口：`/mv/like`

参数

`id`: 视频的 vid，必填

`type`: `1`: 点赞；`0`: 取消点赞。（默认`1`）

### 排行榜

#### 1、获取榜单列表

接口：`/top/category`

参数：

`showDetail`: 是否显示前三歌曲简单信息和榜单介绍，0，不显示，1 显示，默认 0

这个接口列出了几个榜单的分类，包含了榜单名、榜单 id、更新时间、播放量，（榜单介绍、前三歌曲非必传回）

示例：[/top/category](http://api.qq.jsososo.com/top/category)

#### 2、获取榜单详情

接口：`/top`

参数

`id`: 默认 4，从上面的列表中取值

`pageSize`: 默认 100 // 部分接口不支持这个字段，所以这里默认选择100

`period`: 榜单的时间，从上面的列表中取值，非必填

`time`: 默认当前时间，如果有 `period`，此参数无效

返回说明

`time`: 当前榜单的发布时间，可能是天，也可能是周

`timeType`: 当前榜单的时间格式 `YYYY_W` 或 `YYYY-MM-DD`

`rank`: 在榜单的排名

`rankType`: 1 上升，2 减少，3 持平，4 新歌，6 上升百分比

`rankValue`: 排名改变值

传入的 `time`、`period`并非必定与传回参数相同，比如，当榜单最新时间为 `2019_49`, 而传入 `period=2019_50`时，会返回 `2019_49`的榜单，
虽然这里不传或传入错误的 `period` 也会返回正确的数值，但是实际是通过第一次请求返回的结果来验证 `period` 是否正确，如果不正确会再进行第二次请求，
因此会造成返回的比较慢，尽量都传入上一个接口中返回的 `period`


### 关注、粉丝

#### 1、获取关注的歌手列表

接口：`/user/follow/singers`

该接口需要用户登陆 cookie

参数

`pageNo`: 默认 1

`pageSize`: 默认 20

`id`: 用户的 qq 号，默认为当前登陆用户

#### 2、获取关注的用户列表

接口：`/user/follow/users`

该接口需要用户登陆 cookie

参数

`pageNo`: 默认 1

`pageSize`: 默认 20

`id`: 用户的 qq 号，默认为当前登陆用户

#### 3、获取用户的粉丝列表

接口：`/user/fans`

该接口需要用户登陆 cookie

参数

`pageNo`: 默认 1

`pageSize`: 默认 20

`id`: 用户的 qq 号，默认为当前登陆用户

#### 4、关注/取消关注 歌手

接口：`/user/follow`

该接口需要用户登陆 cookie

`singermid`: 关注的歌手 mid，必填

`operation`: 操作，1：关注，2：取消关注，默认为 1

### 接口调用统计

接口的数据统计包含系统、ip、路径、浏览器等信息，已经忽略掉 node 接口自身调用的情况，数据为用 json 方式存储 （我会说是因为我不会用数据库嘛
`/data` 下还包含了很多其他接口，不过大部分都是用户不需要的，给管理员调用的，所以大家在源码里自己探索吧

#### 1、获取数据统计

接口： `/data`

参数

`type`: 默认 ip，可选：ip, browser, browserVersion, os, osVersion, path, url, host

`startTime`: 默认当前时间

`endTime`: 默认当前时间

这个接口会返回各个数据的统计结果
