mirror of
https://gitlab.com/Binaryify/neteasecloudmusicapi.git
synced 2025-05-23 22:37:41 +08:00
commit
231f08bca5
@ -1,4 +1,10 @@
|
||||
# 更新日志
|
||||
### 2.18.0 | 2018.08.29
|
||||
新增获取视频数据接口,完善文档 #301,感谢 @izhenyuls
|
||||
|
||||
### 2.17.0 | 2018.08.28
|
||||
新增登录状态查询接口 #302 ,完善文档,完善路由注册 #297
|
||||
|
||||
### 2.16.0 | 2018.08.09
|
||||
- Fixed #288,#289,#290
|
||||
|
||||
|
@ -92,6 +92,9 @@
|
||||
70. 订阅的电台列表
|
||||
71. 相关歌单推荐
|
||||
72. 付费精选接口
|
||||
73. 音乐是否可用检查接口
|
||||
74. 登录状态
|
||||
75. 获取视频数据
|
||||
|
||||
## 环境要求
|
||||
|
||||
|
2
app.js
2
app.js
@ -45,7 +45,7 @@ const { createWebAPIRequest, request } = require("./util/util");
|
||||
const Wrap = fn => (req, res) => fn(req, res, createWebAPIRequest, request);
|
||||
|
||||
// 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由
|
||||
fs.readdirSync("./router/").reverse().forEach(file => {
|
||||
fs.readdirSync(path.resolve(__dirname, "router")).reverse().forEach(file => {
|
||||
if (/\.js$/i.test(file) === false) {
|
||||
return;
|
||||
}
|
||||
|
@ -15,6 +15,12 @@
|
||||
跨站请求伪造 (CSRF), 伪造请求头 , 调用官方 API
|
||||
|
||||
## 版本新特性
|
||||
### 2.18.0 | 2018.08.29
|
||||
新增获取视频数据接口
|
||||
|
||||
### 2.17.0 | 2018.08.28
|
||||
新增登录状态查询接口
|
||||
|
||||
### 2.15.0 | 2018.07.30
|
||||
新增相关歌单推荐和付费精选接口,增加歌手列表接口按首字母索引查找参数
|
||||
|
||||
@ -109,7 +115,7 @@ banner 接口 , 增加刷新登录接口 , 增加电台相关接口 , 补充评
|
||||
48. 独家放送
|
||||
49. mv 排行
|
||||
50. 获取 mv 数据
|
||||
51. 播放 mv
|
||||
51. 播放 mv/视频
|
||||
52. 排行榜
|
||||
53. 歌手榜
|
||||
54. 云盘
|
||||
@ -131,7 +137,9 @@ banner 接口 , 增加刷新登录接口 , 增加电台相关接口 , 补充评
|
||||
70. 订阅的电台列表
|
||||
71. 相关歌单推荐
|
||||
72. 付费精选接口
|
||||
|
||||
73. 音乐是否可用检查接口
|
||||
74. 登录状态
|
||||
75. 获取视频数据
|
||||
|
||||
## 安装
|
||||
|
||||
@ -269,8 +277,17 @@ Cookies
|
||||
|
||||
说明 : 调用此接口 , 可刷新登录状态
|
||||
|
||||
|
||||
**调用例子 :** `/login/refresh`
|
||||
|
||||
|
||||
### 登录状态
|
||||
说明 : 调用此接口,可获取登录状态
|
||||
|
||||
**接口地址 :** `/login/status`
|
||||
返回数据如下图:
|
||||

|
||||
|
||||
### 获取用户详情
|
||||
|
||||
说明 : 登陆后调用此接口 , 传入用户 id, 可以获取用户详情
|
||||
@ -588,6 +605,17 @@ category Code 取值:
|
||||
返回数据如下图 :
|
||||

|
||||
|
||||
### 音乐是否可用
|
||||
说明: 调用此接口,传入歌曲 id, 可获取音乐是否可用,返回 `{ success: true, message: 'ok' }` 或者 `{ success: false, message: '亲爱的,暂无版权' }`
|
||||
|
||||
**必选参数 :** `id` : 歌曲 id
|
||||
|
||||
**可选参数** : `br`: 码率,默认设置了999000即最大码率,如果要 320k 则可设置为 320000,其他类推
|
||||
|
||||
**接口地址 :** `/check/music`
|
||||
|
||||
**调用例子 :** `/check/music?id=33894312`
|
||||
|
||||
### 搜索
|
||||
|
||||
说明 : 调用此接口 , 传入搜索关键词可以搜索该音乐 / 专辑 / 歌手 / 歌单 / 用户 ,
|
||||
@ -599,8 +627,8 @@ mp3url 不能直接用 , 可通过 `/music/url` 接口传入歌曲 id 获取具
|
||||
**可选参数 :** `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: 电台, 1014: 视频
|
||||
|
||||
**接口地址 :** `/search`
|
||||
|
||||
@ -1139,7 +1167,7 @@ mp3url 不能直接用 , 可通过 `/music/url` 接口传入歌曲 id 获取具
|
||||
|
||||
说明 : 调用此接口 , 传入 mvid ( 在搜索音乐的时候传 type=1004 获得 ) , 可获取对应
|
||||
MV 数据 , 数据包含 mv 名字 , 歌手 , 发布时间 , mv 视频地址等数据 , 其中 mv 视频
|
||||
网易做了防盗链处理 , 不能直接播放 , 需要播放的话需要调用 ' 播放 mv' 接口
|
||||
网易做了防盗链处理 , 可能不能直接播放 , 需要播放的话需要调用 ' 播放 mv/视频' 接口
|
||||
|
||||
**必选参数 :** `mvid`: mv 的 id
|
||||
|
||||
@ -1151,13 +1179,28 @@ MV 数据 , 数据包含 mv 名字 , 歌手 , 发布时间 , mv 视频地址等
|
||||
|
||||

|
||||
|
||||
### 播放 mv
|
||||
### 获取视频数据
|
||||
|
||||
说明 : 调用此接口 , 传入 mv 地址 , 可播放 mv, 也可将接口嵌入 video 标签使用 , 由
|
||||
说明 : 调用此接口 , 传入视频的 id ( 在搜索音乐的时候传 type=1014 获得 ) , 可获取对应
|
||||
视频数据,其中视频网易做了防盗链处理 , 可能不能直接播放 , 需要播放的话需要调用 ' 播放 mv/视频' 接口
|
||||
|
||||
**必选参数 :** ` id`: 视频 的 id
|
||||
|
||||
**接口地址 :** `/video`
|
||||
|
||||
**调用例子 :** `/video?id=89ADDE33C0AAE8EC14B99F6750DB954D`
|
||||
|
||||
返回数据如下图 :
|
||||
|
||||

|
||||
|
||||
### 播放 mv/视频
|
||||
|
||||
说明 : 调用此接口 , 传入 mv/视频 地址 , 可播放 mv/视频, 也可将接口嵌入 video 标签使用 , 由
|
||||
于使用了 'pipe', 进度条无法通过拖动进度条控制进度 , 如有解决方案可提出 PR 或者自
|
||||
行改造
|
||||
|
||||
**可选参数 :** `url`: mv 的 地址
|
||||
**可选参数 :** `url`: mv/视频 的 地址
|
||||
|
||||
**接口地址 :** `/mv/url`
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "NeteaseCloudMusicApi",
|
||||
"version": "2.16.0",
|
||||
"version": "2.18.0",
|
||||
"description": "网易云音乐 NodeJS 版 API",
|
||||
"scripts": {
|
||||
"start": "node app.js",
|
||||
|
@ -1,27 +1,27 @@
|
||||
module.exports = (req, res, createWebAPIRequest, request) => {
|
||||
const id = parseInt(req.query.id);
|
||||
const br = parseInt(req.query.br || 999000);
|
||||
const id = parseInt(req.query.id)
|
||||
const br = parseInt(req.query.br || 999000)
|
||||
const data = {
|
||||
ids: [id],
|
||||
br: br,
|
||||
csrf_token: ""
|
||||
};
|
||||
const cookie = req.get("Cookie") ? req.get("Cookie") : "";
|
||||
csrf_token: ''
|
||||
}
|
||||
const cookie = req.get('Cookie') ? req.get('Cookie') : ''
|
||||
|
||||
createWebAPIRequest(
|
||||
"music.163.com",
|
||||
"/weapi/song/enhance/player/url",
|
||||
"POST",
|
||||
'music.163.com',
|
||||
'/weapi/song/enhance/player/url',
|
||||
'POST',
|
||||
data,
|
||||
cookie,
|
||||
music_req => {
|
||||
if (JSON.parse(music_req).code == 200) {
|
||||
return res.send({ success: true, message: "ok" });
|
||||
return res.send({ success: true, message: 'ok' })
|
||||
}
|
||||
return res.send({ success: false, message: "亲爱的,暂无版权" });
|
||||
return res.send({ success: false, message: '亲爱的,暂无版权' })
|
||||
},
|
||||
err => {
|
||||
res.status(502).send("fetch error");
|
||||
res.status(502).send('fetch error')
|
||||
}
|
||||
);
|
||||
};
|
||||
)
|
||||
}
|
||||
|
@ -1,26 +1,26 @@
|
||||
// 搜索
|
||||
module.exports = (req, res, createWebAPIRequest, request) => {
|
||||
const cookie = req.get("Cookie") ? req.get("Cookie") : "";
|
||||
const keywords = req.query.keywords;
|
||||
const type = req.query.type || 1;
|
||||
const limit = req.query.limit || 30;
|
||||
const offset = req.query.offset || 0;
|
||||
// *(type)* 搜索单曲(1),歌手(100),专辑(10),歌单(1000),用户(1002)
|
||||
const cookie = req.get('Cookie') ? req.get('Cookie') : ''
|
||||
const keywords = req.query.keywords
|
||||
const type = req.query.type || 1
|
||||
const limit = req.query.limit || 30
|
||||
const offset = req.query.offset || 0
|
||||
// *(type)* 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频
|
||||
const data = {
|
||||
csrf_token: "",
|
||||
csrf_token: '',
|
||||
limit,
|
||||
type,
|
||||
s: keywords,
|
||||
offset
|
||||
};
|
||||
}
|
||||
|
||||
createWebAPIRequest(
|
||||
"music.163.com",
|
||||
"/weapi/search/get",
|
||||
"POST",
|
||||
'music.163.com',
|
||||
'/weapi/search/get',
|
||||
'POST',
|
||||
data,
|
||||
cookie,
|
||||
music_req => res.send(music_req),
|
||||
err => res.status(502).send("fetch error")
|
||||
);
|
||||
};
|
||||
err => res.status(502).send('fetch error')
|
||||
)
|
||||
}
|
||||
|
18
router/video.js
Normal file
18
router/video.js
Normal file
@ -0,0 +1,18 @@
|
||||
//video
|
||||
module.exports = (req, res, createWebAPIRequest, request) => {
|
||||
const cookie = req.get('Cookie') ? req.get('Cookie') : ''
|
||||
const videoId = req.query.id
|
||||
const data = {}
|
||||
|
||||
createWebAPIRequest(
|
||||
'music.163.com',
|
||||
`/api/cloudvideo/playurl?ids=['${videoId}']&resolution=720`,
|
||||
'POST',
|
||||
data,
|
||||
cookie,
|
||||
music_req => {
|
||||
res.send(music_req)
|
||||
},
|
||||
err => res.status(502).send('fetch error')
|
||||
)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user