# NeteaseCloudMusicApi
网易云音乐 NodeJS 版 API
## 灵感来自
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
[darknessomi/musicbox](https://github.com/darknessomi/musicbox)
[sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node)
## 工作原理
跨站请求伪造 (CSRF), 伪造请求头 , 调用官方 API
## 可以使用代理
在 query 参数中加上 proxy=your-proxy 即可让这一次的请求使用 proxy
```javascript
// 例子
const url = `http://localhost:3000/music/url?id=33894312&proxy=http://121.196.226.246:84`
fetch(url).then(function() {
// do what you want
})
// 结果
// {"data":[{"id":33894312,"url":"http://m10.music.126.net/20180104125640/930a968b3fb04908b733506b3833e60b/ymusic/0fd6/4f65/43ed/a8772889f38dfcb91c04da915b301617.mp3","br":320000,"size":10691439,"md5":"a8772889f38dfcb91c04da915b301617","code":200,"expi":1200,"type":"mp3","gain":-2.0E-4,"fee":0,"uf":null,"payed":0,"flag":0,"canExtend":false}],"code": 200}
```
## 版本新特性
### 2.8.3 | 2018.01.12
优化部分功能和文档
### 2.8.2 | 2018.01.05
增加 Dockerfile,支持以 Docker 容器模式运行
### 2.8.1 | 2018.01.04
添加了 proxy 功能
### 2.8.0 | 2018.01.04
用 'request' 重写了请求函数
### 2.6.5 | 2017.7.16
优化 CORS 设置
### 2.6.4 | 2017.7.16
添加缓存机制和随机 UA 机制 感谢[@u3u](https://github.com/u3u)
[issue:77](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/77) 优化请求
代码 感谢 [@huhuime](https://github.com/huhuime)
[issue:83](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/83)
### 2.5.0 | 2017.4.29
增加 mv/ 专辑 / 歌单评论接口 , 增加云盘相关接口 , 增加获取用户动态 / 信息接口 ,
增加关注 / 粉丝列表接口 , 增加收藏歌单接口 , 增加相似 mv/ 歌曲 / 用户接口 , 增加
banner 接口 , 增加刷新登录接口 , 增加电台相关接口 , 补充评论接口 , 更新文档
## 功能特性
1. 登录
2. 刷新登录
3. 获取用户信息 , 歌单,收藏,mv, dj 数量
4. 获取用户歌单
5. 获取用户电台
6. 获取用户关注列表
7. 获取用户粉丝列表
8. 获取用户动态
9. 获取用户播放记录
10. 获取精品歌单
11. 获取歌单详情
12. 搜索
13. 搜索建议
14. 获取歌词
15. 歌曲评论
16. 收藏单曲到歌单
17. 专辑评论
18. 歌单评论
19. mv 评论
20. 电台节目评论
21. banner
22. 获取歌曲详情
23. 获取专辑内容
24. 获取歌手单曲
25. 获取歌手 mv
26. 获取歌手专辑
27. 获取歌手描述
28. 获取相似歌手
29. 获取相似歌单
30. 相似 mv
31. 获取相似音乐
32. 获取最近 5 个听了这首歌的用户
33. 获取每日推荐歌单
34. 获取每日推荐歌曲
35. 私人 FM
36. 签到
37. 喜欢音乐
38. 垃圾桶
39. 歌单 ( 网友精选碟 )
40. 新碟上架
41. 热门歌手
42. 最新 mv
43. 推荐 mv
44. 推荐歌单
45. 推荐新音乐
46. 推荐电台
47. 推荐节目
48. 独家放送
49. mv 排行
50. 获取 mv 数据
51. 播放 mv
52. 排行榜
53. 歌手榜
54. 云盘
55. 电台 - 推荐
56. 电台 - 分类
57. 电台 - 分类推荐
58. 电台 - 订阅
59. 电台 - 详情
60. 电台 - 节目
61. 给评论点赞
62. 获取动态
## 安装
```shell
$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
$ npm install
```
## 运行
```shell
$ node app.js
```
服务器启动默认端口为 3000, 若不想使用 3000 端口 , 可使用以下命令 : Mac/Linux
```shell
$ PORT=4000 node app.js
```
windows 下使用 git-bash 或者 cmder 等终端执行以下命令 :
```shell
$ set PORT=4000 && node app.js
```
## Docker 容器运行
```shell
docker pull pengxiao/netease-music-api
docker run -d -p 3000:3000 pengxiao/netease-music-api
```
## 接口文档
### 调用前须知
* 为使用方便,降低门槛,登录接口直接使用了 get 明文请求,请按实际需求对源码修改
* 由于接口做了缓存处理 ( 缓存 2 分钟 , 可在 app.js 设置 , 可能会导致登陆后获取不
到 cookie), 相同的 url 会在两分钟内只向网易服务器发一次请求 , 如果遇到不需要缓
存结果的接口 , 可在请求 url 后面加一个时间戳参数使 url 不同 , 例子 :
`/simi/playlist?id=347230×tamp=1503019930000`
* 如果是跨域请求 , 请在所有请求带上 `xhrFields: { withCredentials: true }` 否则可能会因为没带上 cookie 导致 301, 具体例子可看 `public/test.html`, 例子使用 jquery, axios 版本也类似
* 301 错误基本都是没登录就调用了需要登录的接口 , 如果登陆了还是提示 301, 基本都
是缓存把数据缓存起来了 , 解决方法是等待 2 分钟或者重启服务重新登录后再调用接口
* 部分接口如登录接口不能调用太频繁 , 否则可能会触发 503 错误或者 ip 高频错误 ,
若需频繁调用 , 需要准备 IP 代理池 .
* 本项目仅供学习使用 , 文档可能会有缓存 , 如果文档版本和 github 上的版本不一致 ,
请清除缓存再查看
* 2.5.0 版本对部分原有 api 做了微调 , 不过只是调整了下地址 , 参数和返回结果不受影响
* 由于网易限制 , 此项目在国外服务器上使用会受到限制 , 如需解决 , 可使用大陆服务
器或者使用代理 , 感谢 [@hiyangguo](https://github.com/hiyangguo)提出
的[解决方法](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/29#issuecomment-298358438),
在 'util.js' 的 'headers' 处增加 `X-Real-IP':'211.161.244.70' // 任意国内 IP`
即可解决
### 登录
说明 : 登录有两个接口
#### 1. 手机登录
**必选参数 :** `phone`: 手机号码 `password`: 密码
**接口地址 :** `/login/cellphone`
**调用例子 :** `/login/cellphone?phone=xxx&password=yyy`
#### 2. 邮箱登录
> 注意 : 此接口被网易和谐了 , 待修复 , 暂时使用手机登录 (2017.05.20)
**必选参数 :** `email`: 163 网易邮箱 `password`: 密码
**接口地址 :** `/login`
**调用例子 :** `/login?email=xxx@163.com&password=yyy`
返回数据如下图 :
![登录](https://raw.githubusercontent.com/Binaryify/NeteaseCloudMusicApi/master/static/%E7%99%BB%E5%BD%95.png)
完成登录后 , 会在浏览器保存一个 Cookies 用作登录凭证 , 大部分 API 都需要用到这个
Cookies
#### 注意
调用登录接口的速度比调用其他接口慢 , 因为登录过程调用了加密算法
### 刷新登录
说明 : 调用此接口 , 可刷新登录状态
**调用例子 :** `/login/refresh`
### 获取用户详情
说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户详情
**必选参数 :** `uid` : 用户 id
**接口地址 :** `/user/detail`
**调用例子 :** `/user/detail?uid=32953014`
### 获取用户信息 , 歌单,收藏,mv, dj 数量
说明 : 登陆后调用此接口 , 可以获取用户信息
**接口地址 :** `/user/subcount`
**调用例子 :** `/user/subcount`
### 获取用户歌单
说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户歌单
**必选参数 :** `uid` : 用户 id
**接口地址 :** `/user/playlist`
**调用例子 :** `/user/playlist?uid=32953014`
返回数据如下图 :
![用户歌单](https://raw.githubusercontent.com/Binaryify/NeteaseCloudMusicApi/master/static/%E7%94%A8%E6%88%B7%E6%AD%8C%E5%8D%95.png)
### 获取用户电台
说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户电台
**必选参数 :** `uid` : 用户 id
**接口地址 :** `/user/dj`
**调用例子 :** `/user/dj?uid=32953014`
### 获取用户关注列表
说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户关注列表
**必选参数 :** `uid` : 用户 id
**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
**接口地址 :** `/user/follows`
**调用例子 :** `/user/follows?uid=32953014`
### 获取用户粉丝列�