From 4dfab517391a10232cf191faa148aa592f8a432e Mon Sep 17 00:00:00 2001
From: waterdanceTV <13169670619@163.com>
Date: Fri, 29 Dec 2017 15:46:41 +0800
Subject: [PATCH 01/16] improve
---
README.MD | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.MD b/README.MD
index b84b892..e988a31 100644
--- a/README.MD
+++ b/README.MD
@@ -1,5 +1,5 @@
# 网易云音乐 API
-网易云音乐 Node.js 版 API
+网易云音乐 Node.js API service
diff --git a/package.json b/package.json
index e758489..efd74f5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "NeteaseCloudMusicApi",
- "version": "2.7.9",
+ "version": "2.7.10",
"description": "网易云音乐 NodeJS 版 API",
"scripts": {
"start": "node app.js",
From 602a4dbc4c9ca518562d25c7e278841430cdd324 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Sun, 31 Dec 2017 18:45:33 +0800
Subject: [PATCH 02/16] =?UTF-8?q?=E7=94=A8request=E9=87=8D=E5=86=99?=
=?UTF-8?q?=E4=BA=86=E8=AF=B7=E6=B1=82=E9=83=A8=E5=88=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app.js | 2 +-
router/comment_music.js | 30 +++----
test/musicUrl.test.js | 41 +++++-----
util/util.js | 177 +++++++++++++++++-----------------------
4 files changed, 111 insertions(+), 139 deletions(-)
diff --git a/app.js b/app.js
index 2fec1b8..dac06d5 100644
--- a/app.js
+++ b/app.js
@@ -248,7 +248,7 @@ app.use("/user/record", require("./router/user_playrecord"));
const port = process.env.PORT || 3000;
app.listen(port, () => {
- console.log(`server running @${port}`);
+ console.log(`server running @ http://localhost:${port}`);
});
module.exports = app;
diff --git a/router/comment_music.js b/router/comment_music.js
index 9dff354..8c5697c 100644
--- a/router/comment_music.js
+++ b/router/comment_music.js
@@ -1,27 +1,27 @@
-const express = require('express')
-const router = express()
-const { createWebAPIRequest } = require('../util/util')
+const express = require("express");
+const router = express();
+const { createWebAPIRequest } = require("../util/util");
-router.get('/', (req, res) => {
- const rid = req.query.id
- const cookie = req.get('Cookie') ? req.get('Cookie') : ''
+router.get("/", (req, res) => {
+ const rid = req.query.id;
+ const cookie = req.get("Cookie") ? req.get("Cookie") : "";
const data = {
offset: req.query.offset || 0,
rid: rid,
limit: req.query.limit || 20,
- csrf_token: ''
- }
+ csrf_token: ""
+ };
createWebAPIRequest(
- 'music.163.com',
+ "music.163.com",
`/weapi/v1/resource/comments/R_SO_4_${rid}/?csrf_token=`,
- 'POST',
+ "POST",
data,
cookie,
music_req => {
- res.send(music_req)
+ res.send(music_req);
},
- err => res.status(502).send('fetch error')
- )
-})
+ err => res.status(502).send(err.message)
+ );
+});
-module.exports = router
+module.exports = router;
diff --git a/test/musicUrl.test.js b/test/musicUrl.test.js
index 3b10109..bd45286 100644
--- a/test/musicUrl.test.js
+++ b/test/musicUrl.test.js
@@ -1,32 +1,33 @@
-const assert = require('assert')
-const crypto = require('crypto')
-const { createWebAPIRequest } = require('../util/util')
+const assert = require("assert");
+const crypto = require("crypto");
+const { createWebAPIRequest } = require("../util/util");
-describe('测试获取歌曲是否正常', () => {
- it('歌曲的 url 不应该为空', done => {
- const id = 347230
- const br = 999000
+describe("测试获取歌曲是否正常", () => {
+ it("歌曲的 url 不应该为空", done => {
+ const id = 462791935;
+ const br = 999000;
const data = {
ids: [id],
br: br,
- csrf_token: ''
- }
- const cookie = ''
+ csrf_token: ""
+ };
+ const cookie = "";
createWebAPIRequest(
- 'music.163.com',
- '/weapi/song/enhance/player/url',
- 'POST',
+ "music.163.com",
+ "/weapi/song/enhance/player/url",
+ "POST",
data,
cookie,
music_req => {
- console.log(JSON.parse(music_req).data[0].url)
- assert(!!JSON.parse(music_req).data[0].url)
- done()
+ console.log(music_req);
+ console.log(JSON.parse(music_req).data[0].url);
+ assert(!!JSON.parse(music_req).data[0].url);
+ done();
},
err => {
- done(err)
+ done(err);
}
- )
- })
-})
+ );
+ });
+});
diff --git a/util/util.js b/util/util.js
index 0447cdb..f22c37b 100644
--- a/util/util.js
+++ b/util/util.js
@@ -1,32 +1,35 @@
-const Encrypt = require('./crypto.js')
-const http = require('http')
-const querystring = require('querystring')
+const Encrypt = require("./crypto.js");
+const request = require("request");
+request.debug = true;
+const http = require("http");
+const querystring = require("querystring");
function randomUserAgent() {
const userAgentList = [
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
- 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
- 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
- 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36',
- 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36',
- 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36',
- 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89;GameHelper',
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4',
- 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1',
- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
- 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0',
- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0',
- 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
- 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)',
- 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
- 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)',
- 'Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko',
- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586',
- 'Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1'
- ]
- const num = Math.floor(Math.random() * userAgentList.length)
- return userAgentList[num]
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
+ "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36",
+ "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) Mobile/14F89;GameHelper",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4",
+ "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:46.0) Gecko/20100101 Firefox/46.0",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0",
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
+ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
+ "Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko",
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/13.10586",
+ "Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/10.0 Mobile/14A300 Safari/602.1"
+ ];
+ const num = Math.floor(Math.random() * userAgentList.length);
+ return userAgentList[num];
}
+
function createWebAPIRequest(
host,
path,
@@ -36,94 +39,62 @@ function createWebAPIRequest(
callback,
errorcallback
) {
- let music_req = ''
- const cryptoreq = Encrypt(data)
- const http_client = http.request(
- {
- hostname: host,
- method: method,
- path: path,
- headers: {
- Accept: '*/*',
- 'Accept-Language': 'zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4',
- Connection: 'keep-alive',
- 'Content-Type': 'application/x-www-form-urlencoded',
- Referer: 'http://music.163.com',
- Host: 'music.163.com',
- Cookie: cookie,
- 'User-Agent': randomUserAgent()
- }
+ const cryptoreq = Encrypt(data);
+ const options = {
+ url: `http://${host}${path}`,
+ method: method,
+ headers: {
+ Accept: "*/*",
+ "Accept-Language": "zh-CN,zh;q=0.8,gl;q=0.6,zh-TW;q=0.4",
+ Connection: "keep-alive",
+ "Content-Type": "application/x-www-form-urlencoded",
+ Referer: "http://music.163.com",
+ Host: "music.163.com",
+ Cookie: cookie,
+ "User-Agent": randomUserAgent()
},
- function(res) {
- res.on('error', function(err) {
- errorcallback(err)
- })
- res.setEncoding('utf8')
- if (res.statusCode != 200) {
- createWebAPIRequest(host, path, method, data, cookie, callback)
- return
- } else {
- res.on('data', function(chunk) {
- music_req += chunk
- })
- res.on('end', function() {
- if (music_req == '') {
- createWebAPIRequest(host, path, method, data, cookie, callback)
- return
- }
- if (res.headers['set-cookie']) {
- callback(music_req, res.headers['set-cookie'])
- } else {
- callback(music_req)
- }
- })
- }
- }
- )
- http_client.write(
- querystring.stringify({
+ body: querystring.stringify({
params: cryptoreq.params,
encSecKey: cryptoreq.encSecKey
})
- )
- http_client.end()
+ };
+
+ request(options, function(error, res, body) {
+ if (error) {
+ errorcallback(error);
+ } else {
+ callback(body, res.headers["set-cookie"]);
+ }
+ });
}
-function createRequest(path, method, data, callback, errorcallback) {
+function createRequest(path, method, data) {
return new Promise((resolve, reject) => {
- let ne_req = ''
- const http_client = http.request(
- {
- hostname: 'music.163.com',
- method: method,
- path: path,
- headers: {
- Referer: 'http://music.163.com',
- Cookie: 'appver=1.5.2',
- 'Content-Type': 'application/x-www-form-urlencoded',
- 'User-Agent': randomUserAgent()
- }
- },
- res => {
- res.setEncoding('utf8')
- res.on('error', err => {
- reject(err)
- })
- res.on('data', chunk => {
- ne_req += chunk
- })
- res.on('end', () => {
- resolve(ne_req)
- })
+ const options = {
+ url: `http://music.163.com${path}`,
+ method: method,
+ headers: {
+ Referer: "http://music.163.com",
+ Cookie: "appver=1.5.2",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "User-Agent": randomUserAgent()
}
- )
- if (method == 'POST') {
- http_client.write(data)
+ };
+
+ if (method.toLowerCase() === "post") {
+ options.body = data;
}
- http_client.end()
- })
+
+ request(options, function(error, res, body) {
+ if (error) {
+ reject(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
}
module.exports = {
createWebAPIRequest,
createRequest
-}
+};
From f12c17ee9376cc4b0a8ffac78f6109a96b1b3b22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Wed, 3 Jan 2018 21:15:18 +0800
Subject: [PATCH 03/16] close debug mode
---
app.js | 1 -
util/util.js | 2 --
2 files changed, 3 deletions(-)
diff --git a/app.js b/app.js
index dac06d5..cd50609 100644
--- a/app.js
+++ b/app.js
@@ -1,5 +1,4 @@
const express = require("express");
-const http = require("http");
const apicache = require("apicache");
const path = require("path");
diff --git a/util/util.js b/util/util.js
index f22c37b..1ac5b80 100644
--- a/util/util.js
+++ b/util/util.js
@@ -1,7 +1,5 @@
const Encrypt = require("./crypto.js");
const request = require("request");
-request.debug = true;
-const http = require("http");
const querystring = require("querystring");
function randomUserAgent() {
From a47a0e17aee8c78bd6dde165e959df476e092b00 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Thu, 4 Jan 2018 00:53:54 +0800
Subject: [PATCH 04/16] use proxy from query.proxy
---
app.js | 8 ++++++++
util/util.js | 8 +++++++-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/app.js b/app.js
index cd50609..4698d78 100644
--- a/app.js
+++ b/app.js
@@ -23,6 +23,14 @@ app.use(cache("2 minutes", onlyStatus200));
app.use(express.static(path.resolve(__dirname, "public")));
+app.use(function(req, res, next) {
+ const proxy = req.query.proxy;
+ if (proxy) {
+ req.headers.cookie = req.headers.cookie + `__proxy__${proxy}`;
+ }
+ next();
+});
+
// 获取专辑内容
app.use("/album", require("./router/album"));
diff --git a/util/util.js b/util/util.js
index 1ac5b80..80fc7bb 100644
--- a/util/util.js
+++ b/util/util.js
@@ -2,6 +2,8 @@ const Encrypt = require("./crypto.js");
const request = require("request");
const querystring = require("querystring");
+request.debug = true;
+
function randomUserAgent() {
const userAgentList = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
@@ -37,6 +39,9 @@ function createWebAPIRequest(
callback,
errorcallback
) {
+ console.log(cookie);
+ const proxy = cookie.split("__proxy__")[1];
+ cookie = cookie.split("__proxy__")[0];
const cryptoreq = Encrypt(data);
const options = {
url: `http://${host}${path}`,
@@ -54,7 +59,8 @@ function createWebAPIRequest(
body: querystring.stringify({
params: cryptoreq.params,
encSecKey: cryptoreq.encSecKey
- })
+ }),
+ proxy: proxy
};
request(options, function(error, res, body) {
From 5ec46a12a64d6850470b0a17aaad453e75fe497d Mon Sep 17 00:00:00 2001
From: binaryify
Date: Thu, 4 Jan 2018 10:14:55 +0800
Subject: [PATCH 05/16] improve
---
CHANGELOG.MD | 4 ++++
package.json | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.MD b/CHANGELOG.MD
index 9260314..00c8808 100644
--- a/CHANGELOG.MD
+++ b/CHANGELOG.MD
@@ -1,4 +1,8 @@
# 更新日志
+### 2.8.0 | 2018.01.04
+
+用 'request' 重写了请求函数
+
### 2.7.9 | 2017.12.11
更新排行榜接口,新增云音乐ACG音乐榜,云音乐嘻哈榜
diff --git a/package.json b/package.json
index efd74f5..cd45674 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "NeteaseCloudMusicApi",
- "version": "2.7.10",
+ "version": "2.8.0",
"description": "网易云音乐 NodeJS 版 API",
"scripts": {
"start": "node app.js",
From dc186506f83b886e035b09b07bd98cfadce3d1f9 Mon Sep 17 00:00:00 2001
From: binaryify
Date: Thu, 4 Jan 2018 10:17:05 +0800
Subject: [PATCH 06/16] improve
---
docs/README.md | 865 +++++++++++++++++++++++++------------------------
1 file changed, 434 insertions(+), 431 deletions(-)
diff --git a/docs/README.md b/docs/README.md
index 35ed6a6..0cba4b7 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -12,7 +12,10 @@
## 工作原理
跨站请求伪造 (CSRF), 伪造请求头,调用官方 API
-## 版本新特性
+## 版本新特性
+### 2.8.0 | 2018.01.04
+用 'request' 重写了请求函数
+
### 2.6.5 | 2017.7.16
优化 CORS 设置
@@ -89,7 +92,7 @@
61. 给评论点赞
62. 获取动态
-## 安装
+## 安装
``` shell
$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
$ npm install
@@ -99,13 +102,13 @@ $ npm install
$ node app.js
```
-服务器启动默认端口为3000,若不想使用3000端口,可使用以下命令:
+服务器启动默认端口为3000,若不想使用3000端口,可使用以下命令:
Mac/Linux
```shell
$ PORT=4000 node app.js
```
-windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
+windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
```shell
$ set PORT=4000 && node app.js
```
@@ -117,7 +120,7 @@ $ set PORT=4000 && node app.js
- 301 错误基本都是没登录就调用了需要登录的接口,如果登陆了还是提示 301, 基本都是缓存把数据缓存起来了,解决方法是等待 2 分钟或者重启服务重新登录后再调用接口
-- 部分接口如登录接口不能调用太频繁,否则可能会触发503错误或者 ip 高频错误,若需频繁调用,需要准备 IP 代理池.
+- 部分接口如登录接口不能调用太频繁,否则可能会触发503错误或者 ip 高频错误,若需频繁调用,需要准备 IP 代理池.
- 本项目仅供学习使用,文档可能会有缓存,如果文档版本和 github 上的版本不一致,请清除缓存再查看
@@ -127,33 +130,33 @@ $ set PORT=4000 && node app.js
`X-Real-IP':'211.161.244.70' //任意国内IP` 即可解决
### 登录
-说明:登录有两个接口
-#### 1. 手机登录
+说明:登录有两个接口
+#### 1. 手机登录
-**必选参数:**
-`phone`: 手机号码
-`password`: 密码
+**必选参数:**
+`phone`: 手机号码
+`password`: 密码
-**接口地址:**
-`/login/cellphone`
+**接口地址:**
+`/login/cellphone`
-**调用例子:**
-`/login/cellphone?phone=xxx&password=yyy`
+**调用例子:**
+`/login/cellphone?phone=xxx&password=yyy`
-#### 2. 邮箱登录
->注意:此接口被网易和谐了,待修复,暂时使用手机登录(2017.05.20)
+#### 2. 邮箱登录
+>注意:此接口被网易和谐了,待修复,暂时使用手机登录(2017.05.20)
-**必选参数:**
-`email`: 163网易邮箱
-`password`: 密码
+**必选参数:**
+`email`: 163网易邮箱
+`password`: 密码
-**接口地址:**
-`/login`
+**接口地址:**
+`/login`
-**调用例子:**
-`/login?email=xxx@163.com&password=yyy`
+**调用例子:**
+`/login?email=xxx@163.com&password=yyy`
-返回数据如下图:
+返回数据如下图:

@@ -165,116 +168,116 @@ $ set PORT=4000 && node app.js
### 刷新登录
说明:调用此接口,可刷新登录状态
-**调用例子:**
+**调用例子:**
`/login/refresh`
### 获取用户详情
说明:登陆后调用此接口,传入用户 id, 可以获取用户详情
-**必选参数:**
-`uid` : 用户 id
+**必选参数:**
+`uid` : 用户 id
-**接口地址:**
-`/user/detail`
+**接口地址:**
+`/user/detail`
-**调用例子:**
-`/user/detail?uid=32953014`
+**调用例子:**
+`/user/detail?uid=32953014`
### 获取用户信息,歌单,收藏,mv, dj 数量
-说明:登陆后调用此接口,可以获取用户信息
+说明:登陆后调用此接口,可以获取用户信息
-**接口地址:**
-`/user/subcount`
+**接口地址:**
+`/user/subcount`
-**调用例子:**
-`/user/subcount`
+**调用例子:**
+`/user/subcount`
### 获取用户歌单
-说明:登陆后调用此接口,传入用户 id, 可以获取用户歌单
+说明:登陆后调用此接口,传入用户 id, 可以获取用户歌单
-**必选参数:**
-`uid` : 用户 id
+**必选参数:**
+`uid` : 用户 id
-**接口地址:**
-`/user/playlist`
+**接口地址:**
+`/user/playlist`
-**调用例子:**
-`/user/playlist?uid=32953014`
+**调用例子:**
+`/user/playlist?uid=32953014`
-返回数据如下图:
+返回数据如下图:

### 获取用户电台
-说明:登陆后调用此接口,传入用户 id, 可以获取用户电台
+说明:登陆后调用此接口,传入用户 id, 可以获取用户电台
-**必选参数:**
-`uid` : 用户 id
-
-**接口地址:**
-`/user/dj`
-
-**调用例子:**
-`/user/dj?uid=32953014`
-
-### 获取用户关注列表
-说明:登陆后调用此接口,传入用户 id, 可以获取用户关注列表
-
-**必选参数:**
+**必选参数:**
`uid` : 用户 id
-**可选参数:**
-`limit` : 返回数量,默认为30
+**接口地址:**
+`/user/dj`
+
+**调用例子:**
+`/user/dj?uid=32953014`
+
+### 获取用户关注列表
+说明:登陆后调用此接口,传入用户 id, 可以获取用户关注列表
+
+**必选参数:**
+`uid` : 用户 id
+
+**可选参数:**
+`limit` : 返回数量,默认为30
`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
-**接口地址:**
-`/user/follows`
+**接口地址:**
+`/user/follows`
-**调用例子:**
+**调用例子:**
`/user/follows?uid=32953014`
-### 获取用户粉丝列表
-说明:登陆后调用此接口,传入用户 id, 可以获取用户粉丝列表
+### 获取用户粉丝列表
+说明:登陆后调用此接口,传入用户 id, 可以获取用户粉丝列表
-**必选参数:**
+**必选参数:**
`uid` : 用户 id
-**可选参数:**
-`limit` : 返回数量,默认为30
+**可选参数:**
+`limit` : 返回数量,默认为30
`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
-**接口地址:**
-`/user/followeds`
+**接口地址:**
+`/user/followeds`
-**调用例子:**
+**调用例子:**
`/user/followeds?uid=32953014`
### 获取用户动态
说明:登陆后调用此接口,传入用户 id, 可以获取用户动态
-**必选参数:**
+**必选参数:**
`uid` : 用户 id
-**接口地址:**
-`/user/event`
+**接口地址:**
+`/user/event`
-**调用例子:**
+**调用例子:**
`/user/event?uid=32953014`
### 获取用户播放记录
说明:登陆后调用此接口,传入用户 id,可获取用户播放记录
-**必选参数:**
+**必选参数:**
`uid` : 用户 id
-**可选参数:**
+**可选参数:**
`type` : type=1时只返回weekData, type=0时返回allData
-**接口地址:**
-`/user/record`
+**接口地址:**
+`/user/record`
-**调用例子:**
+**调用例子:**
`/user/record?uid=32953014&type=1`
### 获取动态消息
@@ -283,87 +286,87 @@ $ set PORT=4000 && node app.js
**必选参数:**
未知
-**接口地址:**
+**接口地址:**
`/event`
-**调用例子:**
+**调用例子:**
`/event`
-### 获取精品歌单
+### 获取精品歌单
说明:调用此接口,可获取精品歌单
-**可选参数:**
-`cat`: tag, 比如 "华语"、"古风" 、"欧美"、"流行",默认为"全部"
+**可选参数:**
+`cat`: tag, 比如 "华语"、"古风" 、"欧美"、"流行",默认为"全部"
-`limit`: 取出歌单数量,默认为20
+`limit`: 取出歌单数量,默认为20
-**接口地址:**
-`/top/playlist/highquality`
+**接口地址:**
+`/top/playlist/highquality`
-**调用例子:**
+**调用例子:**
`/top/playlist/highquality?limit=30`
-### 获取歌单详情
-说明:歌单能看到歌单名字,但看不到具体歌单内容,调用此接口,传入歌单 id,可以获取对应歌单内的所有的音乐
+### 获取歌单详情
+说明:歌单能看到歌单名字,但看不到具体歌单内容,调用此接口,传入歌单 id,可以获取对应歌单内的所有的音乐
-**必选参数:**
-`id` : 歌单 id
+**必选参数:**
+`id` : 歌单 id
-**接口地址:**
-`/playlist/detail`
+**接口地址:**
+`/playlist/detail`
-**调用例子:**
-`/playlist/detail?id=24381616`
+**调用例子:**
+`/playlist/detail?id=24381616`
-返回数据如下图:
+返回数据如下图:

### 获取音乐 url
-说明:使用歌单详情接口后,能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口,传入的音乐 id(可多个,用逗号隔开),可以获取对应的音乐的 url(不需要登录)
+说明:使用歌单详情接口后,能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口,传入的音乐 id(可多个,用逗号隔开),可以获取对应的音乐的 url(不需要登录)
>注:部分用户反馈获取的 url 会 403,[hwaphon](https://github.com/hwaphon)找到的解决方案是当获取到音乐的 id 后,将 http://music.163.com/song/media/outer/url?id=id.mp3 以src 赋予 Audio即可播放
-**必选参数:**
-`id` : 音乐 id
+**必选参数:**
+`id` : 音乐 id
-**接口地址:**
-`/music/url`
+**接口地址:**
+`/music/url`
-**调用例子:**
-`/music/url?id=347230`
+**调用例子:**
+`/music/url?id=347230`
`/music/url?id=347230,347231`
-返回数据如下图:
+返回数据如下图:

### 搜索
-说明:调用此接口,传入搜索关键词可以搜索该音乐/专辑/歌手/歌单/用户,关键词可以多个,以空格隔开,如"周杰伦 搁浅"(不需要登录),搜索获取的 mp3url 不能直接用,可通过 `/music/url` 接口传入歌曲 id 获取具体的播放链接
+说明:调用此接口,传入搜索关键词可以搜索该音乐/专辑/歌手/歌单/用户,关键词可以多个,以空格隔开,如"周杰伦 搁浅"(不需要登录),搜索获取的 mp3url 不能直接用,可通过 `/music/url` 接口传入歌曲 id 获取具体的播放链接
-**必选参数:**
-`keywords` : 关键词
+**必选参数:**
+`keywords` : 关键词
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**可选参数:**
+`limit` : 返回数量,默认为30
+`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
-`type`: 搜索类型;默认为1即单曲,取值意义:
-1: 单曲
-10: 专辑
-100: 歌手
-1000: 歌单
-1002: 用户
-1004: MV
-1006: 歌词
-1009: 电台
+`type`: 搜索类型;默认为1即单曲,取值意义:
+1: 单曲
+10: 专辑
+100: 歌手
+1000: 歌单
+1002: 用户
+1004: MV
+1006: 歌词
+1009: 电台
-**接口地址:**
-`/search`
+**接口地址:**
+`/search`
-**调用例子:**
-`/search?keywords=海阔天空`
+**调用例子:**
+`/search?keywords=海阔天空`
返回数据如下图:

@@ -371,88 +374,88 @@ $ set PORT=4000 && node app.js
### 搜索建议
说明:调用此接口,传入搜索关键词可获得搜索建议,搜索结果同时包含单曲,歌手,歌单,mv 信息
-**必选参数:**
-`keywords` : 关键词
+**必选参数:**
+`keywords` : 关键词
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**可选参数:**
+`limit` : 返回数量,默认为30
+`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
-`type`: 搜索类型;默认为1即单曲,取值意义:
-1: 单曲
-10: 专辑
-100: 歌手
-1000: 歌单
-1002: 用户
-1004: MV
-1006: 歌词
-1009: 电台
+`type`: 搜索类型;默认为1即单曲,取值意义:
+1: 单曲
+10: 专辑
+100: 歌手
+1000: 歌单
+1002: 用户
+1004: MV
+1006: 歌词
+1009: 电台
-**接口地址:**
-`/search/suggest`
+**接口地址:**
+`/search/suggest`
-**调用例子:**
-`/search/suggest?keywords=海阔天空`
+**调用例子:**
+`/search/suggest?keywords=海阔天空`
### 搜索多重匹配
-说明:调用此接口,传入搜索关键词可获得搜索结果
+说明:调用此接口,传入搜索关键词可获得搜索结果
-**必选参数:**
-`keywords` : 关键词
+**必选参数:**
+`keywords` : 关键词
-**接口地址:**
-`/search/multimatch`
+**接口地址:**
+`/search/multimatch`
-**调用例子:**
-`/search/multimatch?keywords=海阔天空`
+**调用例子:**
+`/search/multimatch?keywords=海阔天空`
### 收藏单曲到歌单
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(需要登录)
-**必选参数:**
+**必选参数:**
`op`: 从歌单增加单曲为add,删除为 del
`pid`: 歌单id
`tracks`: 歌曲id
-**接口地址:**
-`/playlist/tracks`
+**接口地址:**
+`/playlist/tracks`
-**调用例子:**
+**调用例子:**
`/playlist/tracks?op=add&pid=24381616&tracks=347230` (对应把'海阔天空'添加到'我'的歌单,测试的时候请把这里的 pid换成你自己的)
### 获取歌词
-说明:调用此接口,传入音乐 id 可获得对应音乐的歌词(不需要登录)
+说明:调用此接口,传入音乐 id 可获得对应音乐的歌词(不需要登录)
-**必选参数:**
-`id`: 音乐 id
+**必选参数:**
+`id`: 音乐 id
-**接口地址:**
-`/lyric`
+**接口地址:**
+`/lyric`
-**调用例子:**
-`/lyric?id=347230`
+**调用例子:**
+`/lyric?id=347230`
返回数据如下图:

### 歌曲评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该音乐的所有评论(不需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该音乐的所有评论(不需要登录)
-**必选参数:**
-`id`: 音乐 id
+**必选参数:**
+`id`: 音乐 id
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**可选参数:**
+`limit`: 取出评论数量,默认为20
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
-**接口地址:**
-`/comment/music`
+**接口地址:**
+`/comment/music`
-**调用例子:**
+**调用例子:**
`/comment/music?id=186016&limit=1` 对应晴天评论
返回数据如下图:
@@ -460,82 +463,82 @@ $ set PORT=4000 && node app.js
### 专辑评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(不需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(不需要登录)
-**必选参数:**
-`id`: 专辑 id
+**必选参数:**
+`id`: 专辑 id
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**可选参数:**
+`limit`: 取出评论数量,默认为20
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
-**接口地址:**
-`/comment/album`
+**接口地址:**
+`/comment/album`
-**调用例子:**
+**调用例子:**
`/comment/album?id=32311`
### 歌单评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该歌单的所有评论(不需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该歌单的所有评论(不需要登录)
-**必选参数:**
-`id`: 歌单 id
+**必选参数:**
+`id`: 歌单 id
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**可选参数:**
+`limit`: 取出评论数量,默认为20
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
-**接口地址:**
-`/comment/playlist`
+**接口地址:**
+`/comment/playlist`
-**调用例子:**
+**调用例子:**
`/comment/playlist?id=705123491`
### mv 评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 mv 的所有评论(不需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 mv 的所有评论(不需要登录)
-**必选参数:**
-`id`: mv id
+**必选参数:**
+`id`: mv id
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**可选参数:**
+`limit`: 取出评论数量,默认为20
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
-**接口地址:**
-`/comment/mv`
+**接口地址:**
+`/comment/mv`
-**调用例子:**
+**调用例子:**
`/comment/mv?id=5436712`
### 电台节目评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 电台节目 的所有评论(不需要登录)
+说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 电台节目 的所有评论(不需要登录)
-**必选参数:**
-`id`: 电台节目的 id
+**必选参数:**
+`id`: 电台节目的 id
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**可选参数:**
+`limit`: 取出评论数量,默认为20
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
-**接口地址:**
-`/comment/dj`
+**接口地址:**
+`/comment/dj`
-**调用例子:**
+**调用例子:**
`/comment/dj?id=794062371`
### 给评论点赞
说明:调用此接口,传入 type, 资源 id, 和评论id cid和 是否点赞参数 t 即可给对应评论点赞(需要登录)
-**必选参数:**
-`id` : 资源 id, 如歌曲 id,mv id
+**必选参数:**
+`id` : 资源 id, 如歌曲 id,mv id
-`cid` : 评论 id
+`cid` : 评论 id
-`t` :是否点赞,1为点赞,0为取消点赞
+`t` :是否点赞,1为点赞,0为取消点赞
`tpye`: 数字,资源类型,对应歌曲, mv, 专辑,歌单,电台
对应以下类型
@@ -546,35 +549,35 @@ $ set PORT=4000 && node app.js
2: 歌单
3: 专辑
4: 电台
-```
+```
-**接口地址:**
-`comment/like`
+**接口地址:**
+`comment/like`
-**调用例子:**
+**调用例子:**
`/comment/like?id=186016&cid=4956438&t=1&type=0` 对应给晴天最热门的那条评论点赞
### banner
-说明:调用此接口,可获取 banner(轮播图)数据
+说明:调用此接口,可获取 banner(轮播图)数据
注:因参数未知,只能获取比较旧的数据,如果有知道参数的小伙伴,可提交 PR
-**接口地址:**
-`/banner`
+**接口地址:**
+`/banner`
-**调用例子:**
+**调用例子:**
`/banner`
### 获取歌曲详情
-说明:调用此接口,传入音乐 id, 可获得歌曲详情
+说明:调用此接口,传入音乐 id, 可获得歌曲详情
-**必选参数:**
+**必选参数:**
`ids`: 音乐 id,如 `ids=347230`
-**接口地址:**
-`/song/detail`
+**接口地址:**
+`/song/detail`
-**调用例子:**
-`/song/detail?ids=347230`
+**调用例子:**
+`/song/detail?ids=347230`
返回数据如下图:

@@ -583,14 +586,14 @@ $ set PORT=4000 && node app.js
### 获取专辑内容
说明:调用此接口,传入专辑 id,可获得专辑内容
-**必选参数:**
+**必选参数:**
`id`: 专辑 id
-**接口地址:**
-`/album`
+**接口地址:**
+`/album`
-**调用例子:**
-`/album?id=32311`
+**调用例子:**
+`/album?id=32311`
返回数据如下图:

@@ -598,14 +601,14 @@ $ set PORT=4000 && node app.js
### 获取歌手单曲
说明:调用此接口,传入歌手 id,可获得歌手单曲
-**必选参数:**
+**必选参数:**
`id`: 歌手 id,可由搜索接口获得
-**接口地址:**
-`/artists`
+**接口地址:**
+`/artists`
-**调用例子:**
-`/artists?id=6452`
+**调用例子:**
+`/artists?id=6452`
返回数据如下图:

@@ -614,30 +617,30 @@ $ set PORT=4000 && node app.js
说明:调用此接口,传入歌手 id,可获得歌手 mv 信息,具体 mv 播放地址可调用`/mv`传入此接口获得的mvid 来拿到,如:
`/artist/mv?id=6452`,`/mv?mvid=5461064`
-**必选参数:**
+**必选参数:**
`id`: 歌手 id,可由搜索接口获得
-**接口地址:**
-`/artist/mv`
+**接口地址:**
+`/artist/mv`
-**调用例子:**
-`/artist/mv?id=6452`
+**调用例子:**
+`/artist/mv?id=6452`
### 获取歌手专辑
说明:调用此接口,传入歌手 id,可获得歌手专辑内容
-**必选参数:**
+**必选参数:**
`id`: 歌手 id
-**可选参数:**
-`limit`: 取出数量,默认为50
+**可选参数:**
+`limit`: 取出数量,默认为50
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
-**接口地址:**
-`/artist/album`
+**接口地址:**
+`/artist/album`
-**调用例子:**
+**调用例子:**
`/artist/album?id=6452&limit=30` (周杰伦)
返回数据如下图:
@@ -646,37 +649,37 @@ $ set PORT=4000 && node app.js
### 获取歌手描述
说明:调用此接口,传入歌手 id,可获得歌手描述
-**必选参数:**
+**必选参数:**
`id`: 歌手 id
-**接口地址:**
-`/artist/desc`
+**接口地址:**
+`/artist/desc`
-**调用例子:**
+**调用例子:**
`/artist/desc?id=6452` (周杰伦)
### 获取相似歌手
说明:调用此接口,传入歌手 id,可获得相似歌手
-**必选参数:**
+**必选参数:**
`id`: 歌手 id
-**接口地址:**
-`/simi/artist`
+**接口地址:**
+`/simi/artist`
-**调用例子:**
+**调用例子:**
`/simi/artist?id=6452` (对应和周杰伦相似歌手)
### 获取相似歌单
说明:调用此接口,传入歌曲 id,可获得相似歌单
-**必选参数:**
+**必选参数:**
`id`: 歌曲 id
-**接口地址:**
-`/simi/playlist`
+**接口地址:**
+`/simi/playlist`
-**调用例子:**
+**调用例子:**
`/simi/playlist?id=347230` (对应'光辉岁月'相似歌单)
@@ -685,86 +688,86 @@ $ set PORT=4000 && node app.js
**必选参数:**
`mvid`: mv id
-**接口地址:**
-`/simi/mv`
+**接口地址:**
+`/simi/mv`
-**调用例子:**
-`/simi/mv?mvid=5436712`
+**调用例子:**
+`/simi/mv?mvid=5436712`
### 获取相似音乐
说明:调用此接口,传入歌曲 id,可获得相似歌曲
-**必选参数:**
+**必选参数:**
`id`: 歌曲 id
-**接口地址:**
-`/simi/song`
+**接口地址:**
+`/simi/song`
-**调用例子:**
+**调用例子:**
`/simi/song?id=347230` (对应'光辉岁月'相似歌曲)
### 获取最近5个听了这首歌的用户
说明:调用此接口,传入歌曲 id,最近5个听了这首歌的用户
-**必选参数:**
+**必选参数:**
`id`: 歌曲 id
-**接口地址:**
-`/simi/user`
+**接口地址:**
+`/simi/user`
-**调用例子:**
+**调用例子:**
`/simi/user?id=347230` (对应'光辉岁月'相似歌曲)
### 获取每日推荐歌单
-说明:调用此接口,可获得每日推荐歌单(需要登录)
+说明:调用此接口,可获得每日推荐歌单(需要登录)
-**接口地址:**
-`/recommend/resource`
+**接口地址:**
+`/recommend/resource`
-**调用例子:**
-`/recommend/resource`
+**调用例子:**
+`/recommend/resource`
返回数据如下图:

### 获取每日推荐歌曲
-说明:调用此接口,可获得每日推荐歌曲(需要登录)
+说明:调用此接口,可获得每日推荐歌曲(需要登录)
-**接口地址:**
-`/recommend/songs`
+**接口地址:**
+`/recommend/songs`
-**调用例子:**
-`/recommend/songs`
+**调用例子:**
+`/recommend/songs`
返回数据如下图:

### 私人 FM
-说明:私人 FM( 需要登录)
+说明:私人 FM( 需要登录)
-**接口地址:**
-`/personal_fm`
+**接口地址:**
+`/personal_fm`
-**调用例子:**
-`/personal_fm`
+**调用例子:**
+`/personal_fm`
返回数据如下图:

### 签到
-说明:调用此接口,传入签到类型(可不传,默认安卓端签到),可签到(需要登录),其中安卓端签到可获得3点经验, web/PC 端签到可获得2点经验
-**可选参数:**
-`type`: 签到类型,默认 0, 其中 0 为安卓端签到,1为 web/PC 签到
+说明:调用此接口,传入签到类型(可不传,默认安卓端签到),可签到(需要登录),其中安卓端签到可获得3点经验, web/PC 端签到可获得2点经验
+**可选参数:**
+`type`: 签到类型,默认 0, 其中 0 为安卓端签到,1为 web/PC 签到
-**接口地址:**
-`/daily_signin`
+**接口地址:**
+`/daily_signin`
-**调用例子:**
-`/daily_signin`
+**调用例子:**
+`/daily_signin`
返回数据如下图:
@@ -774,19 +777,19 @@ $ set PORT=4000 && node app.js
### 喜欢音乐
-说明:调用此接口,传入音乐 id, 可喜欢该音乐
+说明:调用此接口,传入音乐 id, 可喜欢该音乐
-**必选参数:**
-`id`: 歌曲 id
+**必选参数:**
+`id`: 歌曲 id
-**可选参数:**
-`like`: 布尔值,默认为 true 即喜欢,若传 false, 则取消喜欢
+**可选参数:**
+`like`: 布尔值,默认为 true 即喜欢,若传 false, 则取消喜欢
-**接口地址:**
-`/like`
+**接口地址:**
+`/like`
-**调用例子:**
-`/like?id=347230`
+**调用例子:**
+`/like?id=347230`
返回数据如下图:
@@ -801,48 +804,48 @@ $ set PORT=4000 && node app.js
### 垃圾桶
说明:调用此接口,传入音乐 id, 可把该音乐从私人 FM中移除至垃圾桶
-**必选参数:**
+**必选参数:**
`id`: 歌曲 id
-**接口地址:**
-`/fm_trash`
+**接口地址:**
+`/fm_trash`
-**调用例子:**
-`/fm_trash?id=347230`
+**调用例子:**
+`/fm_trash?id=347230`
返回数据如下图:

### 歌单(网友精选碟)
-说明:调用此接口,可获取网友精选碟歌单
+说明:调用此接口,可获取网友精选碟歌单
-**可选参数:**
+**可选参数:**
`order`: 可选值为 'new' 和 'hot',分别对应最新和最热,默认为 'hot'
-**接口地址:**
-`/top/playlist`
+**接口地址:**
+`/top/playlist`
-**调用例子:**
-`/top/playlist?limit=10&order=new`
+**调用例子:**
+`/top/playlist?limit=10&order=new`
返回数据如下图:

### 新碟上架
-说明:调用此接口,可获取新碟上架列表,如需具体音乐信息需要调用获取专辑列表接口 `/album` ,然后传入 id, 如 `/album?id=32311&limit=30`
+说明:调用此接口,可获取新碟上架列表,如需具体音乐信息需要调用获取专辑列表接口 `/album` ,然后传入 id, 如 `/album?id=32311&limit=30`
-**可选参数:**
-`limit`: 取出数量,默认为50
+**可选参数:**
+`limit`: 取出数量,默认为50
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
-**接口地址:**
-`/top/album`
+**接口地址:**
+`/top/album`
-**调用例子:**
-`/top/album?offset=0&limit=30`
+**调用例子:**
+`/top/album?offset=0&limit=30`
返回数据如下图:
@@ -851,16 +854,16 @@ $ set PORT=4000 && node app.js
### 热门歌手
说明:调用此接口,可获取热门歌手数据
-**可选参数:**
-`limit`: 取出数量,默认为50
+**可选参数:**
+`limit`: 取出数量,默认为50
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
-**接口地址:**
-`/top/artists`
+**接口地址:**
+`/top/artists`
-**调用例子:**
-`/top/artists?offset=0&limit=30`
+**调用例子:**
+`/top/artists?offset=0&limit=30`
返回数据如下图:
@@ -869,95 +872,95 @@ $ set PORT=4000 && node app.js
### 最新 mv
说明:调用此接口,可获取最新 mv
-**可选参数:**
-`limit`: 取出数量,默认为 30
+**可选参数:**
+`limit`: 取出数量,默认为 30
-**接口地址:**
-`/mv/first`
+**接口地址:**
+`/mv/first`
-**调用例子:**
-`/mv/first?limit=10`
+**调用例子:**
+`/mv/first?limit=10`
### 推荐 mv
说明:调用此接口,可获取推荐 mv
-**接口地址:**
-`/personalized/mv`
+**接口地址:**
+`/personalized/mv`
-**调用例子:**
-`/personalized/mv`
+**调用例子:**
+`/personalized/mv`
### 推荐歌单
说明:调用此接口,可获取推荐歌单
-**接口地址:**
-`/personalized`
+**接口地址:**
+`/personalized`
-**调用例子:**
-`/personalized`
+**调用例子:**
+`/personalized`
### 推荐新音乐
说明:调用此接口,可获取推荐新音乐
-**接口地址:**
-`/personalized/newsong`
+**接口地址:**
+`/personalized/newsong`
-**调用例子:**
+**调用例子:**
`/personalized/newsong`
### 推荐电台
说明:调用此接口,可获取推荐电台
-**接口地址:**
-`/personalized/djprogram`
+**接口地址:**
+`/personalized/djprogram`
-**调用例子:**
+**调用例子:**
`/personalized/djprogram`
### 推荐节目
说明:调用此接口,可获取推荐电台
-**接口地址:**
-`/program/recommend`
+**接口地址:**
+`/program/recommend`
-**调用例子:**
+**调用例子:**
`/program/recommend`
### 独家放送
说明:调用此接口,可获取独家放送
-**接口地址:**
-`/personalized/privatecontent`
+**接口地址:**
+`/personalized/privatecontent`
-**调用例子:**
+**调用例子:**
`/personalized/privatecontent`
### mv 排行
说明:调用此接口,可获取 mv 排行
-**可选参数:**
-`limit`: 取出数量,默认为 30
+**可选参数:**
+`limit`: 取出数量,默认为 30
-`offset`: 偏移数量,用于分页,如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+`offset`: 偏移数量,用于分页,如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
-**接口地址:**
-`top/mv`
+**接口地址:**
+`top/mv`
-**调用例子:**
+**调用例子:**
`top/mv?limit=10`
### 获取 mv 数据
-说明:调用此接口,传入 mvid (在搜索音乐的时候传 type=1004获得) ,可获取对应 MV 数据,数据包含 mv 名字,歌手,发布时间, mv 视频地址等数据,其中 mv 视频网易做了防盗链处理,不能直接播放,需要播放的话需要调用'播放 mv' 接口
+说明:调用此接口,传入 mvid (在搜索音乐的时候传 type=1004获得) ,可获取对应 MV 数据,数据包含 mv 名字,歌手,发布时间, mv 视频地址等数据,其中 mv 视频网易做了防盗链处理,不能直接播放,需要播放的话需要调用'播放 mv' 接口
-**必选参数:**
+**必选参数:**
`mvid`: mv 的 id
-**接口地址:**
-`/mv`
+**接口地址:**
+`/mv`
-**调用例子:**
-`/mv?mvid=5436712`
+**调用例子:**
+`/mv?mvid=5436712`
返回数据如下图:
@@ -965,16 +968,16 @@ $ set PORT=4000 && node app.js
### 播放 mv
-说明:调用此接口,传入 mv 地址,可播放 mv,也可将接口嵌入 video 标签使用,由于使用了 'pipe',进度条无法通过拖动进度条控制进度,如有解决方案可提出 PR 或者自行改造
+说明:调用此接口,传入 mv 地址,可播放 mv,也可将接口嵌入 video 标签使用,由于使用了 'pipe',进度条无法通过拖动进度条控制进度,如有解决方案可提出 PR 或者自行改造
-**可选参数:**
+**可选参数:**
`url`: mv 的 地址
-**接口地址:**
-`/mv/url`
+**接口地址:**
+`/mv/url`
-**调用例子:**
-`/mv/url?url=http://v4.music.126.net/20170422034915/c98eab2f5e2c85fc8de2ab3f0f8ed1c6/web/cloudmusic/MjQ3NDQ3MjUw/89a6a279dc2acfcd068b45ce72b1f560/533e4183a709699d566180ed0cd9abe9.mp4`
+**调用例子:**
+`/mv/url?url=http://v4.music.126.net/20170422034915/c98eab2f5e2c85fc8de2ab3f0f8ed1c6/web/cloudmusic/MjQ3NDQ3MjUw/89a6a279dc2acfcd068b45ce72b1f560/533e4183a709699d566180ed0cd9abe9.mp4`
如下图:
@@ -984,41 +987,41 @@ $ set PORT=4000 && node app.js
### 排行榜
说明:调用此接口,传入数字 idx, 可获取不同排行榜
-**必选参数:**
-`idx`: 对象 key, 对应以下排行榜
+**必选参数:**
+`idx`: 对象 key, 对应以下排行榜
```
-"0": 云音乐新歌榜,
-"1": 云音乐热歌榜,
-"2": 网易原创歌曲榜,
-"3": 云音乐飙升榜,
-"4": 云音乐电音榜,
-"5": UK排行榜周榜,
-"6": 美国Billboard周榜
-"7": KTV嗨榜,
-"8": iTunes榜,
-"9": Hit FM Top榜,
-"10": 日本Oricon周榜
-"11": 韩国Melon排行榜周榜,
-"12": 韩国Mnet排行榜周榜,
-"13": 韩国Melon原声周榜,
-"14": 中国TOP排行榜(港台榜),
-"15": 中国TOP排行榜(内地榜)
-"16": 香港电台中文歌曲龙虎榜,
-"17": 华语金曲榜,
-"18": 中国嘻哈榜,
-"19": 法国 NRJ EuroHot 30周榜,
-"20": 台湾Hito排行榜,
+"0": 云音乐新歌榜,
+"1": 云音乐热歌榜,
+"2": 网易原创歌曲榜,
+"3": 云音乐飙升榜,
+"4": 云音乐电音榜,
+"5": UK排行榜周榜,
+"6": 美国Billboard周榜
+"7": KTV嗨榜,
+"8": iTunes榜,
+"9": Hit FM Top榜,
+"10": 日本Oricon周榜
+"11": 韩国Melon排行榜周榜,
+"12": 韩国Mnet排行榜周榜,
+"13": 韩国Melon原声周榜,
+"14": 中国TOP排行榜(港台榜),
+"15": 中国TOP排行榜(内地榜)
+"16": 香港电台中文歌曲龙虎榜,
+"17": 华语金曲榜,
+"18": 中国嘻哈榜,
+"19": 法国 NRJ EuroHot 30周榜,
+"20": 台湾Hito排行榜,
"21": Beatport全球电子舞曲榜,
"22": 云音乐ACG音乐榜,
"23": 云音乐嘻哈榜
```
-**接口地址:**
-`/top/list`
+**接口地址:**
+`/top/list`
-**调用例子:**
-`/top/list?idx=6`
+**调用例子:**
+`/top/list?idx=6`
返回数据如下图:
@@ -1027,87 +1030,87 @@ $ set PORT=4000 && node app.js
### 歌手榜
说明:调用此接口,可获取PC版排行榜中的歌手榜
-**接口地址:**
-`/toplist/artist`
+**接口地址:**
+`/toplist/artist`
-**调用例子:**
+**调用例子:**
`/toplist/artist`
### 云盘
说明:登陆后调用此接口,可获取云盘数据,获取的数据没有对应 url,需要再调用一次 `/music/url` 获取 url
-**接口地址:**
-`/user/cloud`
+**接口地址:**
+`/user/cloud`
-**调用例子:**
+**调用例子:**
`/user/cloud`
### 电台-推荐
说明:登陆后调用此接口,可获得推荐电台
-**接口地址:**
-`/dj/recommend`
+**接口地址:**
+`/dj/recommend`
-**调用例子:**
+**调用例子:**
`/dj/recommend`
### 电台-分类
说明:登陆后调用此接口,可获得电台类型
-**接口地址:**
-`/dj/catelist`
+**接口地址:**
+`/dj/catelist`
-**调用例子:**
+**调用例子:**
`/dj/catelist`
### 电台-分类推荐
说明:登陆后调用此接口,可获得推荐电台
-**必选参数:**
+**必选参数:**
`type`: 电台类型,数字,可通过`/dj/catelist`获取,对应关系为 id 对应 此接口的 type, name 对应类型意义
-**接口地址:**
-`/dj/recommend/type`
+**接口地址:**
+`/dj/recommend/type`
-**调用例子:**
+**调用例子:**
`/dj/recommend/type?type=1`
### 电台-订阅
说明:登陆后调用此接口,传入`rid`,可订阅 dj,dj 的 `rid` 可通过搜索指定 type='1009'获取其 id,如`/search?keywords=代码时间&type=1009`
-**必选参数:**
+**必选参数:**
`rid`: 电台 的 id
-**接口地址:**
-`/dj/sub`
+**接口地址:**
+`/dj/sub`
-**调用例子:**
-`/dj/sub?rid=336355127&t=1` (对应关注'代码时间')
+**调用例子:**
+`/dj/sub?rid=336355127&t=1` (对应关注'代码时间')
`/dj/sub?rid=336355127&t=0` (对应取消关注'代码时间')
### 电台-详情
说明:登陆后调用此接口,传入`rid`,可获得对应电台的详情介绍
-**必选参数:**
+**必选参数:**
`rid`: 电台 的 id
-**接口地址:**
-`/dj/detail?rid=336355127`
+**接口地址:**
+`/dj/detail?rid=336355127`
-**调用例子:**
-`/dj/detail?rid=336355127` (对应'代码时间'的详情介绍)
+**调用例子:**
+`/dj/detail?rid=336355127` (对应'代码时间'的详情介绍)
### 电台-节目
说明:登陆后调用此接口,传入`rid`,可查看对应电台的电台节目以及对应的 id, 需要注意的是这个接口返回的 mp3Url 已经无效,都为 null, 但是通过调用 `/music/url` 这个接口,传入节目 id 仍然能获取到节目音频,如 `/music/url?id=478446370` 获取代码时间的一个节目的音频
-**必选参数:**
+**必选参数:**
`rid`: 电台 的 id
-**接口地址:**
-`/dj/program`
+**接口地址:**
+`/dj/program`
-**调用例子:**
-`/dj/program?rid=336355127` (对应'代码时间'的节目列表)
+**调用例子:**
+`/dj/program?rid=336355127` (对应'代码时间'的节目列表)
@@ -1116,7 +1119,7 @@ $ set PORT=4000 && node app.js
## 关于此文档
-此文档由 [docsify](https://github.com/QingWei-Li/docsify/) 生成
+此文档由 [docsify](https://github.com/QingWei-Li/docsify/) 生成
docsify 是一个动态生成文档网站的工具。不同于 GitBook、Hexo 的地方是它不会生成将 .md 转成 .html 文件,所有转换工作都是在运行时进行。
## License
From 027e11ad841f7e50f6ce595b75b05193728202bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Thu, 4 Jan 2018 11:17:01 +0800
Subject: [PATCH 07/16] =?UTF-8?q?=E6=94=B9=E6=AD=A3=E4=BA=86=E6=96=87?=
=?UTF-8?q?=E6=A1=A3=E4=B8=AD=E7=9A=84=E4=B8=80=E4=BA=9B=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E5=92=8C=E6=97=A0=E6=95=88id?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/README.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/docs/README.md b/docs/README.md
index 35ed6a6..1a759d4 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -331,8 +331,8 @@ $ set PORT=4000 && node app.js
`/music/url`
**调用例子:**
-`/music/url?id=347230`
-`/music/url?id=347230,347231`
+`/music/url?id=33894312`
+`/music/url?id=405998841,33894312`
返回数据如下图:

@@ -408,8 +408,8 @@ $ set PORT=4000 && node app.js
**调用例子:**
`/search/multimatch?keywords=海阔天空`
-### 收藏单曲到歌单
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(需要登录)
+### 对歌单添加或删除歌曲
+说明:调用此接口,可以添加歌曲到歌单或者从歌单删除某首歌曲(需要登录)
**必选参数:**
`op`: 从歌单增加单曲为add,删除为 del
@@ -433,7 +433,7 @@ $ set PORT=4000 && node app.js
`/lyric`
**调用例子:**
-`/lyric?id=347230`
+`/lyric?id=33894312`
返回数据如下图:

@@ -453,7 +453,7 @@ $ set PORT=4000 && node app.js
`/comment/music`
**调用例子:**
-`/comment/music?id=186016&limit=1` 对应晴天评论
+`/comment/music?id=33894312&limit=1` 对应晴天评论
返回数据如下图:

From 597b648bba405673f05dd60d1366449dbc34cb9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Thu, 4 Jan 2018 12:16:25 +0800
Subject: [PATCH 08/16] update README.MD
---
README.MD | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.MD b/README.MD
index e988a31..2ff057e 100644
--- a/README.MD
+++ b/README.MD
@@ -17,6 +17,9 @@
## 版本新特性
+### 2.8.0 | 2018.01.04
+用 'request' 重写了请求函数
+
### 2.6.5 | 2017.7.16
优化 CORS 设置
From ef20046451f5d2d350fb776579225fdee14ba985 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Thu, 4 Jan 2018 12:54:19 +0800
Subject: [PATCH 09/16] update docs for adding proxy
---
README.MD | 4 ++++
docs/README.md | 20 ++++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/README.MD b/README.MD
index 2ff057e..c47cf72 100644
--- a/README.MD
+++ b/README.MD
@@ -17,6 +17,10 @@
## 版本新特性
+
+### ? ? ? | 2018.01.04
+添加了proxy功能
+
### 2.8.0 | 2018.01.04
用 'request' 重写了请求函数
diff --git a/docs/README.md b/docs/README.md
index 9a5615f..a5c3c43 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -12,7 +12,27 @@
## 工作原理
跨站请求伪造 (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}
+```
+
## 版本新特性
+
+### ? ? ? | 2018.01.04
+添加了proxy功能
+
### 2.8.0 | 2018.01.04
用 'request' 重写了请求函数
From cec2561040087ae41919cdbb37621e28d0dcd517 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AD=9F=E6=94=BF=E5=85=83?= <278227739@qq.com>
Date: Thu, 4 Jan 2018 13:21:34 +0800
Subject: [PATCH 10/16] close debug mode
---
util/util.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/util/util.js b/util/util.js
index 80fc7bb..74e862f 100644
--- a/util/util.js
+++ b/util/util.js
@@ -2,7 +2,7 @@ const Encrypt = require("./crypto.js");
const request = require("request");
const querystring = require("querystring");
-request.debug = true;
+// request.debug = true;
function randomUserAgent() {
const userAgentList = [
From 40fe20dba49e3311d985fe5c423cf44a755f9e66 Mon Sep 17 00:00:00 2001
From: binaryify
Date: Thu, 4 Jan 2018 17:06:56 +0800
Subject: [PATCH 11/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20proxy=20=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD,=E4=BF=AE=E5=A4=8D=20cookie=20=E4=B8=A2=E5=A4=B1?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.MD | 4 ++++
README.MD | 20 ++++++++++----------
docs/README.md | 12 ++++++------
package.json | 2 +-
4 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/CHANGELOG.MD b/CHANGELOG.MD
index 00c8808..a5aa65d 100644
--- a/CHANGELOG.MD
+++ b/CHANGELOG.MD
@@ -1,4 +1,8 @@
# 更新日志
+### 2.8.1 | 2018.01.04
+
+添加了proxy功能
+
### 2.8.0 | 2018.01.04
用 'request' 重写了请求函数
diff --git a/README.MD b/README.MD
index c47cf72..5834fa2 100644
--- a/README.MD
+++ b/README.MD
@@ -6,7 +6,7 @@
-
+
## 灵感来自
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
@@ -18,7 +18,7 @@
## 版本新特性
-### ? ? ? | 2018.01.04
+### 2.8.1 | 2018.01.04
添加了proxy功能
### 2.8.0 | 2018.01.04
@@ -28,9 +28,9 @@
优化 CORS 设置
### 2.6.4 | 2017.7.16
-添加缓存机制和随机 UA 机制 感谢[@u3u](https://github.com/u3u)
+添加缓存机制和随机 UA 机制 感谢[@u3u](https://github.com/u3u)
[issue:77](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/77)
-优化请求代码 感谢 [@huhuime](https://github.com/huhuime)
+优化请求代码 感谢 [@huhuime](https://github.com/huhuime)
[issue:83](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/83)
### 2.6.2 | 2017.7.16
@@ -160,22 +160,22 @@
## 环境要求
需要 NodeJS 6.0+ 环境
-## 安装
+## 安装
``` shell
$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
$ npm install
```
## 运行
``` shell
-$ node app.js
+$ node app.js
```
-服务器启动默认端口为3000,若不想使用3000端口,可使用以下命令:
+服务器启动默认端口为3000,若不想使用3000端口,可使用以下命令:
Mac/Linux
```shell
$ PORT=4000 node app.js
```
-windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
+windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
```shell
$ set PORT=4000 && node app.js
```
@@ -186,13 +186,13 @@ $ set PORT=4000 && node app.js

## 更新日志
-[changelog](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/CHANGELOG.MD)
+[changelog](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/CHANGELOG.MD)
## 单元测试
``` shell
$ npm test
-```
+```


diff --git a/docs/README.md b/docs/README.md
index a5c3c43..8d197af 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -30,7 +30,7 @@ fetch(url)
## 版本新特性
-### ? ? ? | 2018.01.04
+### 2.8.1 | 2018.01.04
添加了proxy功能
### 2.8.0 | 2018.01.04
@@ -353,8 +353,8 @@ $ set PORT=4000 && node app.js
**接口地址:**
`/music/url`
-**调用例子:**
-`/music/url?id=33894312`
+**调用例子:**
+`/music/url?id=33894312`
`/music/url?id=405998841,33894312`
返回数据如下图:
@@ -432,7 +432,7 @@ $ set PORT=4000 && node app.js
`/search/multimatch?keywords=海阔天空`
### 对歌单添加或删除歌曲
-说明:调用此接口,可以添加歌曲到歌单或者从歌单删除某首歌曲(需要登录)
+说明:调用此接口,可以添加歌曲到歌单或者从歌单删除某首歌曲(需要登录)
**必选参数:**
`op`: 从歌单增加单曲为add,删除为 del
@@ -455,8 +455,8 @@ $ set PORT=4000 && node app.js
**接口地址:**
`/lyric`
-**调用例子:**
-`/lyric?id=33894312`
+**调用例子:**
+`/lyric?id=33894312`
返回数据如下图:

diff --git a/package.json b/package.json
index cd45674..95b4f41 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "NeteaseCloudMusicApi",
- "version": "2.8.0",
+ "version": "2.8.1",
"description": "网易云音乐 NodeJS 版 API",
"scripts": {
"start": "node app.js",
From 4c01e3e30e9906ec4a47d6ee1fc94a8a15095f22 Mon Sep 17 00:00:00 2001
From: Peng Xiao
Date: Fri, 5 Jan 2018 14:19:10 +0800
Subject: [PATCH 12/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Dockerfile=EF=BC=8C?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=A5Docker=E5=AE=B9=E5=99=A8=E6=A8=A1?=
=?UTF-8?q?=E5=BC=8F=E8=BF=90=E8=A1=8C=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Dockerfile | 9 +++++++++
README.MD | 6 ++++++
2 files changed, 15 insertions(+)
create mode 100644 Dockerfile
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..55d4a93
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,9 @@
+FROM mhart/alpine-node:8
+
+WORKDIR /app
+COPY . /app
+
+RUN npm install
+
+EXPOSE 3000
+CMD ["node", "app.js"]
diff --git a/README.MD b/README.MD
index 5834fa2..e88dfa9 100644
--- a/README.MD
+++ b/README.MD
@@ -180,6 +180,12 @@ windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
$ set PORT=4000 && node app.js
```
+## Docker容器运行
+```shell
+docker pull pengxiao/netease-music-api
+docker run -d -p 3000:3000 pengxiao/netease-music-api
+```
+
## 使用文档
[文档地址](https://binaryify.github.io/NeteaseCloudMusicApi)
From 480b1696eb78a8d15850bbc63394ab84e9696ee9 Mon Sep 17 00:00:00 2001
From: binaryify
Date: Fri, 5 Jan 2018 14:46:21 +0800
Subject: [PATCH 13/16] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Dockerfile=EF=BC=8C?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=A5Docker=E5=AE=B9=E5=99=A8=E6=A8=A1?=
=?UTF-8?q?=E5=BC=8F=E8=BF=90=E8=A1=8C=20#165?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.MD | 2 ++
docs/README.md | 7 +++++++
package.json | 2 +-
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/README.MD b/README.MD
index e88dfa9..62a264f 100644
--- a/README.MD
+++ b/README.MD
@@ -17,6 +17,8 @@
## 版本新特性
+### 2.8.2 | 2018.01.05
+增加Dockerfile,支持以Docker容器模式运行
### 2.8.1 | 2018.01.04
添加了proxy功能
diff --git a/docs/README.md b/docs/README.md
index 8d197af..675e68c 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -29,6 +29,8 @@ fetch(url)
```
## 版本新特性
+### 2.8.2 | 2018.01.05
+增加Dockerfile,支持以Docker容器模式运行
### 2.8.1 | 2018.01.04
添加了proxy功能
@@ -133,6 +135,11 @@ windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
$ set PORT=4000 && node app.js
```
+## Docker容器运行
+```shell
+docker pull pengxiao/netease-music-api
+docker run -d -p 3000:3000 pengxiao/netease-music-api
+```
## 接口文档
### 调用前须知
diff --git a/package.json b/package.json
index 95b4f41..01f1574 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "NeteaseCloudMusicApi",
- "version": "2.8.1",
+ "version": "2.8.2",
"description": "网易云音乐 NodeJS 版 API",
"scripts": {
"start": "node app.js",
From 642d6f535396b4bb234c3292f3e5dd7aa9b7d9c2 Mon Sep 17 00:00:00 2001
From: binaryify
Date: Fri, 12 Jan 2018 14:47:31 +0800
Subject: [PATCH 14/16] improve
---
CHANGELOG.MD | 13 +-
app.js | 23 +-
docs/README.md | 1059 +++++++++++++++++--------------------
public/test.html | 41 ++
router/loginCellphone.js | 48 +-
router/playlist_detail.js | 41 +-
router/user_playlist.js | 37 +-
7 files changed, 608 insertions(+), 654 deletions(-)
create mode 100644 public/test.html
diff --git a/CHANGELOG.MD b/CHANGELOG.MD
index a5aa65d..56d3b1f 100644
--- a/CHANGELOG.MD
+++ b/CHANGELOG.MD
@@ -1,7 +1,16 @@
# 更新日志
+
+### 2.8.3 | 2018.01.12
+
+优化部分功能和文档
+
+### 2.8.2 | 2018.01.05
+
+增加 Dockerfile,支持以 Docker 容器模式运行
+
### 2.8.1 | 2018.01.04
-添加了proxy功能
+添加了 proxy 功能
### 2.8.0 | 2018.01.04
@@ -9,7 +18,7 @@
### 2.7.9 | 2017.12.11
-更新排行榜接口,新增云音乐ACG音乐榜,云音乐嘻哈榜
+更新排行榜接口 , 新增云音乐 ACG 音乐榜 , 云音乐嘻哈榜
### 2.7.7 | 2017.11.27
diff --git a/app.js b/app.js
index 4698d78..2b3d260 100644
--- a/app.js
+++ b/app.js
@@ -6,17 +6,18 @@ const app = express();
let cache = apicache.middleware;
// 跨域设置
-// app.all('*', function (req, res, next) {
-// if (req.path !== '/' && !req.path.includes('.')) {
-// res.header('Access-Control-Allow-Credentials', true)
-// // 这里获取 origin 请求头 而不是用 *
-// res.header('Access-Control-Allow-Origin', req.headers['origin'] || '*')
-// res.header('Access-Control-Allow-Headers', 'X-Requested-With')
-// res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
-// res.header('Content-Type', 'application/json;charset=utf-8')
-// }
-// next()
-// })
+app.all("*", function(req, res, next) {
+ if (req.path !== "/" && !req.path.includes(".")) {
+ res.header("Access-Control-Allow-Credentials", true);
+ // 这里获取 origin 请求头 而不是用 *
+ res.header("Access-Control-Allow-Origin", req.headers["origin"] || "*");
+ res.header("Access-Control-Allow-Headers", "X-Requested-With");
+ res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
+ res.header("Content-Type", "application/json;charset=utf-8");
+ }
+ next();
+});
+
const onlyStatus200 = (req, res) => res.statusCode === 200;
app.use(cache("2 minutes", onlyStatus200));
diff --git a/docs/README.md b/docs/README.md
index 675e68c..8199fda 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -3,6 +3,7 @@
网易云音乐 NodeJS 版 API
## 灵感来自
+
[disoul/electron-cloud-music](https://github.com/disoul/electron-cloud-music)
[darknessomi/musicbox](https://github.com/darknessomi/musicbox)
@@ -10,18 +11,18 @@
[sqaiyan/netmusic-node](https://github.com/sqaiyan/netmusic-node)
## 工作原理
-跨站请求伪造 (CSRF), 伪造请求头,调用官方 API
+
+跨站请求伪造 (CSRF), 伪造请求头 , 调用官方 API
## 可以使用代理
-在query参数中加上proxy=your-proxy即可让这一次的请求使用proxy
+
+在 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
+fetch(url).then(function() {
+ // do what you want
})
// 结果
@@ -29,31 +30,45 @@ fetch(url)
```
## 版本新特性
+
+### 2.8.3 | 2018.01.12
+
+优化部分功能和文档
+
### 2.8.2 | 2018.01.05
-增加Dockerfile,支持以Docker容器模式运行
+
+增加 Dockerfile,支持以 Docker 容器模式运行
### 2.8.1 | 2018.01.04
-添加了proxy功能
+
+添加了 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: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 接口,增加刷新登录接口,增加电台相关接口,补充评论接口,更新文档
+
+增加 mv/ 专辑 / 歌单评论接口 , 增加云盘相关接口 , 增加获取用户动态 / 信息接口 ,
+增加关注 / 粉丝列表接口 , 增加收藏歌单接口 , 增加相似 mv/ 歌曲 / 用户接口 , 增加
+banner 接口 , 增加刷新登录接口 , 增加电台相关接口 , 补充评论接口 , 更新文档
## 功能特性
+
1. 登录
2. 刷新登录
-3. 获取用户信息,歌单,收藏,mv, dj 数量
+3. 获取用户信息 , 歌单,收藏,mv, dj 数量
4. 获取用户歌单
5. 获取用户电台
6. 获取用户关注列表
@@ -82,14 +97,14 @@ fetch(url)
29. 获取相似歌单
30. 相似 mv
31. 获取相似音乐
-32. 获取最近5个听了这首歌的用户
+32. 获取最近 5 个听了这首歌的用户
33. 获取每日推荐歌单
34. 获取每日推荐歌曲
35. 私人 FM
36. 签到
37. 喜欢音乐
38. 垃圾桶
-39. 歌单(网友精选碟)
+39. 歌单 ( 网友精选碟 )
40. 新碟上架
41. 热门歌手
42. 最新 mv
@@ -105,470 +120,421 @@ fetch(url)
52. 排行榜
53. 歌手榜
54. 云盘
-55. 电台-推荐
-56. 电台-分类
-57. 电台-分类推荐
-58. 电台-订阅
-59. 电台-详情
-60. 电台-节目
+55. 电台 - 推荐
+56. 电台 - 分类
+57. 电台 - 分类推荐
+58. 电台 - 订阅
+59. 电台 - 详情
+60. 电台 - 节目
61. 给评论点赞
62. 获取动态
## 安装
-``` shell
+
+```shell
$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
$ npm install
```
+
## 运行
-``` shell
+
+```shell
$ node app.js
```
-服务器启动默认端口为3000,若不想使用3000端口,可使用以下命令:
-Mac/Linux
+服务器启动默认端口为 3000, 若不想使用 3000 端口 , 可使用以下命令 : Mac/Linux
+
```shell
$ PORT=4000 node app.js
```
-windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
+windows 下使用 git-bash 或者 cmder 等终端执行以下命令 :
+
```shell
$ set PORT=4000 && node app.js
```
-## Docker容器运行
+## Docker 容器运行
+
```shell
docker pull pengxiao/netease-music-api
docker run -d -p 3000:3000 pengxiao/netease-music-api
```
## 接口文档
+
### 调用前须知
-- 由于接口做了缓存处理(缓存2分钟,可在 app.js 设置,可能会导致登陆后获取不到 cookie),相同的 url 会在两分钟内只向网易服务器发一次请求,如果遇到不需要缓存结果的接口,可在请求 url 后面加一个时间戳参数使url 不同,例子: `/simi/playlist?id=347230×tamp=1503019930000`
-- 301 错误基本都是没登录就调用了需要登录的接口,如果登陆了还是提示 301, 基本都是缓存把数据缓存起来了,解决方法是等待 2 分钟或者重启服务重新登录后再调用接口
+* 由于接口做了缓存处理 ( 缓存 2 分钟 , 可在 app.js 设置 , 可能会导致登陆后获取不
+ 到 cookie), 相同的 url 会在两分钟内只向网易服务器发一次请求 , 如果遇到不需要缓
+ 存结果的接口 , 可在请求 url 后面加一个时间戳参数使 url 不同 , 例子 :
+ `/simi/playlist?id=347230×tamp=1503019930000`
-- 部分接口如登录接口不能调用太频繁,否则可能会触发503错误或者 ip 高频错误,若需频繁调用,需要准备 IP 代理池.
+* 如果是跨域请求 , 请在所有请求带上 `xhrFields: { withCredentials: true }` 否则可能会因为没带上 cookie 导致 301, 具体例子可看 `public/test.html`, 例子使用 jquery, axios 版本也类似
-- 本项目仅供学习使用,文档可能会有缓存,如果文档版本和 github 上的版本不一致,请清除缓存再查看
+* 301 错误基本都是没登录就调用了需要登录的接口 , 如果登陆了还是提示 301, 基本都
+ 是缓存把数据缓存起来了 , 解决方法是等待 2 分钟或者重启服务重新登录后再调用接口
-- 2.5.0 版本对部分原有 api 做了微调,不过只是调整了下地址,参数和返回结果不受影响
+* 部分接口如登录接口不能调用太频繁 , 否则可能会触发 503 错误或者 ip 高频错误 ,
+ 若需频繁调用 , 需要准备 IP 代理池 .
-- 由于网易限制,此项目在国外服务器上使用会受到限制,如需解决,可使用大陆服务器或者使用代理,感谢 [@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` 即可解决
+* 本项目仅供学习使用 , 文档可能会有缓存 , 如果文档版本和 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`: 密码
+**必选参数 :** `phone`: 手机号码 `password`: 密码
-**接口地址:**
-`/login/cellphone`
+**接口地址 :** `/login/cellphone`
-**调用例子:**
-`/login/cellphone?phone=xxx&password=yyy`
+**调用例子 :** `/login/cellphone?phone=xxx&password=yyy`
#### 2. 邮箱登录
->注意:此接口被网易和谐了,待修复,暂时使用手机登录(2017.05.20)
-**必选参数:**
-`email`: 163网易邮箱
-`password`: 密码
+> 注意 : 此接口被网易和谐了 , 待修复 , 暂时使用手机登录 (2017.05.20)
-**接口地址:**
-`/login`
+**必选参数 :** `email`: 163 网易邮箱 `password`: 密码
-**调用例子:**
-`/login?email=xxx@163.com&password=yyy`
+**接口地址 :** `/login`
-返回数据如下图:
+**调用例子 :** `/login?email=xxx@163.com&password=yyy`
+
+返回数据如下图 :

-
-完成登录后,会在浏览器保存一个 Cookies 用作登录凭证,大部分 API 都需要用到这个 Cookies
+完成登录后 , 会在浏览器保存一个 Cookies 用作登录凭证 , 大部分 API 都需要用到这个
+Cookies
#### 注意
-调用登录接口的速度比调用其他接口慢,因为登录过程调用了加密算法
+
+调用登录接口的速度比调用其他接口慢 , 因为登录过程调用了加密算法
### 刷新登录
-说明:调用此接口,可刷新登录状态
-**调用例子:**
-`/login/refresh`
+说明 : 调用此接口 , 可刷新登录状态
+
+**调用例子 :** `/login/refresh`
### 获取用户详情
-说明:登陆后调用此接口,传入用户 id, 可以获取用户详情
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户详情
-**接口地址:**
-`/user/detail`
+**必选参数 :** `uid` : 用户 id
-**调用例子:**
-`/user/detail?uid=32953014`
+**接口地址 :** `/user/detail`
+**调用例子 :** `/user/detail?uid=32953014`
-### 获取用户信息,歌单,收藏,mv, dj 数量
-说明:登陆后调用此接口,可以获取用户信息
+### 获取用户信息 , 歌单,收藏,mv, dj 数量
-**接口地址:**
-`/user/subcount`
+说明 : 登陆后调用此接口 , 可以获取用户信息
-**调用例子:**
-`/user/subcount`
+**接口地址 :** `/user/subcount`
+**调用例子 :** `/user/subcount`
### 获取用户歌单
-说明:登陆后调用此接口,传入用户 id, 可以获取用户歌单
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户歌单
-**接口地址:**
-`/user/playlist`
+**必选参数 :** `uid` : 用户 id
-**调用例子:**
-`/user/playlist?uid=32953014`
+**接口地址 :** `/user/playlist`
-返回数据如下图:
+**调用例子 :** `/user/playlist?uid=32953014`
+
+返回数据如下图 :

### 获取用户电台
-说明:登陆后调用此接口,传入用户 id, 可以获取用户电台
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户电台
-**接口地址:**
-`/user/dj`
+**必选参数 :** `uid` : 用户 id
-**调用例子:**
-`/user/dj?uid=32953014`
+**接口地址 :** `/user/dj`
+
+**调用例子 :** `/user/dj?uid=32953014`
### 获取用户关注列表
-说明:登陆后调用此接口,传入用户 id, 可以获取用户关注列表
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户关注列表
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**必选参数 :** `uid` : 用户 id
-**接口地址:**
-`/user/follows`
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
-**调用例子:**
-`/user/follows?uid=32953014`
+**接口地址 :** `/user/follows`
+
+**调用例子 :** `/user/follows?uid=32953014`
### 获取用户粉丝列表
-说明:登陆后调用此接口,传入用户 id, 可以获取用户粉丝列表
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户粉丝列表
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**必选参数 :** `uid` : 用户 id
-**接口地址:**
-`/user/followeds`
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
-**调用例子:**
-`/user/followeds?uid=32953014`
+**接口地址 :** `/user/followeds`
+
+**调用例子 :** `/user/followeds?uid=32953014`
### 获取用户动态
-说明:登陆后调用此接口,传入用户 id, 可以获取用户动态
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户动态
-**接口地址:**
-`/user/event`
+**必选参数 :** `uid` : 用户 id
-**调用例子:**
-`/user/event?uid=32953014`
+**接口地址 :** `/user/event`
+
+**调用例子 :** `/user/event?uid=32953014`
### 获取用户播放记录
-说明:登陆后调用此接口,传入用户 id,可获取用户播放记录
-**必选参数:**
-`uid` : 用户 id
+说明 : 登陆后调用此接口 , 传入用户 id, 可获取用户播放记录
-**可选参数:**
-`type` : type=1时只返回weekData, type=0时返回allData
+**必选参数 :** `uid` : 用户 id
-**接口地址:**
-`/user/record`
+**可选参数 :** `type` : type=1 时只返回 weekData, type=0 时返回 allData
-**调用例子:**
-`/user/record?uid=32953014&type=1`
+**接口地址 :** `/user/record`
+
+**调用例子 :** `/user/record?uid=32953014&type=1`
### 获取动态消息
-说明:调用此接口,可获取各种动态,对应网页版网易云,朋友界面里的各种动态消息,如分享的视频,音乐,照片等!
-**必选参数:**
-未知
+说明 : 调用此接口 , 可获取各种动态 , 对应网页版网易云,朋友界面里的各种动态消息
+,如分享的视频,音乐,照片等!
-**接口地址:**
-`/event`
+**必选参数 :** 未知
-**调用例子:**
-`/event`
+**接口地址 :** `/event`
+
+**调用例子 :** `/event`
### 获取精品歌单
-说明:调用此接口,可获取精品歌单
-**可选参数:**
-`cat`: tag, 比如 "华语"、"古风" 、"欧美"、"流行",默认为"全部"
+说明 : 调用此接口 , 可获取精品歌单
-`limit`: 取出歌单数量,默认为20
+**可选参数 :** `cat`: tag, 比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为
+" 全部 "
-**接口地址:**
-`/top/playlist/highquality`
+`limit`: 取出歌单数量 , 默认为 20
-**调用例子:**
-`/top/playlist/highquality?limit=30`
+**接口地址 :** `/top/playlist/highquality`
+**调用例子 :** `/top/playlist/highquality?limit=30`
### 获取歌单详情
-说明:歌单能看到歌单名字,但看不到具体歌单内容,调用此接口,传入歌单 id,可以获取对应歌单内的所有的音乐
-**必选参数:**
-`id` : 歌单 id
+说明 : 歌单能看到歌单名字,但看不到具体歌单内容 , 调用此接口 , 传入歌单 id, 可
+以获取对应歌单内的所有的音乐
-**接口地址:**
-`/playlist/detail`
+**必选参数 :** `id` : 歌单 id
-**调用例子:**
-`/playlist/detail?id=24381616`
+**接口地址 :** `/playlist/detail`
-返回数据如下图:
+**调用例子 :** `/playlist/detail?id=24381616`
+
+返回数据如下图 :

### 获取音乐 url
-说明:使用歌单详情接口后,能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口,传入的音乐 id(可多个,用逗号隔开),可以获取对应的音乐的 url(不需要登录)
->注:部分用户反馈获取的 url 会 403,[hwaphon](https://github.com/hwaphon)找到的解决方案是当获取到音乐的 id 后,将 http://music.163.com/song/media/outer/url?id=id.mp3 以src 赋予 Audio即可播放
+说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口
+, 传入的音乐 id( 可多个 , 用逗号隔开 ), 可以获取对应的音乐的 url( 不需要登录 )
-**必选参数:**
-`id` : 音乐 id
+> 注 : 部分用户反馈获取的 url 会 403,[hwaphon](https://github.com/hwaphon)找到的
+> 解决方案是当获取到音乐的 id 后,将
+> http://music.163.com/song/media/outer/url?id=id.mp3 以 src 赋予 Audio 即可播放
-**接口地址:**
-`/music/url`
+**必选参数 :** `id` : 音乐 id
-**调用例子:**
-`/music/url?id=33894312`
-`/music/url?id=405998841,33894312`
+**接口地址 :** `/music/url`
-返回数据如下图:
+**调用例子 :** `/music/url?id=33894312` `/music/url?id=405998841,33894312`
+
+返回数据如下图 :

### 搜索
-说明:调用此接口,传入搜索关键词可以搜索该音乐/专辑/歌手/歌单/用户,关键词可以多个,以空格隔开,如"周杰伦 搁浅"(不需要登录),搜索获取的 mp3url 不能直接用,可通过 `/music/url` 接口传入歌曲 id 获取具体的播放链接
-**必选参数:**
-`keywords` : 关键词
+说明 : 调用此接口 , 传入搜索关键词可以搜索该音乐 / 专辑 / 歌手 / 歌单 / 用户 ,
+关键词可以多个 , 以空格隔开 , 如 " 周杰伦 搁浅 "( 不需要登录 ), 搜索获取的
+mp3url 不能直接用 , 可通过 `/music/url` 接口传入歌曲 id 获取具体的播放链接
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**必选参数 :** `keywords` : 关键词
-`type`: 搜索类型;默认为1即单曲,取值意义:
-1: 单曲
-10: 专辑
-100: 歌手
-1000: 歌单
-1002: 用户
-1004: MV
-1006: 歌词
-1009: 电台
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+`type`: 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲 10: 专辑 100: 歌手 1000:
+歌单 1002: 用户 1004: MV 1006: 歌词 1009: 电台
+**接口地址 :** `/search`
-**接口地址:**
-`/search`
+**调用例子 :** `/search?keywords= 海阔天空`
-**调用例子:**
-`/search?keywords=海阔天空`
-
-返回数据如下图:
+返回数据如下图 :

### 搜索建议
-说明:调用此接口,传入搜索关键词可获得搜索建议,搜索结果同时包含单曲,歌手,歌单,mv 信息
-**必选参数:**
-`keywords` : 关键词
+说明 : 调用此接口,传入搜索关键词可获得搜索建议 , 搜索结果同时包含单曲 , 歌手 ,
+歌单 ,mv 信息
-**可选参数:**
-`limit` : 返回数量,默认为30
-`offset` : 偏移数量,用于分页,如: 如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**必选参数 :** `keywords` : 关键词
-`type`: 搜索类型;默认为1即单曲,取值意义:
-1: 单曲
-10: 专辑
-100: 歌手
-1000: 歌单
-1002: 用户
-1004: MV
-1006: 歌词
-1009: 电台
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+`type`: 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲 10: 专辑 100: 歌手 1000:
+歌单 1002: 用户 1004: MV 1006: 歌词 1009: 电台
+**接口地址 :** `/search/suggest`
-**接口地址:**
-`/search/suggest`
-
-**调用例子:**
-`/search/suggest?keywords=海阔天空`
+**调用例子 :** `/search/suggest?keywords= 海阔天空`
### 搜索多重匹配
-说明:调用此接口,传入搜索关键词可获得搜索结果
-**必选参数:**
-`keywords` : 关键词
+说明 : 调用此接口 , 传入搜索关键词可获得搜索结果
-**接口地址:**
-`/search/multimatch`
+**必选参数 :** `keywords` : 关键词
-**调用例子:**
-`/search/multimatch?keywords=海阔天空`
+**接口地址 :** `/search/multimatch`
+
+**调用例子 :** `/search/multimatch?keywords= 海阔天空`
### 对歌单添加或删除歌曲
-说明:调用此接口,可以添加歌曲到歌单或者从歌单删除某首歌曲(需要登录)
-**必选参数:**
-`op`: 从歌单增加单曲为add,删除为 del
-`pid`: 歌单id
-`tracks`: 歌曲id
+说明 : 调用此接口 , 可以添加歌曲到歌单或者从歌单删除某首歌曲 ( 需要登录 )
-**接口地址:**
-`/playlist/tracks`
+**必选参数 :** `op`: 从歌单增加单曲为 add, 删除为 del `pid`: 歌单 id `tracks`:
+歌曲 id
-**调用例子:**
-`/playlist/tracks?op=add&pid=24381616&tracks=347230` (对应把'海阔天空'添加到'我'的歌单,测试的时候请把这里的 pid换成你自己的)
+**接口地址 :** `/playlist/tracks`
+**调用例子 :** `/playlist/tracks?op=add&pid=24381616&tracks=347230` ( 对应把 '
+海阔天空 ' 添加到 ' 我 ' 的歌单 , 测试的时候请把这里的 pid 换成你自己的 )
### 获取歌词
-说明:调用此接口,传入音乐 id 可获得对应音乐的歌词(不需要登录)
-**必选参数:**
-`id`: 音乐 id
+说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 )
-**接口地址:**
-`/lyric`
+**必选参数 :** `id`: 音乐 id
-**调用例子:**
-`/lyric?id=33894312`
+**接口地址 :** `/lyric`
-返回数据如下图:
+**调用例子 :** `/lyric?id=33894312`
+
+返回数据如下图 :

### 歌曲评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该音乐的所有评论(不需要登录)
-**必选参数:**
-`id`: 音乐 id
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该音乐的所有评论 ( 不需要
+登录 )
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**必选参数 :** `id`: 音乐 id
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
-**接口地址:**
-`/comment/music`
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
-**调用例子:**
-`/comment/music?id=186016&limit=1` 对应晴天评论
+**接口地址 :** `/comment/music`
-返回数据如下图:
+**调用例子 :** `/comment/music?id=186016&limit=1` 对应晴天评论
+
+返回数据如下图 :

-
### 专辑评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该专辑的所有评论(不需要登录)
-**必选参数:**
-`id`: 专辑 id
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该专辑的所有评论 ( 不需要
+登录 )
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**必选参数 :** `id`: 专辑 id
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
-**接口地址:**
-`/comment/album`
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
-**调用例子:**
-`/comment/album?id=32311`
+**接口地址 :** `/comment/album`
+
+**调用例子 :** `/comment/album?id=32311`
### 歌单评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该歌单的所有评论(不需要登录)
-**必选参数:**
-`id`: 歌单 id
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该歌单的所有评论 ( 不需要
+登录 )
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**必选参数 :** `id`: 歌单 id
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
-**接口地址:**
-`/comment/playlist`
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
-**调用例子:**
-`/comment/playlist?id=705123491`
+**接口地址 :** `/comment/playlist`
+
+**调用例子 :** `/comment/playlist?id=705123491`
### mv 评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 mv 的所有评论(不需要登录)
-**必选参数:**
-`id`: mv id
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 mv 的所有评论 ( 不需要
+登录 )
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**必选参数 :** `id`: mv id
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
-**接口地址:**
-`/comment/mv`
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
-**调用例子:**
-`/comment/mv?id=5436712`
+**接口地址 :** `/comment/mv`
+
+**调用例子 :** `/comment/mv?id=5436712`
### 电台节目评论
-说明:调用此接口,传入音乐 id和 limit 参数, 可获得该 电台节目 的所有评论(不需要登录)
-**必选参数:**
-`id`: 电台节目的 id
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 电台节目 的所有评论 (
+不需要登录 )
-**可选参数:**
-`limit`: 取出评论数量,默认为20
+**必选参数 :** `id`: 电台节目的 id
-`offset`: 偏移数量,用于分页,如:(评论页数-1)*20, 其中 20 为 limit 的值
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
-**接口地址:**
-`/comment/dj`
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
-**调用例子:**
-`/comment/dj?id=794062371`
+**接口地址 :** `/comment/dj`
+
+**调用例子 :** `/comment/dj?id=794062371`
### 给评论点赞
-说明:调用此接口,传入 type, 资源 id, 和评论id cid和 是否点赞参数 t 即可给对应评论点赞(需要登录)
-**必选参数:**
-`id` : 资源 id, 如歌曲 id,mv id
+说明 : 调用此接口 , 传入 type, 资源 id, 和评论 id cid 和 是否点赞参数 t 即可给对
+应评论点赞 ( 需要登录 )
+
+**必选参数 :** `id` : 资源 id, 如歌曲 id,mv id
`cid` : 评论 id
-`t` :是否点赞,1为点赞,0为取消点赞
+`t` : 是否点赞 ,1 为点赞 ,0 为取消点赞
-`tpye`: 数字,资源类型,对应歌曲, mv, 专辑,歌单,电台
-对应以下类型
+`tpye`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台对应以下类型
```
0: 歌曲
@@ -578,444 +544,392 @@ docker run -d -p 3000:3000 pengxiao/netease-music-api
4: 电台
```
-**接口地址:**
-`comment/like`
+**接口地址 :** `comment/like`
-**调用例子:**
-`/comment/like?id=186016&cid=4956438&t=1&type=0` 对应给晴天最热门的那条评论点赞
+**调用例子 :** `/comment/like?id=186016&cid=4956438&t=1&type=0` 对应给晴天最热门
+的那条评论点赞
### banner
-说明:调用此接口,可获取 banner(轮播图)数据
-注:因参数未知,只能获取比较旧的数据,如果有知道参数的小伙伴,可提交 PR
-**接口地址:**
-`/banner`
+说明 : 调用此接口 , 可获取 banner( 轮播图 ) 数据注 : 因参数未知 , 只能获取比较旧
+的数据 , 如果有知道参数的小伙伴 , 可提交 PR
-**调用例子:**
-`/banner`
+**接口地址 :** `/banner`
+
+**调用例子 :** `/banner`
### 获取歌曲详情
-说明:调用此接口,传入音乐 id, 可获得歌曲详情
-**必选参数:**
-`ids`: 音乐 id,如 `ids=347230`
+说明 : 调用此接口 , 传入音乐 id, 可获得歌曲详情
-**接口地址:**
-`/song/detail`
+**必选参数 :** `ids`: 音乐 id, 如 `ids=347230`
-**调用例子:**
-`/song/detail?ids=347230`
+**接口地址 :** `/song/detail`
-返回数据如下图:
+**调用例子 :** `/song/detail?ids=347230`
+
+返回数据如下图 :

-
### 获取专辑内容
-说明:调用此接口,传入专辑 id,可获得专辑内容
-**必选参数:**
-`id`: 专辑 id
+说明 : 调用此接口 , 传入专辑 id, 可获得专辑内容
-**接口地址:**
-`/album`
+**必选参数 :** `id`: 专辑 id
-**调用例子:**
-`/album?id=32311`
+**接口地址 :** `/album`
-返回数据如下图:
+**调用例子 :** `/album?id=32311`
+
+返回数据如下图 :

### 获取歌手单曲
-说明:调用此接口,传入歌手 id,可获得歌手单曲
-**必选参数:**
-`id`: 歌手 id,可由搜索接口获得
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手单曲
-**接口地址:**
-`/artists`
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
-**调用例子:**
-`/artists?id=6452`
+**接口地址 :** `/artists`
-返回数据如下图:
+**调用例子 :** `/artists?id=6452`
+
+返回数据如下图 :

### 获取歌手 mv
-说明:调用此接口,传入歌手 id,可获得歌手 mv 信息,具体 mv 播放地址可调用`/mv`传入此接口获得的mvid 来拿到,如:
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手 mv 信息 , 具体 mv 播放地址可调
+用`/mv`传入此接口获得的 mvid 来拿到 , 如 :
`/artist/mv?id=6452`,`/mv?mvid=5461064`
-**必选参数:**
-`id`: 歌手 id,可由搜索接口获得
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
-**接口地址:**
-`/artist/mv`
+**接口地址 :** `/artist/mv`
-**调用例子:**
-`/artist/mv?id=6452`
+**调用例子 :** `/artist/mv?id=6452`
### 获取歌手专辑
-说明:调用此接口,传入歌手 id,可获得歌手专辑内容
-**必选参数:**
-`id`: 歌手 id
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手专辑内容
-**可选参数:**
-`limit`: 取出数量,默认为50
+**必选参数 :** `id`: 歌手 id
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+**可选参数 :** `limit`: 取出数量 , 默认为 50
-**接口地址:**
-`/artist/album`
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
-**调用例子:**
-`/artist/album?id=6452&limit=30` (周杰伦)
+**接口地址 :** `/artist/album`
-返回数据如下图:
+**调用例子 :** `/artist/album?id=6452&limit=30` ( 周杰伦 )
+
+返回数据如下图 :

### 获取歌手描述
-说明:调用此接口,传入歌手 id,可获得歌手描述
-**必选参数:**
-`id`: 歌手 id
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手描述
-**接口地址:**
-`/artist/desc`
+**必选参数 :** `id`: 歌手 id
-**调用例子:**
-`/artist/desc?id=6452` (周杰伦)
+**接口地址 :** `/artist/desc`
+
+**调用例子 :** `/artist/desc?id=6452` ( 周杰伦 )
### 获取相似歌手
-说明:调用此接口,传入歌手 id,可获得相似歌手
-**必选参数:**
-`id`: 歌手 id
+说明 : 调用此接口 , 传入歌手 id, 可获得相似歌手
-**接口地址:**
-`/simi/artist`
+**必选参数 :** `id`: 歌手 id
-**调用例子:**
-`/simi/artist?id=6452` (对应和周杰伦相似歌手)
+**接口地址 :** `/simi/artist`
+
+**调用例子 :** `/simi/artist?id=6452` ( 对应和周杰伦相似歌手 )
### 获取相似歌单
-说明:调用此接口,传入歌曲 id,可获得相似歌单
-**必选参数:**
-`id`: 歌曲 id
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌单
-**接口地址:**
-`/simi/playlist`
+**必选参数 :** `id`: 歌曲 id
-**调用例子:**
-`/simi/playlist?id=347230` (对应'光辉岁月'相似歌单)
+**接口地址 :** `/simi/playlist`
+**调用例子 :** `/simi/playlist?id=347230` ( 对应 ' 光辉岁月 ' 相似歌单 )
### 相似 mv
-说明:调用此接口,传入 `mvid` 可获取相似 mv
-**必选参数:**
-`mvid`: mv id
-**接口地址:**
-`/simi/mv`
+说明 : 调用此接口 , 传入 `mvid` 可获取相似 mv **必选参数 :** `mvid`: mv id
-**调用例子:**
-`/simi/mv?mvid=5436712`
+**接口地址 :** `/simi/mv`
+**调用例子 :** `/simi/mv?mvid=5436712`
### 获取相似音乐
-说明:调用此接口,传入歌曲 id,可获得相似歌曲
-**必选参数:**
-`id`: 歌曲 id
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌曲
-**接口地址:**
-`/simi/song`
+**必选参数 :** `id`: 歌曲 id
-**调用例子:**
-`/simi/song?id=347230` (对应'光辉岁月'相似歌曲)
+**接口地址 :** `/simi/song`
-### 获取最近5个听了这首歌的用户
-说明:调用此接口,传入歌曲 id,最近5个听了这首歌的用户
+**调用例子 :** `/simi/song?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
-**必选参数:**
-`id`: 歌曲 id
+### 获取最近 5 个听了这首歌的用户
-**接口地址:**
-`/simi/user`
+说明 : 调用此接口 , 传入歌曲 id, 最近 5 个听了这首歌的用户
-**调用例子:**
-`/simi/user?id=347230` (对应'光辉岁月'相似歌曲)
+**必选参数 :** `id`: 歌曲 id
+**接口地址 :** `/simi/user`
+
+**调用例子 :** `/simi/user?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
### 获取每日推荐歌单
-说明:调用此接口,可获得每日推荐歌单(需要登录)
-**接口地址:**
-`/recommend/resource`
+说明 : 调用此接口 , 可获得每日推荐歌单 ( 需要登录 )
-**调用例子:**
-`/recommend/resource`
+**接口地址 :** `/recommend/resource`
-返回数据如下图:
+**调用例子 :** `/recommend/resource`
+
+返回数据如下图 :

### 获取每日推荐歌曲
-说明:调用此接口,可获得每日推荐歌曲(需要登录)
-**接口地址:**
-`/recommend/songs`
+说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 )
-**调用例子:**
-`/recommend/songs`
+**接口地址 :** `/recommend/songs`
-返回数据如下图:
+**调用例子 :** `/recommend/songs`
+
+返回数据如下图 :

-
### 私人 FM
-说明:私人 FM( 需要登录)
-**接口地址:**
-`/personal_fm`
+说明 : 私人 FM( 需要登录 )
-**调用例子:**
-`/personal_fm`
+**接口地址 :** `/personal_fm`
-返回数据如下图:
+**调用例子 :** `/personal_fm`
+
+返回数据如下图 :

### 签到
-说明:调用此接口,传入签到类型(可不传,默认安卓端签到),可签到(需要登录),其中安卓端签到可获得3点经验, web/PC 端签到可获得2点经验
-**可选参数:**
-`type`: 签到类型,默认 0, 其中 0 为安卓端签到,1为 web/PC 签到
-**接口地址:**
-`/daily_signin`
+说明 : 调用此接口 , 传入签到类型 ( 可不传 , 默认安卓端签到 ), 可签到 ( 需要登录
+), 其中安卓端签到可获得 3 点经验 , web/PC 端签到可获得 2 点经验
-**调用例子:**
-`/daily_signin`
+**可选参数 :**
+`type`: 签到类型 , 默认 0, 其中 0 为安卓端签到 ,1 为 web/PC 签到
-返回数据如下图:
+**接口地址 :** `/daily_signin`
+
+**调用例子 :** `/daily_signin`
+
+返回数据如下图 :


-
### 喜欢音乐
-说明:调用此接口,传入音乐 id, 可喜欢该音乐
-**必选参数:**
-`id`: 歌曲 id
+说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐
-**可选参数:**
-`like`: 布尔值,默认为 true 即喜欢,若传 false, 则取消喜欢
+**必选参数 :** `id`: 歌曲 id
-**接口地址:**
-`/like`
+**可选参数 :** `like`: 布尔值 , 默认为 true 即喜欢 , 若传 false, 则取消喜欢
-**调用例子:**
-`/like?id=347230`
+**接口地址 :** `/like`
-返回数据如下图:
+**调用例子 :** `/like?id=347230`
+
+返回数据如下图 :

-喜欢成功则返回数据的 code 为200,其余为失败
+喜欢成功则返回数据的 code 为 200, 其余为失败

-
-
### 垃圾桶
-说明:调用此接口,传入音乐 id, 可把该音乐从私人 FM中移除至垃圾桶
-**必选参数:**
-`id`: 歌曲 id
+说明 : 调用此接口 , 传入音乐 id, 可把该音乐从私人 FM 中移除至垃圾桶
-**接口地址:**
-`/fm_trash`
+**必选参数 :** `id`: 歌曲 id
-**调用例子:**
-`/fm_trash?id=347230`
+**接口地址 :** `/fm_trash`
-返回数据如下图:
+**调用例子 :** `/fm_trash?id=347230`
+
+返回数据如下图 :

-### 歌单(网友精选碟)
-说明:调用此接口,可获取网友精选碟歌单
+### 歌单 ( 网友精选碟 )
-**可选参数:**
-`order`: 可选值为 'new' 和 'hot',分别对应最新和最热,默认为 'hot'
+说明 : 调用此接口 , 可获取网友精选碟歌单
-**接口地址:**
-`/top/playlist`
+**可选参数 :** `order`: 可选值为 'new' 和 'hot', 分别对应最新和最热 , 默认为
+'hot'
-**调用例子:**
-`/top/playlist?limit=10&order=new`
+**接口地址 :** `/top/playlist`
-返回数据如下图:
+**调用例子 :** `/top/playlist?limit=10&order=new`
+
+返回数据如下图 :

### 新碟上架
-说明:调用此接口,可获取新碟上架列表,如需具体音乐信息需要调用获取专辑列表接口 `/album` ,然后传入 id, 如 `/album?id=32311&limit=30`
-**可选参数:**
-`limit`: 取出数量,默认为50
+说明 : 调用此接口 , 可获取新碟上架列表 , 如需具体音乐信息需要调用获取专辑列表接
+口 `/album` , 然后传入 id, 如 `/album?id=32311&limit=30`
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+**可选参数 :** `limit`: 取出数量 , 默认为 50
-**接口地址:**
-`/top/album`
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
-**调用例子:**
-`/top/album?offset=0&limit=30`
+**接口地址 :** `/top/album`
-返回数据如下图:
+**调用例子 :** `/top/album?offset=0&limit=30`
+
+返回数据如下图 :

### 热门歌手
-说明:调用此接口,可获取热门歌手数据
-**可选参数:**
-`limit`: 取出数量,默认为50
+说明 : 调用此接口 , 可获取热门歌手数据
-`offset`: 偏移数量,用于分页,如:(页数-1)*50, 其中 50 为 limit 的值,默认为0
+**可选参数 :** `limit`: 取出数量 , 默认为 50
-**接口地址:**
-`/top/artists`
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
-**调用例子:**
-`/top/artists?offset=0&limit=30`
+**接口地址 :** `/top/artists`
-返回数据如下图:
+**调用例子 :** `/top/artists?offset=0&limit=30`
+
+返回数据如下图 :

### 最新 mv
-说明:调用此接口,可获取最新 mv
-**可选参数:**
-`limit`: 取出数量,默认为 30
+说明 : 调用此接口 , 可获取最新 mv
-**接口地址:**
-`/mv/first`
+**可选参数 :** `limit`: 取出数量 , 默认为 30
-**调用例子:**
-`/mv/first?limit=10`
+**接口地址 :** `/mv/first`
+
+**调用例子 :** `/mv/first?limit=10`
### 推荐 mv
-说明:调用此接口,可获取推荐 mv
-**接口地址:**
-`/personalized/mv`
+说明 : 调用此接口 , 可获取推荐 mv
-**调用例子:**
-`/personalized/mv`
+**接口地址 :** `/personalized/mv`
+
+**调用例子 :** `/personalized/mv`
### 推荐歌单
-说明:调用此接口,可获取推荐歌单
-**接口地址:**
-`/personalized`
+说明 : 调用此接口 , 可获取推荐歌单
-**调用例子:**
-`/personalized`
+**接口地址 :** `/personalized`
+
+**调用例子 :** `/personalized`
### 推荐新音乐
-说明:调用此接口,可获取推荐新音乐
-**接口地址:**
-`/personalized/newsong`
+说明 : 调用此接口 , 可获取推荐新音乐
-**调用例子:**
-`/personalized/newsong`
+**接口地址 :** `/personalized/newsong`
+
+**调用例子 :** `/personalized/newsong`
### 推荐电台
-说明:调用此接口,可获取推荐电台
-**接口地址:**
-`/personalized/djprogram`
+说明 : 调用此接口 , 可获取推荐电台
-**调用例子:**
-`/personalized/djprogram`
+**接口地址 :** `/personalized/djprogram`
+
+**调用例子 :** `/personalized/djprogram`
### 推荐节目
-说明:调用此接口,可获取推荐电台
-**接口地址:**
-`/program/recommend`
+说明 : 调用此接口 , 可获取推荐电台
-**调用例子:**
-`/program/recommend`
+**接口地址 :** `/program/recommend`
+
+**调用例子 :** `/program/recommend`
### 独家放送
-说明:调用此接口,可获取独家放送
-**接口地址:**
-`/personalized/privatecontent`
+说明 : 调用此接口 , 可获取独家放送
-**调用例子:**
-`/personalized/privatecontent`
+**接口地址 :** `/personalized/privatecontent`
+**调用例子 :** `/personalized/privatecontent`
### mv 排行
-说明:调用此接口,可获取 mv 排行
-**可选参数:**
-`limit`: 取出数量,默认为 30
+说明 : 调用此接口 , 可获取 mv 排行
-`offset`: 偏移数量,用于分页,如:(页数-1)*30, 其中 30 为 limit 的值,默认为0
+**可选参数 :** `limit`: 取出数量 , 默认为 30
-**接口地址:**
-`top/mv`
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认
+为 0
-**调用例子:**
-`top/mv?limit=10`
+**接口地址 :** `top/mv`
+
+**调用例子 :** `top/mv?limit=10`
### 获取 mv 数据
-说明:调用此接口,传入 mvid (在搜索音乐的时候传 type=1004获得) ,可获取对应 MV 数据,数据包含 mv 名字,歌手,发布时间, mv 视频地址等数据,其中 mv 视频网易做了防盗链处理,不能直接播放,需要播放的话需要调用'播放 mv' 接口
-**必选参数:**
-`mvid`: mv 的 id
+说明 : 调用此接口 , 传入 mvid ( 在搜索音乐的时候传 type=1004 获得 ) , 可获取对应
+MV 数据 , 数据包含 mv 名字 , 歌手 , 发布时间 , mv 视频地址等数据 , 其中 mv 视频
+网易做了防盗链处理 , 不能直接播放 , 需要播放的话需要调用 ' 播放 mv' 接口
-**接口地址:**
-`/mv`
+**必选参数 :** `mvid`: mv 的 id
-**调用例子:**
-`/mv?mvid=5436712`
+**接口地址 :** `/mv`
-返回数据如下图:
+**调用例子 :** `/mv?mvid=5436712`
+
+返回数据如下图 :

-
### 播放 mv
-说明:调用此接口,传入 mv 地址,可播放 mv,也可将接口嵌入 video 标签使用,由于使用了 'pipe',进度条无法通过拖动进度条控制进度,如有解决方案可提出 PR 或者自行改造
-**可选参数:**
-`url`: mv 的 地址
+说明 : 调用此接口 , 传入 mv 地址 , 可播放 mv, 也可将接口嵌入 video 标签使用 , 由
+于使用了 'pipe', 进度条无法通过拖动进度条控制进度 , 如有解决方案可提出 PR 或者自
+行改造
-**接口地址:**
-`/mv/url`
+**可选参数 :** `url`: mv 的 地址
-**调用例子:**
+**接口地址 :** `/mv/url`
+
+**调用例子 :**
`/mv/url?url=http://v4.music.126.net/20170422034915/c98eab2f5e2c85fc8de2ab3f0f8ed1c6/web/cloudmusic/MjQ3NDQ3MjUw/89a6a279dc2acfcd068b45ce72b1f560/533e4183a709699d566180ed0cd9abe9.mp4`
-如下图:
+如下图 :

-
### 排行榜
-说明:调用此接口,传入数字 idx, 可获取不同排行榜
-**必选参数:**
-`idx`: 对象 key, 对应以下排行榜
+说明 : 调用此接口 , 传入数字 idx, 可获取不同排行榜
+
+**必选参数 :** `idx`: 对象 key, 对应以下排行榜
```
"0": 云音乐新歌榜,
@@ -1044,110 +958,103 @@ docker run -d -p 3000:3000 pengxiao/netease-music-api
"23": 云音乐嘻哈榜
```
-**接口地址:**
-`/top/list`
+**接口地址 :** `/top/list`
-**调用例子:**
-`/top/list?idx=6`
+**调用例子 :** `/top/list?idx=6`
-返回数据如下图:
+返回数据如下图 :

### 歌手榜
-说明:调用此接口,可获取PC版排行榜中的歌手榜
-**接口地址:**
-`/toplist/artist`
+说明 : 调用此接口 , 可获取 PC 版排行榜中的歌手榜
-**调用例子:**
-`/toplist/artist`
+**接口地址 :** `/toplist/artist`
+
+**调用例子 :** `/toplist/artist`
### 云盘
-说明:登陆后调用此接口,可获取云盘数据,获取的数据没有对应 url,需要再调用一次 `/music/url` 获取 url
-**接口地址:**
-`/user/cloud`
+说明 : 登陆后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一
+次 `/music/url` 获取 url
-**调用例子:**
-`/user/cloud`
+**接口地址 :** `/user/cloud`
-### 电台-推荐
-说明:登陆后调用此接口,可获得推荐电台
+**调用例子 :** `/user/cloud`
-**接口地址:**
-`/dj/recommend`
+### 电台 - 推荐
-**调用例子:**
-`/dj/recommend`
+说明 : 登陆后调用此接口 , 可获得推荐电台
-### 电台-分类
-说明:登陆后调用此接口,可获得电台类型
+**接口地址 :** `/dj/recommend`
-**接口地址:**
-`/dj/catelist`
+**调用例子 :** `/dj/recommend`
-**调用例子:**
-`/dj/catelist`
+### 电台 - 分类
-### 电台-分类推荐
-说明:登陆后调用此接口,可获得推荐电台
+说明 : 登陆后调用此接口 , 可获得电台类型
-**必选参数:**
-`type`: 电台类型,数字,可通过`/dj/catelist`获取,对应关系为 id 对应 此接口的 type, name 对应类型意义
+**接口地址 :** `/dj/catelist`
-**接口地址:**
-`/dj/recommend/type`
+**调用例子 :** `/dj/catelist`
-**调用例子:**
-`/dj/recommend/type?type=1`
+### 电台 - 分类推荐
-### 电台-订阅
-说明:登陆后调用此接口,传入`rid`,可订阅 dj,dj 的 `rid` 可通过搜索指定 type='1009'获取其 id,如`/search?keywords=代码时间&type=1009`
+说明 : 登陆后调用此接口 , 可获得推荐电台
-**必选参数:**
-`rid`: 电台 的 id
+**必选参数 :** `type`: 电台类型 , 数字 , 可通过`/dj/catelist`获取 , 对应关系为
+id 对应 此接口的 type, name 对应类型意义
-**接口地址:**
-`/dj/sub`
+**接口地址 :** `/dj/recommend/type`
-**调用例子:**
-`/dj/sub?rid=336355127&t=1` (对应关注'代码时间')
-`/dj/sub?rid=336355127&t=0` (对应取消关注'代码时间')
+**调用例子 :** `/dj/recommend/type?type=1`
-### 电台-详情
-说明:登陆后调用此接口,传入`rid`,可获得对应电台的详情介绍
+### 电台 - 订阅
-**必选参数:**
-`rid`: 电台 的 id
+说明 : 登陆后调用此接口 , 传入`rid`, 可订阅 dj,dj 的 `rid` 可通过搜索指定
+type='1009' 获取其 id, 如`/search?keywords= 代码时间 &type=1009`
-**接口地址:**
-`/dj/detail?rid=336355127`
+**必选参数 :** `rid`: 电台 的 id
-**调用例子:**
-`/dj/detail?rid=336355127` (对应'代码时间'的详情介绍)
+**接口地址 :** `/dj/sub`
-### 电台-节目
-说明:登陆后调用此接口,传入`rid`,可查看对应电台的电台节目以及对应的 id, 需要注意的是这个接口返回的 mp3Url 已经无效,都为 null, 但是通过调用 `/music/url` 这个接口,传入节目 id 仍然能获取到节目音频,如 `/music/url?id=478446370` 获取代码时间的一个节目的音频
+**调用例子 :** `/dj/sub?rid=336355127&t=1` ( 对应关注 ' 代码时间 ')
+`/dj/sub?rid=336355127&t=0` ( 对应取消关注 ' 代码时间 ')
-**必选参数:**
-`rid`: 电台 的 id
+### 电台 - 详情
-**接口地址:**
-`/dj/program`
+说明 : 登陆后调用此接口 , 传入`rid`, 可获得对应电台的详情介绍
-**调用例子:**
-`/dj/program?rid=336355127` (对应'代码时间'的节目列表)
+**必选参数 :** `rid`: 电台 的 id
+**接口地址 :** `/dj/detail?rid=336355127`
+**调用例子 :** `/dj/detail?rid=336355127` ( 对应 ' 代码时间 ' 的详情介绍 )
+
+### 电台 - 节目
+
+说明 : 登陆后调用此接口 , 传入`rid`, 可查看对应电台的电台节目以及对应的 id, 需要
+注意的是这个接口返回的 mp3Url 已经无效 , 都为 null, 但是通过调用 `/music/url` 这
+个接口 , 传入节目 id 仍然能获取到节目音频 , 如 `/music/url?id=478446370` 获取代
+码时间的一个节目的音频
+
+**必选参数 :** `rid`: 电台 的 id
+
+**接口地址 :** `/dj/program`
+
+**调用例子 :** `/dj/program?rid=336355127` ( 对应 ' 代码时间 ' 的节目列表 )
## 离线访问此文档
-此文档同时也是 Progressive Web Apps(PWA), 加入了serviceWorker,可离线访问
+此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问
## 关于此文档
-此文档由 [docsify](https://github.com/QingWei-Li/docsify/) 生成
-docsify 是一个动态生成文档网站的工具。不同于 GitBook、Hexo 的地方是它不会生成将 .md 转成 .html 文件,所有转换工作都是在运行时进行。
+
+此文档由 [docsify](https://github.com/QingWei-Li/docsify/) 生成 docsify 是一个动
+态生成文档网站的工具。不同于 GitBook、Hexo 的地方是它不会生成将 .md 转成 .html
+文件,所有转换工作都是在运行时进行。
## License
+
[The MIT License (MIT)](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/LICENSE)
diff --git a/public/test.html b/public/test.html
new file mode 100644
index 0000000..2d19a76
--- /dev/null
+++ b/public/test.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+ test
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/router/loginCellphone.js b/router/loginCellphone.js
index 8501217..a75e972 100644
--- a/router/loginCellphone.js
+++ b/router/loginCellphone.js
@@ -1,34 +1,34 @@
-const express = require('express')
-const crypto = require('crypto')
-const router = express()
-const { createWebAPIRequest } = require('../util/util')
+const express = require("express");
+const crypto = require("crypto");
+const router = express();
+const { createWebAPIRequest } = require("../util/util");
-router.get('/', (req, res) => {
- const phone = req.query.phone
- const cookie = req.get('Cookie') ? req.get('Cookie') : ''
- const md5sum = crypto.createHash('md5')
- md5sum.update(req.query.password)
+router.get("/", (req, res) => {
+ const phone = req.query.phone;
+ const cookie = req.get("Cookie") ? req.get("Cookie") : "";
+ const md5sum = crypto.createHash("md5");
+ md5sum.update(req.query.password);
const data = {
phone: phone,
- password: md5sum.digest('hex'),
- rememberLogin: 'true'
- }
+ password: md5sum.digest("hex"),
+ rememberLogin: "true"
+ };
createWebAPIRequest(
- 'music.163.com',
- '/weapi/login/cellphone',
- 'POST',
+ "music.163.com",
+ "/weapi/login/cellphone",
+ "POST",
data,
cookie,
(music_req, cookie) => {
- // console.log(music_req)
- cookie = cookie&&cookie.map(x => x.replace("Domain=.music.163.com", ""))
+ cookie =
+ cookie && cookie.map(x => x.replace("Domain=.music.163.com", ""));
res.set({
- 'Set-Cookie': cookie
- })
- res.send(music_req)
+ "Set-Cookie": cookie
+ });
+ res.send(music_req);
},
- err => res.status(502).send('fetch error')
- )
-})
+ err => res.status(502).send("fetch error")
+ );
+});
-module.exports = router
+module.exports = router;
diff --git a/router/playlist_detail.js b/router/playlist_detail.js
index fa3d056..f8652fd 100644
--- a/router/playlist_detail.js
+++ b/router/playlist_detail.js
@@ -1,36 +1,29 @@
-const http = require('http')
-const express = require('express')
-const router = express()
-const { createWebAPIRequest } = require('../util/util')
+const http = require("http");
+const express = require("express");
+const router = express();
+const { createWebAPIRequest } = require("../util/util");
-router.get('/', (req, res) => {
- const cookie = req.get('Cookie') ? req.get('Cookie') : ''
- let detail, imgurl
+router.get("/", (req, res) => {
+ const cookie = req.get("Cookie") ? req.get("Cookie") : "";
const data = {
id: req.query.id,
- offset: 0,
- total: true,
- limit: 1000,
- n: 1000,
- csrf_token: ''
- }
+ csrf_token: ""
+ };
createWebAPIRequest(
- 'music.163.com',
- '/weapi/v3/playlist/detail',
- 'POST',
+ "music.163.com",
+ "/weapi/v3/playlist/detail",
+ "POST",
data,
cookie,
music_req => {
- console.log(music_req)
- // detail = music_req
- res.send(music_req)
- // mergeRes()
+ // console.log(music_req)
+ res.send(music_req);
},
err => {
- res.status(502).send('fetch error')
+ res.status(502).send("fetch error");
}
- )
+ );
// FIXME:i dont know the api to get coverimgurl
// so i get it by parsing html
@@ -62,6 +55,6 @@ router.get('/', (req, res) => {
// res.send(detail)
// }
// }
-})
+});
-module.exports = router
+module.exports = router;
diff --git a/router/user_playlist.js b/router/user_playlist.js
index 4200ff9..7dbf879 100644
--- a/router/user_playlist.js
+++ b/router/user_playlist.js
@@ -1,24 +1,27 @@
-const express = require('express')
-const router = express()
-const { createWebAPIRequest } = require('../util/util')
+const express = require("express");
+const router = express();
+const { createWebAPIRequest } = require("../util/util");
-router.get('/', (req, res) => {
- const cookie = req.get('Cookie') ? req.get('Cookie') : ''
+router.get("/", (req, res) => {
+ const cookie = req.get("Cookie") ? req.get("Cookie") : "";
const data = {
- offset: 0,
+ offset: req.query.offset || 0,
uid: req.query.uid,
- limit: 1000,
- csrf_token: ''
- }
+ limit: req.query.limit || 30, //貌似无效
+ csrf_token: ""
+ };
createWebAPIRequest(
- 'music.163.com',
- '/weapi/user/playlist',
- 'POST',
+ "music.163.com",
+ "/weapi/user/playlist",
+ "POST",
data,
cookie,
- music_req => res.send(music_req),
- err => res.status(502).send('fetch error')
- )
-})
+ music_req => {
+ res.send(music_req);
+ // console.log(JSON.parse(music_req))
+ },
+ err => res.status(502).send("fetch error")
+ );
+});
-module.exports = router
+module.exports = router;
From 7f69947f2c936a7bb6b916f0361987fd287dab4c Mon Sep 17 00:00:00 2001
From: binaryify
Date: Fri, 12 Jan 2018 14:48:13 +0800
Subject: [PATCH 15/16] improve
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 01f1574..bef4ab6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "NeteaseCloudMusicApi",
- "version": "2.8.2",
+ "version": "2.8.3",
"description": "网易云音乐 NodeJS 版 API",
"scripts": {
"start": "node app.js",
From 3afe5fae7cb0bb583fbac14e1e1d9cf4f75b651c Mon Sep 17 00:00:00 2001
From: binaryify
Date: Fri, 12 Jan 2018 14:51:23 +0800
Subject: [PATCH 16/16] improve
---
docs/README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/README.md b/docs/README.md
index 8199fda..508edb8 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -164,6 +164,7 @@ docker run -d -p 3000:3000 pengxiao/netease-music-api
## 接口文档
### 调用前须知
+* 为使用方便,降低门槛,登录接口直接使用了 get 明文请求,请按实际需求对源码修改
* 由于接口做了缓存处理 ( 缓存 2 分钟 , 可在 app.js 设置 , 可能会导致登陆后获取不
到 cookie), 相同的 url 会在两分钟内只向网易服务器发一次请求 , 如果遇到不需要缓