diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..6c725ce
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,34 @@
+
+# EditorConfig is awesome: http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+
+# Matches multiple files with brace expansion notation
+# Set default charset
+[*.{js,py}]
+charset = utf-8
+
+# 4 space indentation
+[*.py]
+indent_style = space
+indent_size = 4
+
+# Tab indentation (no size specified)
+[Makefile]
+indent_style = tab
+
+# Indentation override for all JS under lib directory
+[*.{js,ts}]
+indent_style = space
+indent_size = 2
+
+# Matches the exact files either package.json or .travis.yml
+[{package.json,.travis.yml}]
+indent_style = space
+indent_size = 2
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..f58b0ba
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,49 @@
+module.exports = {
+ root: true,
+ parserOptions: {
+ parser: 'babel-eslint',
+ ecmaVersion: 2018,
+ sourceType: 'module',
+ },
+ plugins: ['html'],
+ extends: ['plugin:prettier/recommended'],
+ env: {
+ browser: true,
+ node: true,
+ },
+
+ rules: {
+ indent: ['error', 2, { SwitchCase: 1 }],
+ 'space-infix-ops': ['error', { int32Hint: false }],
+ 'key-spacing': [
+ 2,
+ {
+ beforeColon: false,
+ afterColon: true,
+ },
+ ],
+ 'no-octal': 2,
+ 'no-redeclare': 2,
+ 'comma-spacing': 2,
+ 'no-new-object': 2,
+ 'arrow-spacing': 2,
+ quotes: [
+ 2,
+ 'single',
+ {
+ avoidEscape: true,
+ allowTemplateLiterals: true,
+ },
+ ],
+ },
+ overrides: [
+ {
+ files: ['**/*.ts'],
+ parser: '@typescript-eslint/parser',
+ extends: [
+ 'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
+ // 'prettier/@typescript-eslint',
+ ],
+ },
+ ],
+}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4bbcc78
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+node_modules
+*.log
+.idea
+.vscode
+.history
+examples/moddef.json
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..1d6a290
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,4 @@
+static
+docs
+node_modules
+module_example
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..05c968c
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "semi": false,
+ "trailingComma": "all",
+ "singleQuote": true
+}
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..6e72888
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+
+node_js:
+ - 12
diff --git a/CHANGELOG.MD b/CHANGELOG.MD
new file mode 100644
index 0000000..441f150
--- /dev/null
+++ b/CHANGELOG.MD
@@ -0,0 +1,1020 @@
+# 更新日志
+### 4.6.7 | 2022.07.17
+- 音乐是否可用接口更新 #1544
+
+- 获取精品歌单接口更新描述 #1544
+
+### 4.6.6 | 2022.06.20
+- npx 方式运行完善和增加文档说明
+
+### 4.6.5 | 2022.06.19
+- 修复npx使用路径错误
+
+### 4.6.4 | 2022.06.15
+- 修复歌单收藏/取消收藏歌曲接口报错问题 #1551
+
+### 4.6.3 | 2022.06.15
+- 修复 npm 包文件缺失的问题
+
+### 4.6.2 | 2022.05.30
+- 修复测试不通过的问题
+
+### 4.6.1 | 2022.05.29
+- 修复请求接口提示需要验证的问题,增加游客登录接口,服务启动更新游客cookie
+
+### 4.6.0 | 2022.05.29
+- 修复请求接口提示需要验证的问题 [#1541](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1541)
+
+### 4.5.14 | 2022.05.06
+- 修复获取歌单所有歌曲接口分页问题 [#1524](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1524)
+
+- 增加支持罗马音歌词返回 [#1523](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1523)
+
+### 4.5.12 | 2022.04.15
+- 新增`黑胶时光机`接口 [#1511](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1511)
+
+### 4.5.11 | 2022.04.06
+- 修复云盘接口mimetype获取错误 [#1503](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1503)
+
+### 4.5.10 | 2022.03.28
+- 修复了若干问题
+
+- 新增`歌单更新播放量`接口
+
+### 4.5.9 | 2022.03.20
+- 修复云盘上传接口部分文件名格式上传失败的问题
+
+- 新增 `/inner/version` 接口,用于获取当前版本号
+
+### 4.5.8 | 2022.03.05
+- 新增歌手粉丝数量接口[#1485](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1485)
+
+- 新增音乐人任务(新)接口
+
+- 更新 `appver`
+
+### 4.5.6 | 2022.02.12
+- 歌单封面上传接口缺失参数时返回状态码修正
+
+### 4.5.6 | 2022.02.09
+- 新增重复昵称检测接口 [#1469](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1469)
+
+### 4.5.5 | 2022.02.09
+- 搜索接口支持搜索声音
+
+### 4.5.4 | 2022.02.09
+- 修复云盘上传无法获取到文件的问题
+
+### 4.5.3 | 2022.02.04
+- 增加签到进度接口 [#1462](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1462)
+
+### 4.5.2 | 2022.01.28
+- 入口文件优化 [#1457](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1457)
+
+### 4.5.0 | 2022.01.27
+
+- app.js 重构[#1453](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1453)
+
+- 修复 pkg 打包问题
+
+### 4.3.0 | 2022.01.22
+
+- fix: 发送/删除评论、点赞失败 [#1446](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1446)
+
+- 增加二进制文件 node 标识 [#1440](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1440)
+
+- 获取歌单所有歌曲增加 offset 偏移量设置[#1435](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1435)
+
+### 4.2.0 | 2021.11.23
+
+- 合并相同接口(发送文本动态,使用`/share/resource`接口代替);增加歌手视频接口;增加创建共享歌单的用法 [#1402](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1402)
+
+- 新增最近播放-歌曲,最近播放-视频,最近播放-声音,最近播放-歌单,最近播放-专辑,最近播放-播客等接口
+
+### 4.1.1 | 2021.11.20
+
+- 添加乐签信息接口 [#1365](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1365)
+
+### 4.1.0 | 2021.11.20
+
+- 修复新版评论返回参数错误问题 [#1393](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1393) [#1377](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1377)
+
+- 新增获取歌单所有歌曲的 API [#1397](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1397)
+
+- 新增发送文本动态接口, 获取客户端歌曲下载链接 url 接口 [#1391](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1391)
+
+### 4.0.23 | 2021.9.15
+
+- 修复文件上传设置问题 [#1355](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1355)
+
+- 修复 interface 不完整问题 [#1356](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1356)
+
+### 4.0.22 | 2021.9.08
+
+- 修复 URI malformed 错误 [#1347](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1347)
+
+### 4.0.21 | 2021.9.04
+
+- 修复云盘上传失败问题 #1332
+
+- 修复调用不存在的接口导致 API 崩溃的问题 #1345
+
+- 修复代理设置问题 #1343
+
+- 新增歌曲相关视频接口(歌曲相关视频 公开隐私歌单) [#1337](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1337)
+
+### 4.0.20 | 2021.8.20
+
+- 手机登录增加验证码登录方式 [#1328](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1328)
+
+### 4.0.19 | 2021.8.10
+
+- 修复若干问题
+
+### 4.0.17 | 2021.7.16
+
+- 修复若干问题
+
+### 4.0.16 | 2021.6.2
+
+- 新增歌手粉丝,数字专辑详情,数字专辑销量,音乐人数据概况,音乐人播放趋势,音乐人任务,账号云豆数,领取云豆等接口 [#1252](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1252)
+
+### 4.0.15 | 2021.5.29
+
+- 新增已购单曲,获取 mlog 播放地址,将 mlog id 转为视频 id,vip 成长值,vip 成长值获取记录,vip 任务,领取 vip 成长值等接口 [#1248](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1248)
+
+### 4.0.14 | 2021.5.28
+
+- 增加云贝推歌接口,云贝推歌历史记录接口 [#1246](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1246)
+
+### 4.0.13 | 2021.5.24
+
+- 修复解析问题,改善 Docker 支持 [#1241](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/1241)
+
+### 4.0.12 | 2021.5.1
+
+- 首页-发现接口增加 cursor 参数,refresh 默认设为 false [#1217](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1217)
+
+- 更新`song/detail` 接口
+
+### 4.0.11 | 2021.4.26
+
+- 新增云盘歌曲信息匹配纠正接口 [#1212](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1212)
+
+### 4.0.10 | 2021.4.09
+
+- 新增用户历史评论接口 [#1197](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1197)
+
+### 4.0.9 | 2021.3.13
+
+- 新增一起听状态接口 [#1170](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1170)
+
+### 4.0.8 | 2021.2.27
+
+- 加入 vercel 配置文件,支持 vercel 部署
+
+### 4.0.7 | 2021.2.27
+
+- 更新红心接口,修复红心接口 460 错误问题 [#1151](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1151)
+
+- 更新发送验证码接口
+
+- 注册接口添加 countrycode 参数 [#1152](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1152)
+
+- 新增绑定手机接口 [#1152](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1152)
+
+- 更新 song/detail 接口 [#1143](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1143)
+
+- 用户粉丝接口修改分页参数 [#1161](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1161)
+
+### 4.0.6 | 2021.2.20
+
+- 修复 eapi 接口无法正确解密 response 的问题 [#1138](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1138)
+
+### 4.0.5 | 2021.2.19
+
+- 修复红心接口默认不红心的问题 [#1126](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1126)
+
+### 4.0.4 | 2021.2.18
+
+- 移除云村热评接口(官方下架) [#1111](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1111)
+- 更新 app version
+
+### 4.0.3 | 2021.1.28
+
+- 修复云盘接口中文音乐信息乱码的问题 [#1108](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1108)
+
+### 4.0.2 | 2021.1.18
+
+- 修复未绑定手机号对歌单添加或删除歌曲无响应的问题 [#1099](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1099)
+
+### 4.0.1 | 2021.1.09
+
+- 新增歌单详情动态接口 [#1088](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1088)
+
+### 4.0.0 | 2021.1.03
+
+- 新增云盘上传接口,新增二维码登录相关接口和相关 demo(http://localhost:3000/qrlogin.html, http://localhost:3000/cloud.html),更新 d.ts
+
+- 升级部分接口加密方法("linuxapi" 都替换到了"api")
+
+- 更新 `login/status` 接口(返回字段和之前不一样)
+
+### 3.47.5 | 2020.12.20
+
+- 更新 appver [#1060](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1060)
+
+### 3.47.4 | 2020.12.03
+
+- 修复收藏的专栏接口无法调用的问题 [#1042](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1042)
+
+### 3.47.3 | 2020.11.22
+
+- 新增歌手详情接口 [#1035](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1035)
+
+### 3.47.2 | 2020.11.15
+
+- 新增关注歌手新歌/新 MV 接口 [#1028](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1028)
+
+### 3.47.1 | 2020.11.14
+
+- 修复使用 post 请求取消喜欢音乐会失败的问题 [#1024](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1024)
+
+- 新增抱一抱评论和评论抱一抱列表接口 [#1016](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1016)
+
+- 新增收藏的专栏接口[#1026](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1026)
+
+### 3.46.1 | 2020.11.7
+
+- 修复私信音乐接口出现风险提示的问题
+
+### 3.46.0 | 2020.11.7
+
+- 添加私信音乐接口 [#1016](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1016)
+
+- 添加最近联系人接口
+
+- 修复用户动态数量不准确问题 [#1010](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1010)
+
+- 修复 cloudsearch 接口分页问题 [#1015](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1015)
+
+### 3.45.3 | 2020.11.1
+
+- `相似歌手`,`首页-发现-圆形图标入口列表`接口增加匿名 token[#877](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/877) [#988](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/988)
+
+- 修复`音乐 url`接口 POST 方式手动传入 cookie 报错问题 [#1005](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1005)
+
+### 3.45.2 | 2020.10.26
+
+- 云贝完成任务接口增加`depositCode`参数
+
+### 3.45.1 | 2020.10.25
+
+- 修复代理配置失效的问题 [#992](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/992)
+
+- 修复新碟上架不返回周数据的问题,修复推荐新音乐接口返回数量问题,并添加 limit 参数支持 [#981](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/981)
+
+- 添加`云贝`相关接口 [#985](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/985)
+
+- 添加`用户账号信息`接口
+
+- 替换接口文件所有 http url 为 https
+
+### 3.44.0 | 2020.10.17
+
+- 更新`电台详情`,`电台节目详情`接口 [#977](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/977)
+
+#### Breaking change
+
+- `电台详情`接口更新后数据结构有变化
+
+### 3.43.0 | 2020.10.16
+
+- 新增`电台订阅者列表`接口 [#971](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/971)
+
+### 3.42.4 | 2020.10.07
+
+- 修复新评论接口分页参数问题
+
+### 3.42.3 | 2020.10.05
+
+- 修复新评论接口分页参数问题
+
+### 3.42.2 | 2020.10.05
+
+- 更新歌单详情接口
+
+### 3.42.1 | 2020.10.04
+
+- 新增`用户绑定信息`,`用户绑定手机`,`新版评论`,`点赞过的视频`,`收藏视频到视频歌单`,`删除视频歌单里的视频`,`最近播放的视频`,`音乐日历`等接口
+
+- 创建歌单接口增加`type`参数,可创建视频歌单
+
+### 3.41.2 | 2020.09.20
+
+- 更新`获取音乐 url`接口,未登录状态返回试听片段 [#897](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/897)
+
+### 3.41.1 | 2020.09.19
+
+- 新增`电台个性推荐接口` [#824](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/824)
+
+### 3.41.0 | 2020.09.19
+
+- 新增`精品歌单标签列表`接口 [#921](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/921)
+
+- 新增`用户等级信息`接口 [#929](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/929)
+
+- 增加新接口的 d.ts 文件,修复登录接口的 d.ts 的 countrycode 为非可选属性的错误
+
+### 3.40.1 | 2020.09.13
+
+- 更新 TypeScript 声明 [#928](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/928)
+
+### 3.40.0 | 2020.09.12
+
+- 新增 TypeScript 声明文件 [#908](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/908)
+- 更改随机 UA 相关逻辑[#922](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/922)
+
+### 3.39.0 | 2020.08.23
+
+- 新增`cloudsearch`接口[#893](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/893)
+- `mv 地址`接口修改分辨率参数 [#883](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/883)
+- 修复新碟上架接口分页问题 [#892](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/892)
+
+### 3.38.0 | 2020.08.09
+
+- 新增`楼层评论`,`歌手全部歌曲`接口 [#864](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/864) [#867](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/867)
+- 支持收藏 VIP 或付费歌曲到歌单 [#860](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/860)
+- 支持手动传入`realIP` [#863](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/863)
+
+### 3.37.2 | 2020.08.04
+
+- 修复依赖问题
+
+### 3.37.0 | 2020.08.03
+
+- 新增`更新头像`,`歌单封面上传`接口和相关例子 [#403](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/403) [#857](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/857)
+- 加入`axios`依赖
+
+### 3.36.0 | 2020.07.26
+
+- 新增`全部新碟`,`数字专辑-新碟上架`,`数字专辑&数字单曲-榜单`,`数字专辑-语种风格馆`,`数字专辑详情`接口 [#852](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/852)
+- 更新`新碟上架`接口,修改传入参数,返回数据结构有变化
+
+### 3.35.0 | 2020.07.18
+
+- 新增`首页-发现`,`首页-发现-圆形图标入口列表`接口 [#851](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/851)
+
+### 3.34.2 | 2020.07.13
+
+- 修复`获取用户播放记录`接口参数错误问题 [#849](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/849)
+
+- 增加`国家编码列表`接口 [#841](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/841)
+
+### 3.34.1 | 2020.07.06
+
+- 登录接口增加 `md5_password` 参数 [#839](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/839)
+
+### 3.34.0 | 2020.06.25
+
+- 排行榜接口废弃 idx 参数,只支持 id 参数,修复返回数据异常问题 [#830](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/830)
+- 新增`获取历史日推可用日期列表`,`获取历史日推详细数据` 接口
+
+### 3.33.2 | 2020.06.23
+
+- 更新每日推荐接口 [#826](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/826)
+
+### 3.33.1 | 2020.06.15
+
+- 修复直接调用时传入 cookie 不生效的问题 [#822](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/822)
+
+### 3.33.0 | 2020.06.10
+
+- 歌手榜支持地区参数 [#818](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/818)
+- 新增视频分类列表,推荐视频,获取全部视频列表接口 [#816](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/816)
+- 内置 apicache,修复不能在 NodeJS v13 版本使用的问题 [#817](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/817)
+
+### 3.32.3 | 2020.06.07
+
+- 修复 Nodejs 下 cookie 使用格式问题 [#812](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/812)
+
+### 3.32.2 | 2020.06.05
+
+- 新增独家放送列表接口 [#808](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/808)
+
+### 3.32.1 | 2020.06.03
+
+- 新增歌曲排序接口
+
+### 3.32.0 | 2020.06.03
+
+- 更新排行榜接口,支持传入榜单 id
+- 新增榜单顺序调整接口 [#806](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/806)
+- 完善错误提示信息
+
+### 3.31.1 | 2020.05.19
+
+- 修复`cookie`没返回的问题 [#778](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/778)
+
+### 3.31.0 | 2020.05.18
+
+- 支持 `Node.js` 调用,参考`module_example` 文件夹下的 `test.js`
+
+### 3.30.0 | 2020.05.17
+
+- 登录接口返回内容增加`cookie`字段,支持手动传入 cookie
+
+### 3.29.1 | 2020.05.13
+
+- 调整通知接口分页参数 [#761](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/761)
+
+### 3.29.0 | 2020.05.11
+
+- 支持批量删除歌单 [#760](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/760)
+
+### 3.28.0 | 2020.05.05
+
+- 新增获取 mv 点赞转发评论数数据接口
+- 新增获取视频点赞转发评论数数据接口
+
+### 3.27.0 | 2020.04.20
+
+- 新增购买专辑接口 by [TimonPeng](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/740)
+
+### 3.26.0 | 2020.04.08
+
+#### Breaking change
+
+- 更新歌手分类列表接口参数,因`cat`参数失效,调整为`type`和`area`参数
+
+### 3.25.4 | 2020.03.18
+
+- 更新歌词,歌手分类列表接口
+
+- 更新文档
+
+### 3.25.3 | 2019.11.08
+
+- 升级依赖,去除多余依赖
+
+- 优化 `test.html`
+
+### 3.25.2 | 2019.11.07
+
+- 修复邮箱登录状态码错误,增加相关提示 [#633](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/633)
+
+### 3.25.0 | 2019.11.06
+
+- 新增 `云村热评` 接口[#626](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/626)
+
+- 新增 `歌手热门50首歌曲` 接口
+
+- 新增`电台24小时节目榜`,`电台24小时主播榜`, `电台最热主播榜`,`电台主播新人榜`,`电台付费精品榜` 接口 [#606](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/606)
+
+- 调整 `歌手分类列表 ` 接口参数 [#624](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/624)
+
+### 3.24.2 | 2019.10.28
+
+- 修改默认绑定 HOST [#620](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/620)
+
+### 3.24.1 | 2019.10.25
+
+- 修改默认绑定 HOST [#615](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/615)
+
+### 3.24.0 | 2019.10.22
+
+- 新增`类别热门电台` 接口 [#607](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/607)
+
+### 3.23.0 | 2019.10.16
+
+- 修复电台 banner 接口无数据问题[#601](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/601)
+
+- 更新排行榜 [#602](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/602)
+
+- 新增`电台排行榜`,`新晋电台榜`,`热门电台榜`接口 [#604](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/604)
+
+### 3.22.4 | 2019.09.26
+
+- 修复私信历史记录分页参数问题,更新文档 [#599](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/599)
+
+### 3.22.3 | 2019.09.24
+
+- 手机号码检测: 添加国家码作为参数,方便检测国外手机号码 [#598](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/598)
+
+### 3.22.2 | 2019.09.18
+
+- 排行榜参数更新,更新文档[#592](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/592)
+
+### 3.22.1 | 2019.09.12
+
+- 支持回复评论[#589](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/589)
+
+### 3.22.0 | 2019.08.25
+
+- 支持 CORS 预检 [#564](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/564) [#578](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/578)
+
+### 3.21.1 | 2019.08.21
+
+- 修复推荐歌单和网易出品 mv 参数错误,更新文档 [#571](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/571) [#572](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/572)
+
+### 3.21.0 | 2019.08.20
+
+- 新增`歌单删除接口`[#570](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/570)
+
+### 3.20.0 | 2019.08.06
+
+- 新增`更新歌单描述`,`更新歌单名`,`更新歌单标签`,`默认搜索关键词` 接口,更新文档[#547](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/547)
+
+### 3.19.0 | 2019.07.24
+
+- 新增`检测手机号码是否已注册`和`初始化昵称`接口[#540](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/540)
+
+### 3.18.6 | 2019.07.15
+
+- 修复注册异常的问题 [#532](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/532)
+
+### 3.18.5 | 2019.07.14
+
+- 修复部分歌曲无法获得播放链接的问题 [#531](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/531)
+
+### 3.18.3 | 2019.07.04
+
+- 修复全部 mv`/mv/all` 接口分页参数错误的问题 [#524](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/524)
+
+### 3.18.2 | 2019.07.03
+
+- 修复听歌打卡接口 `/scrobble` 失效问题
+
+### 3.18.1 | 2019.06.30
+
+- 评论接口增加 `before` 参数以获取超过 5000 条评论数据 [#521](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/521)
+
+- 修复 `/msg/comments` 传入参数和文档描述不一致问题
+
+### 3.18.0 | 2019.06.29
+
+- 新增 `更换绑定手机接口`
+
+#### Breaking change
+
+1. 调整注册接口由 `/captch/register` 修改为 `/register/cellphone`
+
+2. 调整发送短信接口由 `/captch/sent` 修改为 `/captcha/sent`
+
+3. 调整短信验证接口由 `/captch/verify` 修改为 `/captcha/verify`
+
+### 3.17.0 | 2019.06.29
+
+- 新增 `专辑动态信息` `热搜列表(详细)` 接口,更新文档
+
+### 3.16.0 | 2019.06.27
+
+- 新增 `收藏/取消收藏专辑` 接口
+
+- 调整歌曲评论接口使用客户端版本接口
+
+### 3.15.0 | 2019.06.16
+
+- 新增`获取视频标签列表`,`网易出品`,`全部mv`接口, `最新 mv` 和 `mv 排行` 接口加入地区参数,更新文档
+
+### 3.14.0 | 2019.06.10
+
+- 获取用户粉丝列表接口修改请求参数,更新文档
+
+### 3.13.1 | 2019.06.09
+
+- 修复获取用户粉丝列表接口只能获取 1000 个的问题
+
+### 3.13.0 | 2019.05.19
+
+- 新增 eapi 算法 (via:[#491](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/491))
+
+- 新增 batch 批量请求接口 (via:[#491](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/491))
+
+- 用户动态增加分页参数
+
+### 3.12.0 | 2019.05.10
+
+- 增加`私信内容、我的数字专辑`接口
+
+### 3.11.0 | 2019.05.09
+
+- 增加`通知-私信、通知-评论、通知-@我、通知-通知、设置、云盘数据详情`接口
+
+### 3.10.2 | 2019.05.09
+
+- 增加`分享歌曲、歌单、mv、电台、电台节目到动态`接口
+
+### 3.10.1 | 2019.05.08
+
+- 增加转发动态接口
+
+- 增加删除动态接口
+
+### 3.9.0 | 2019.05.03
+
+- 新增 云盘歌曲删除, 热门话题, 电台 - 推荐类型, 电台 - 非热门类型, 电台 - 今日优选, 心动模式/智能播放等接口
+
+- 更新文档:banner 接口 增加 `type` 参数; 获取动态消息接口增加 `pagesize` 和 `lasttime` 参数; 电台 - 付费精选接口修改默认`limit`为 30
+
+### 3.8.1 | 2019.04.24
+
+- 修复歌词接口出错问题
+
+### 3.8.0 | 2019.04.14
+
+- 增加注册,发送验证码,校验验证码接口 via:[https://github.com/Binaryify/NeteaseCloudMusicApi/pull/460](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/460) @[KongValley](https://github.com/KongValley)
+
+### 3.7.1 | 2019.04.09
+
+- 修复登录 460 问题
+
+### 3.7.0 | 2019.03.20
+
+- 修复喜欢音乐接口参数判断问题
+
+- 增加歌单收藏者列表接口
+
+### 3.6.0 | 2019.03.15
+
+- 调整动态评论获取接口 url,使之和其他评论获取接口更统一
+
+### 3.5.0 | 2019.03.14
+
+- 增加获取动态评论接口
+
+- 支持给动态点赞
+
+- 支持给动态评论点赞
+
+- 支持给动态发送/删除评论
+
+### 3.4.0 | 2019.01.29
+
+- 增加已收藏专辑列表接口
+
+### 3.3.0 | 2019.01.27
+
+- 增加视频标签下的视频获取接口
+
+- 增加 pac 代理支持
+
+### 3.2.0 | 2019.01.19
+
+- 增加获取首页新碟上架数据以及更新听歌排行
+
+- 更新搜索建议接口
+
+### 3.1.0 | 2019.01.06
+
+- 修复评论接口返回 460 Cheating 的问题
+
+- 新增`已收藏MV`接口,更新文档
+
+### 3.0.9 | 2018.12.15
+
+- 修复关注异常的问题 #399
+
+### 3.0.8 | 2018.12.12
+
+- 更新文档 #386 #394
+
+- 优化电台节目接口
+
+### 3.0.7 | 2018.11.21
+
+- 修复歌单详情列表,排行榜,所有榜单失效的问题,更新文档 #380 #381
+
+### 3.0.4 | 2018.11.15
+
+- 修复 `/song/url` 接口无法返回多个音乐数据的问题
+
+### 3.0.3 | 2018.11.09
+
+- 修复取消喜欢歌曲失败问题 [#360](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/360)
+
+- 补充已喜欢音乐列表接口说明文档 [#370](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/370)
+
+- 默认关闭 debug 模式 [#365](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/365)
+
+- 更新 Dockerfile 文件 [#367](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/367)
+
+### 3.0.1 | 2018.10.21
+
+- 合并 PR([#351](https://github.com/Binaryify/NeteaseCloudMusicApi/pull/351))
+
+- 文档增加 `/top/song` 接口
+
+- `/banner` 换成 linux api,返回结构有所变动
+
+- `/check/music` 已知 bug 修复
+
+### 3.0.0 | 2018.10.14
+
+#### 整体
+
+- 完善文档,增加之前没写进文档的接口说明
+
+- 重写 createRequest 返回 Promise 对象
+
+- 模块化路由
+
+- 模块化, 剥离 res,req, 方便导出调用
+
+- 增加 cookie-parser
+
+##### 参数修改
+
+- `/song/detail` 增加多 id 支持
+
+- `/toplist/detail` 移除参数
+
+- `/resource/like` 增加参数 `type`
+
+- `/top/playlist/highquality` 增加分页参数 `before`
+
+##### 统一参数
+
+- `/artist/sub` 与 `artist/unsub` 合并, 用`query.t`
+
+- `/follow` 中 `query.type` 换成 `query.t`
+
+- `/comment` 中 `query.action` 换成 `query.t`
+
+##### URL 重命名
+
+- `/video` 改为 `video/url`
+
+- `/mv` 改为 `mv/detail`
+
+- `/music/url` 改为 `/song/url`
+
+##### 转发逻辑修改
+
+- `/toplist/artist` 换成 weapi
+
+- `/mv/url` 去除了 pipe
+
+##### BUG 修复
+
+- `/playlist/create`, `/playlist/update` 被判欺骗,增加 cookie
+
+##### 路由增删
+
+- 删除 `/recommend/dislike`
+
+- 增加 `/video/sub` (收藏视频), `/mv/sub` (收藏 MV)
+
+- 增加 `/video/detail` (视频详情)
+
+- 增加 `/related/allvideo` (相关视频)
+
+### 2.20.5 | 2018.09.29
+
+修复非法参数 403 #335, 修复代理错误 #334
+
+### 2.20.4 | 2018.09.27
+
+修复点赞失效的问题
+
+### 2.20.3 | 2018.09.26
+
+- 增加退出登录接口
+- 修正 /check/music 的检查逻辑
+- 优化 Cookies 设置
+- 重构单元测试
+
+ [by @nondanee](https://github.com/nondanee)
+
+- 增加 301 需要登录提示信息
+
+- 更新文档
+
+### 2.20.2 | 2018.09.22
+
+增加热门评论和视频评论接口,更新文档
+
+### 2.20.1 | 2018.09.17
+
+优化版本检查功能
+
+### 2.20.0 | 2018.09.06
+
+新增版本检查功能
+
+### 2.19.0 | 2018.08.29
+
+新增获取视频数据接口,新增发送/删除评论接口,修复登录状态接口问题,完善文档 #301,感谢 @izhenyuls
+
+### 2.17.0 | 2018.08.28
+
+新增登录状态查询接口 #302 ,完善文档,完善路由注册 #297
+
+### 2.16.0 | 2018.08.09
+
+- Fixed #288,#289,#290
+
+解决歌曲 URL 请求被判 Cheating,修复私信接收异常 #291
+
+### 2.15.0 | 2018.07.30
+
+新增相关歌单推荐和付费精选接口,增加歌手列表接口按首字母索引查找参数
+
+### 2.14.0 | 2018.07.03
+
+修复无法使用邮箱问题
+
+### 2.13.0 | 2018.06.05
+
+增加自动注册路由的功能,简化路由注册逻辑
+
+### 2.12.0 | 2018.05.27
+
+更新文档,优化歌单详情接口
+
+### 2.11.1 | 2018.05.24
+
+更新文档,优化`/dj/program`接口
+
+### 2.11.0 | 2018.05.21
+
+增加收藏歌手列表&订阅电台列表
+
+### 2.10.0 | 2018.05.17
+
+歌单操作调整为批量操作
+
+### 2.9.9 | 2018.05.16
+
+Bug 修复
+
+### 2.9.8 | 2018.05.10
+
+新增歌手分类列表,收藏/取消收藏歌手接口,新增更新用户信息,更新歌单接口
+
+### 2.9.6 | 2018.05.08
+
+新增发送私信相关接口,新增新建歌单,收藏/取消收藏歌单接口
+
+### 2.9.4 | 2018.05.04
+
+新增热搜接口,更新 banner 接口
+
+### 2.9.2 | 2018.02.28
+
+修复登录失败会崩溃的问题
+
+### 2.9.1 | 2018.01.26
+
+docker 构建文件的一些增强以及增加访问日志和调试输出
+
+### 2.8.9 | 2018.01.24
+
+修复歌单详情数据不完整的问题,更新依赖
+
+### 2.8.8 | 2018.01.22
+
+修复排行榜数据不完整的问题 , 优化部分代码 , 更新文档部分描述
+
+### 2.8.6 | 2018.01.16
+
+修复歌单详情接口数据不完整的问题
+
+### 2.8.5 | 2018.01.16
+
+修复评论点赞失败的问题
+
+### 2.8.4 | 2018.01.15
+
+优化 cookie 设置
+
+### 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.7.9 | 2017.12.11
+
+更新排行榜接口 , 新增云音乐 ACG 音乐榜 , 云音乐嘻哈榜
+
+### 2.7.7 | 2017.11.27
+
+更新 / 修复排行榜接口 , 更新 / 修复推荐歌单接口
+
+### 2.7.7 | 2017.11.27
+
+更新 / 修复排行榜接口 , 更新 / 修复推荐歌单接口
+
+### 2.7.2 | 2017.9.7
+
+修复搜索接口 offset 参数失效问题
+
+### 2.7.0 | 2017.8.21
+
+优化刷新登录代码
+
+### 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.6.2 | 2017.7.16
+
+修复垃圾桶接口
+
+### 2.6.1 | 2017.7.16
+
+修复红心接口
+
+### 2.6.0 | 2017.6.25
+
+修复签到接口
+
+### 2.5.9 | 2017.6.14
+
+增加启动说明页
+
+### 2.5.8 | 2017.6.1
+
+修复若干细节问题
+
+### 2.5.7 | 2017.5.22
+
+修复若干问题
+
+### 2.5.6 | 2017.5.14
+
+增加动态消息接口
+
+### 2.5.5 | 2017.5.10
+
+修复 mv 排行榜接口崩溃问题
+
+### 2.5.4 | 2017.5.5
+
+新增点赞接口 , 更新文档
+
+### 2.5.3 | 2017.5.2
+
+修复歌手单曲数据空白问题和文档获取歌手单曲 url 描述问题 , 更新文档
+
+### 2.5.0 | 2017.4.29
+
+增加 mv/ 专辑 / 歌单评论接口 , 增加云盘相关接口 , 增加获取用户动态 / 信息接口 ,
+增加关注 / 粉丝列表接口 , 增加收藏歌单接口 , 增加相似 mv/ 歌曲 / 用户接口 , 增加
+banner 接口 , 增加刷新登录接口 , 增加电台相关接口 , 补充评论接口 , 更新文档
+
+### 2.4.6 | 2017.4.21
+
+增加播放 mv 接口 , 更新文档
+
+### 2.4.5 | 2017.4.20
+
+增加歌手专辑 , 歌手单曲等接口 , 修复 /album 接口描述错误 , 更新文档
+
+### 2.4.0 | 2017.4.20
+
+增加歌单(网友精选碟 ), 新碟上架 , 热门歌手等接口 , 更新文档
+
+### 2.3.4 | 2017.4.20
+
+增加歌曲详情接口 , 更新文档
+
+### 2.3.0 | 2017.4.15
+
+增加排行榜接口 , 更新文档
+
+### 2.2.0 |2017.4.14
+
+增加私人 FM, 喜欢歌曲 , 垃圾桶 , 每日签到等接口 , 更新文档
+
+### 2.1.3 | 2017.4.6
+
+改善文档
+
+### 2.1.0 | 2017.4.6
+
+增加获取评论接口以及对应单元测试 , 增加更新日志
+
+### 2.0.0 | 2017.4.1
+
+版本升级到 2.0. 增加使用文档 , 完成项目重构 , 增加更完善的单元测试 , 升级 api 到
+v2+, 支持登录并获取用户信息和创建的歌单 , 可通过获取音乐 url 接口获取用户歌单里
+的的音乐 , 获取每日推荐歌单和每日推荐音乐
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..0c68482
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,11 @@
+FROM node:lts-alpine
+
+WORKDIR /app
+COPY . /app
+
+RUN npm config set registry "https://registry.npmmirror.com/" \
+ && npm install -g npm husky \
+ && npm install --production
+
+EXPOSE 3000
+CMD ["node", "app.js"]
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..638a26f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2022 Binaryify
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README.md b/README.md
index 38a79b1..97adf35 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,393 @@
-# musicApi
+# 网易云音乐 API
+网易云音乐 Node.js API service
+
+
+
+
+
+
+
+
+
+
+## 灵感来自
+
+[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)
+
+[greats3an/pyncm](https://github.com/greats3an/pyncm)
+
+
+## 环境要求
+
+需要 NodeJS 8.12+ 环境
+
+## 安装
+
+```shell
+$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
+$ cd NeteaseCloudMusicApi
+$ npm install
+```
+
+或者
+
+```shell
+$ git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git
+$ cd NeteaseCloudMusicApi
+$ 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
+```
+
+## Vercel 部署
+
+v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器
+
+### 操作方法
+
+1. fork 此项目
+2. 在 Vercel 官网点击 `New Project`
+3. 点击 `Import Git Repository` 并选择你 fork 的此项目并点击`import`
+4. 点击 `PERSONAL ACCOUNT` 的 `select`
+5. 直接点`Continue`
+6. `PROJECT NAME`自己填,`FRAMEWORK PRESET` 选 `Other` 然后直接点 `Deploy` 接着等部署完成即可
+
+## 可以在Node.js调用
+
+v3.31.0后支持Node.js调用,导入的方法为`module`内的文件名,返回内容包含`status`和`body`,`status`为状态码,`body`为请求返回内容,参考`module_example` 文件夹下的 `test.js`
+
+```js
+const { login_cellphone, user_cloud } = require('NeteaseCloudMusicApi')
+async function main() {
+ try {
+ const result = await login_cellphone({
+ phone: '手机号',
+ password: '密码'
+ })
+ console.log(result)
+ const result2 = await user_cloud({
+ cookie: result.body.cookie // 凭证
+ })
+ console.log(result2.body)
+
+ } catch (error) {
+ console.log(error)
+ }
+}
+main()
+```
+
+## 支持 TypeScript
+
+```ts
+// test.ts
+import { banner } from 'NeteaseCloudMusicApi'
+banner({ type:0 }).then(res=>{
+ console.log(res)
+})
+```
+
+
+## 使用文档
+
+[文档地址](https://binaryify.github.io/NeteaseCloudMusicApi)
+
+[文档地址2](https://neteasecloudmusicapi.vercel.app)
+
+
+
+
+## 功能特性
+
+1. 登录
+2. 刷新登录
+3. 发送验证码
+4. 校验验证码
+5. 注册(修改密码)
+6. 获取用户信息 , 歌单,收藏,mv, dj 数量
+7. 获取用户歌单
+8. 获取用户电台
+9. 获取用户关注列表
+10. 获取用户粉丝列表
+11. 获取用户动态
+12. 获取用户播放记录
+13. 获取精品歌单
+14. 获取歌单详情
+15. 搜索
+16. 搜索建议
+17. 获取歌词
+18. 歌曲评论
+19. 收藏单曲到歌单
+20. 专辑评论
+21. 歌单评论
+22. mv 评论
+23. 电台节目评论
+24. banner
+25. 获取歌曲详情
+26. 获取专辑内容
+27. 获取歌手单曲
+28. 获取歌手 mv
+29. 获取歌手专辑
+30. 获取歌手描述
+31. 获取相似歌手
+32. 获取相似歌单
+33. 相似 mv
+34. 获取相似音乐
+35. 获取最近 5 个听了这首歌的用户
+36. 获取每日推荐歌单
+37. 获取每日推荐歌曲
+38. 私人 FM
+39. 签到
+40. 喜欢音乐
+41. 垃圾桶
+42. 歌单 ( 网友精选碟 )
+43. 新碟上架
+44. 热门歌手
+45. 最新 mv
+46. 推荐 mv
+47. 推荐歌单
+48. 推荐新音乐
+49. 推荐电台
+50. 推荐节目
+51. 独家放送
+52. mv 排行
+53. 获取 mv 数据
+54. 播放 mv/视频
+55. 排行榜
+56. 歌手榜
+57. 云盘
+58. 电台 - 推荐
+59. 电台 - 分类
+60. 电台 - 分类推荐
+61. 电台 - 订阅
+62. 电台 - 详情
+63. 电台 - 节目
+64. 给评论点赞
+65. 获取动态
+66. 热搜列表(简略)
+67. 发送私信
+68. 发送私信歌单
+69. 新建歌单
+70. 收藏/取消收藏歌单
+71. 歌单分类
+72. 收藏的歌手列表
+73. 订阅的电台列表
+74. 相关歌单推荐
+75. 付费精选接口
+76. 音乐是否可用检查接口
+77. 登录状态
+78. 获取视频播放地址
+79. 发送/删除评论
+80. 热门评论
+81. 视频评论
+82. 退出登录
+83. 所有榜单
+84. 所有榜单内容摘要
+85. 收藏视频
+86. 收藏 MV
+87. 视频详情
+88. 相关视频
+89. 关注用户
+90. 新歌速递
+91. 喜欢音乐列表(无序)
+92. 收藏的 MV 列表
+93. 获取最新专辑
+94. 听歌打卡
+95. 获取视频标签/分类下的视频
+96. 已收藏专辑列表
+97. 获取动态评论
+98. 歌单收藏者列表
+99. 云盘歌曲删除
+100. 热门话题
+101. 电台 - 推荐类型
+102. 电台 - 非热门类型
+103. 电台 - 今日优选
+104. 心动模式/智能播放
+105. 转发动态
+106. 删除动态
+107. 分享歌曲、歌单、mv、电台、电台节目到动态
+108. 通知-私信
+109. 通知-评论
+110. 通知-@我
+111. 通知-通知
+112. 设置
+113. 云盘数据详情
+114. 私信内容
+115. 我的数字专辑
+116. batch批量请求接口
+117. 获取视频标签列表
+118. 全部mv
+119. 网易出品mv
+120. 收藏/取消收藏专辑
+121. 专辑动态信息
+122. 热搜列表(详细)
+123. 更换绑定手机
+124. 检测手机号码是否已注册
+125. 初始化昵称
+126. 更新歌单描述
+127. 更新歌单名
+128. 更新歌单标签
+129. 默认搜索关键词
+130. 删除歌单
+131. 电台banner
+132. 用户电台
+133. 热门电台
+134. 电台 - 节目详情
+135. 电台 - 节目榜
+136. 电台 - 新晋电台榜/热门电台榜
+137. 类别热门电台
+138. 云村热评
+139. 电台24小时节目榜
+140. 电台24小时主播榜
+141. 电台最热主播榜
+142. 电台主播新人榜
+143. 电台付费精品榜
+144. 歌手热门50首歌曲
+145. 购买数字专辑
+146. 获取 mv 点赞转发评论数数据
+147. 获取视频点赞转发评论数数据
+148. 调整歌单顺序
+149. 调整歌曲顺序
+150. 独家放送列表
+151. 获取推荐视频
+152. 获取视频分类列表
+153. 获取全部视频列表接口
+154. 获取历史日推可用日期列表
+155. 获取历史日推详细数据
+156. 国家编码列表
+157. 首页-发现
+158. 首页-发现-圆形图标入口列表
+159. 数字专辑-全部新碟
+160. 数字专辑-热门新碟
+161. 数字专辑&数字单曲-榜单
+162. 数字专辑-语种风格馆
+163. 数字专辑详情
+164. 更新头像
+165. 歌单封面上传
+166. 楼层评论
+167. 歌手全部歌曲
+168. 精品歌单标签列表
+169. 用户等级信息
+170. 电台个性推荐
+171. 用户绑定信息
+172. 用户绑定手机
+173. 新版评论
+174. 点赞过的视频
+175. 收藏视频到视频歌单
+176. 删除视频歌单里的视频
+177. 最近播放的视频
+178. 音乐日历
+179. 电台订阅者列表
+180. 云贝签到信息
+181. 云贝签到
+182. 云贝所有任务
+183. 云贝todo任务
+184. 云贝今日签到信息
+185. 云贝完成任务
+186. 云贝收入
+187. 云贝支出
+188. 云贝账户信息
+189. 账号信息
+190. 最近联系人
+191. 私信音乐
+192. 抱一抱评论
+193. 评论抱一抱列表
+194. 收藏的专栏
+195. 关注歌手新歌
+196. 关注歌手新MV
+197. 歌手详情
+198. 云盘上传
+199. 二维码登录
+200. 话题详情
+201. 话题详情热门动态
+202. 歌单详情动态
+203. 绑定手机
+204. 一起听状态
+205. 用户历史评论
+206. 云盘歌曲信息匹配纠正
+207. 云贝推歌
+208. 云贝推歌历史记录
+209. 已购单曲
+210. 获取mlog播放地址
+211. 将mlog id转为视频id
+212. vip成长值
+213. vip成长值获取记录
+214. vip任务
+215. 领取vip成长值
+216. 歌手粉丝
+217. 数字专辑详情
+218. 数字专辑销量
+219. 音乐人数据概况
+220. 音乐人播放趋势
+221. 音乐人任务
+222. 账号云豆数
+223. 领取云豆
+224. 获取 VIP 信息
+225. 音乐人签到
+226. 发送文本动态
+227. 获取客户端歌曲下载 url
+228. 获取歌单所有歌曲
+229. 乐签信息
+230. 最近播放-歌曲
+231. 最近播放-视频
+232. 最近播放-声音
+233. 最近播放-歌单
+234. 最近播放-专辑
+235. 最近播放-播客
+236. 签到进度
+237. 重复昵称检测
+238. 歌手粉丝数量
+239. 音乐人任务(新)
+240. 内部版本接口
+241. 歌单更新播放量
+
+## 更新日志
+
+[changelog](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/CHANGELOG.MD)
+
+## 单元测试
+
+```shell
+$ npm test
+```
+
+
+
+
+## SDK
+
+| 语言 | 作者 | 地址 | 类型 |
+| :--: | :-----------------------------------------: | :----------------------------------------------------------: | :----: |
+| Java | [JackuXL](https://github.com/JackuXL) | [https://github.com/JackuXL/NeteaseCloudMusicApi-SDK](https://github.com/JackuXL/NeteaseCloudMusicApi-SDK) | 第三方 |
+| Java | [1015770492](https://github.com/1015770492) | https://github.com/1015770492/yumbo-music-utils | 第三方 |
+
+## 贡献者
+
+
+
+
+## License
+
+[The MIT License (MIT)](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/LICENSE)
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..fa84d70
--- /dev/null
+++ b/app.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+const generateConfig = require('./generateConfig')
+async function start() {
+ // 如果需要手动修改anonymous_token,需要注释generateConfig调用
+ await generateConfig()
+ require('./server').serveNcmApi({
+ checkVersion: true,
+ })
+}
+start()
diff --git a/beforeTest.js b/beforeTest.js
new file mode 100644
index 0000000..fcfb0b6
--- /dev/null
+++ b/beforeTest.js
@@ -0,0 +1,2 @@
+const generateConfig = require('./generateConfig')
+generateConfig()
diff --git a/docs/.nojekyll b/docs/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..fcd5c95
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,3880 @@
+# 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
+
+## 功能特性
+
+1. 登录
+2. 刷新登录
+3. 发送验证码
+4. 校验验证码
+5. 注册(修改密码)
+6. 获取用户信息 , 歌单,收藏,mv, dj 数量
+7. 获取用户歌单
+8. 获取用户电台
+9. 获取用户关注列表
+10. 获取用户粉丝列表
+11. 获取用户动态
+12. 获取用户播放记录
+13. 获取精品歌单
+14. 获取歌单详情
+15. 搜索
+16. 搜索建议
+17. 获取歌词
+18. 歌曲评论
+19. 收藏单曲到歌单
+20. 专辑评论
+21. 歌单评论
+22. mv 评论
+23. 电台节目评论
+24. banner
+25. 获取歌曲详情
+26. 获取专辑内容
+27. 获取歌手单曲
+28. 获取歌手 mv
+29. 获取歌手专辑
+30. 获取歌手描述
+31. 获取相似歌手
+32. 获取相似歌单
+33. 相似 mv
+34. 获取相似音乐
+35. 获取最近 5 个听了这首歌的用户
+36. 获取每日推荐歌单
+37. 获取每日推荐歌曲
+38. 私人 FM
+39. 签到
+40. 喜欢音乐
+41. 垃圾桶
+42. 歌单 ( 网友精选碟 )
+43. 新碟上架
+44. 热门歌手
+45. 最新 mv
+46. 推荐 mv
+47. 推荐歌单
+48. 推荐新音乐
+49. 推荐电台
+50. 推荐节目
+51. 独家放送
+52. mv 排行
+53. 获取 mv 数据
+54. 播放 mv/视频
+55. 排行榜
+56. 歌手榜
+57. 云盘
+58. 电台 - 推荐
+59. 电台 - 分类
+60. 电台 - 分类推荐
+61. 电台 - 订阅
+62. 电台 - 详情
+63. 电台 - 节目
+64. 给评论点赞
+65. 获取动态
+66. 热搜列表(简略)
+67. 发送私信
+68. 发送私信歌单
+69. 新建歌单
+70. 收藏/取消收藏歌单
+71. 歌单分类
+72. 收藏的歌手列表
+73. 订阅的电台列表
+74. 相关歌单推荐
+75. 付费精选接口
+76. 音乐是否可用检查接口
+77. 登录状态
+78. 获取视频播放地址
+79. 发送/删除评论
+80. 热门评论
+81. 视频评论
+82. 退出登录
+83. 所有榜单
+84. 所有榜单内容摘要
+85. 收藏视频
+86. 收藏 MV
+87. 视频详情
+88. 相关视频
+89. 关注用户
+90. 新歌速递
+91. 喜欢音乐列表(无序)
+92. 收藏的 MV 列表
+93. 获取最新专辑
+94. 听歌打卡
+95. 获取视频标签/分类下的视频
+96. 已收藏专辑列表
+97. 获取动态评论
+98. 歌单收藏者列表
+99. 云盘歌曲删除
+100. 热门话题
+101. 电台 - 推荐类型
+102. 电台 - 非热门类型
+103. 电台 - 今日优选
+104. 心动模式/智能播放
+105. 转发动态
+106. 删除动态
+107. 分享歌曲、歌单、mv、电台、电台节目到动态
+108. 通知-私信
+109. 通知-评论
+110. 通知-@我
+111. 通知-通知
+112. 设置
+113. 云盘数据详情
+114. 私信内容
+115. 我的数字专辑
+116. batch 批量请求接口
+117. 获取视频标签列表
+118. 全部 mv
+119. 网易出品 mv
+120. 收藏/取消收藏专辑
+121. 专辑动态信息
+122. 热搜列表(详细)
+123. 更换绑定手机
+124. 检测手机号码是否已注册
+125. 初始化昵称
+126. 更新歌单描述
+127. 更新歌单名
+128. 更新歌单标签
+129. 默认搜索关键词
+130. 删除歌单
+131. 电台 banner
+132. 用户电台
+133. 热门电台
+134. 电台 - 节目详情
+135. 电台 - 节目榜
+136. 电台 - 新晋电台榜/热门电台榜
+137. 类别热门电台
+138. 云村热评(官方下架,暂不能用)
+139. 电台 24 小时节目榜
+140. 电台 24 小时主播榜
+141. 电台最热主播榜
+142. 电台主播新人榜
+143. 电台付费精品榜
+144. 歌手热门 50 首歌曲
+145. 购买数字专辑
+146. 获取 mv 点赞转发评论数数据
+147. 获取视频点赞转发评论数数据
+148. 调整歌单顺序
+149. 调整歌曲顺序
+150. 独家放送列表
+151. 获取推荐视频
+152. 获取视频分类列表
+153. 获取全部视频列表接口
+154. 获取历史日推可用日期列表
+155. 获取历史日推详细数据
+156. 国家编码列表
+157. 首页-发现
+158. 首页-发现-圆形图标入口列表
+159. 全部新碟
+160. 数字专辑-新碟上架
+161. 数字专辑&数字单曲-榜单
+162. 数字专辑-语种风格馆
+163. 数字专辑详情
+164. 更新头像
+165. 歌单封面上传
+166. 楼层评论
+167. 歌手全部歌曲
+168. 精品歌单标签列表
+169. 用户等级信息
+170. 电台个性推荐
+171. 用户绑定信息
+172. 用户绑定手机
+173. 新版评论
+174. 点赞过的视频
+175. 收藏视频到视频歌单
+176. 删除视频歌单里的视频
+177. 最近播放的视频
+178. 音乐日历
+179. 电台订阅者列表
+180. 云贝签到信息
+181. 云贝签到
+182. 云贝所有任务
+183. 云贝 todo 任务
+184. 云贝今日签到信息
+185. 云贝完成任务
+186. 云贝收入
+187. 云贝支出
+188. 云贝账户信息
+189. 账号信息
+190. 最近联系人
+191. 私信音乐
+192. 抱一抱评论
+193. 评论抱一抱列表
+194. 收藏的专栏
+195. 关注歌手新歌
+196. 关注歌手新 MV
+197. 歌手详情
+198. 云盘上传
+199. 二维码登录
+200. 话题详情
+201. 话题详情热门动态
+202. 歌单详情动态
+203. 绑定手机
+204. 一起听状态
+205. 用户历史评论
+206. 云盘歌曲信息匹配纠正
+207. 云贝推歌
+208. 云贝推歌历史记录
+209. 已购单曲
+210. 获取 mlog 播放地址
+211. 将 mlog id 转为视频 id
+212. vip 成长值
+213. vip 成长值获取记录
+214. vip 任务
+215. 领取 vip 成长值
+216. 歌手粉丝
+217. 数字专辑详情
+218. 数字专辑销量
+219. 音乐人数据概况
+220. 音乐人播放趋势
+221. 音乐人任务
+222. 账号云豆数
+223. 领取云豆
+224. 获取 VIP 信息
+225. 音乐人签到
+226. 获取客户端歌曲下载 url
+227. 获取歌单所有歌曲
+228. 乐签信息
+229. 获取歌手视频
+230. 最近播放-歌曲
+231. 最近播放-视频
+232. 最近播放-声音
+233. 最近播放-歌单
+234. 最近播放-专辑
+235. 最近播放-播客
+236. 签到进度
+237. 重复昵称检测
+238. 歌手粉丝数量
+239. 音乐人任务(新)
+240. 内部版本接口
+241. 歌单更新播放量
+242. 黑胶时光机
+
+## 安装
+
+```shell
+$ git clone git@github.com:Binaryify/NeteaseCloudMusicApi.git
+$ cd NeteaseCloudMusicApi
+$ 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
+```
+
+服务器启动默认 host 为 localhost,如果需要更改, 可使用以下命令 : Mac/Linux
+
+```shell
+$ HOST=127.0.0.1 node app.js
+```
+
+windows 下使用 git-bash 或者 cmder 等终端执行以下命令 :
+
+```shell
+$ set HOST=127.0.0.1 && node app.js
+```
+
+### npx 方式运行
+支持 npx 方式运行,会自动安装依赖和运行
+```
+npx NeteaseCloudMusicApi
+```
+如果需要更新,可使用 `npx NeteaseCloudMusicApi@版本号` 方式运行
+
+或者运行
+```
+npx NeteaseCloudMusicApi@latest
+
+```
+此命令每次执行都会使用最新版
+
+## Vercel 部署
+
+v4.0.8 加入了 Vercel 配置文件,可以直接在 Vercel 下部署了,不需要自己的服务器(访问 Vercel 部署的接口,需要额外加一个 realIP 参数,如 `/song/url?id=191254&realIP=116.25.146.177`)
+
+### 操作方法
+
+1. fork 此项目
+2. 在 Vercel 官网点击 `New Project`
+3. 点击 `Import Git Repository` 并选择你 fork 的此项目并点击`import`
+4. 点击 `PERSONAL ACCOUNT` 的 `select`
+5. 直接点`Continue`
+6. `PROJECT NAME`自己填,`FRAMEWORK PRESET` 选 `Other` 然后直接点 `Deploy` 接着等部署完成即可
+
+## 可以使用代理
+
+在 query 参数中加上 proxy=your-proxy 即可让这一次的请求使用 proxy
+
+```javascript
+// 例子
+const url = `http://localhost:3000/song/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}
+```
+
+v3.3.0 后支持使用 PAC 代理,如 `?proxy=http://192.168.0.1/proxy.pac`
+
+## 可以在 Node.js 调用
+
+v3.31.0 后支持 Node.js 调用,导入的方法为`module`内的文件名,返回内容包含`status`和`body`,`status`为状态码,`body`为请求返回内容,参考`module_example` 文件夹下的 `test.js`
+
+```js
+const { login_cellphone, user_cloud } = require('NeteaseCloudMusicApi')
+async function main() {
+ try {
+ const result = await login_cellphone({
+ phone: '手机号',
+ password: '密码',
+ })
+ console.log(result)
+ const result2 = await user_cloud({
+ cookie: result.body.cookie, // 凭证
+ })
+ console.log(result2.body)
+ } catch (error) {
+ console.log(error)
+ }
+}
+main()
+```
+
+## 支持 TypeScript
+
+```ts
+// test.ts
+import { banner } from 'NeteaseCloudMusicApi'
+banner({ type: 0 }).then((res) => {
+ console.log(res)
+})
+```
+
+## 更新到 v3.0 说明
+
+!>2018.10.14 更新到 3.0.0,使用了模块化机制,因为部分接口参数和 url 做了调整,如还不想升级到 3.0.0,请查看 [v2 的文档](http://binaryify.github.io/NeteaseCloudMusicApi/#/v2), [更新日志](https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/CHANGELOG.MD), [2.0+下载地址](https://github.com/Binaryify/NeteaseCloudMusicApi/releases/tag/v2.20.5), 同时 2.0+ 将不再维护
+
+## Docker 容器运行
+
+> 注意: 在 docker 中运行的时候, 由于使用了 request 来发请求, 所以会检查几个 proxy 相关的环境变量(如下所列), 这些环境变量 会影响到 request 的代理, 详情请参考[request 的文档](https://github.com/request/request#proxies), 如果这些环境变量 指向的代理不可用, 那么就会造成错误, 所以在使用 docker 的时候一定要注意这些环境变量. 不过, 要是你在 query 中加上了 proxy 参数, 那么环境变量会被覆盖, 就会用你通过 proxy 参数提供的代理了.
+
+request 相关的环境变量
+
+1. http_proxy
+2. https_proxy
+3. HTTP_PROXY
+4. HTTPS_PROXY
+5. no_proxy
+6. NO_PROXY
+
+```shell
+docker pull binaryify/netease_cloud_music_api
+
+docker run -d -p 3000:3000 --name netease_cloud_music_api binaryify/netease_cloud_music_api
+
+
+// 或者
+docker run -d -p 3000:3000 binaryify/netease_cloud_music_api
+
+// 去掉或者设置相关的环境变量
+
+docker run -d -p 3000:3000 --name netease_cloud_music_api -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
+
+// 或者
+docker run -d -p 3000:3000 -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= binaryify/netease_cloud_music_api
+```
+
+> 以下是自行 build docker 镜像方式
+
+```
+$ git clone https://github.com/Binaryify/NeteaseCloudMusicApi && cd NeteaseCloudMusicApi
+
+$ sudo docker build . -t netease-music-api
+
+$ sudo docker run -d -p 3000:3000 netease-music-api
+```
+
+## 接口文档
+
+### 调用前须知
+
+!> 本项目不提供线上 demo,请不要轻易信任使用他人提供的公开服务,以免发生安全问题,泄露自己的账号和密码
+
+!> 为使用方便,降低门槛, 文档示例接口直接使用了 GET 请求,本项目同时支持 GET/POST 请按实际需求使用 (POST 请求 url 必须添加时间戳,使每次请求 url 不一样,不然请求会被缓存)
+
+!> 由于接口做了缓存处理 ( 缓存 2 分钟,不缓存数据极容易引起网易服务器高频 ip 错误 , 可在 app.js 设置 , 可能会导致登录后获取不到 cookie), **相同的 url** 会在两分钟内只向网易服务器发一次请求 , 如果遇到不需要缓
+存结果的接口 , 可在请求 url 后面加一个时间戳参数使 url 不同 , 例子 :
+`/simi/playlist?id=347230×tamp=1503019930000` (之所以加入缓存机制是因为项目早期没有缓存机制,很多 issues 都是报 IP 高频,请按自己需求改造缓存中间件(app.js),源码不复杂)
+
+!> 不要频繁调登录接口,不然可能会被风控,登录状态还存在就不要重复调登录接口
+
+!> 如果是跨域请求 , 请在所有请求带上 `xhrFields: { withCredentials: true }` (axios 为 `withCredentials: true`, Fetch API 为 `fetch(url, { credentials: 'include' })`), 或直接手动传入 cookie (参见 `登录`), 否则
+可能会因为没带上 cookie 导致 301, 具体例子可看 `public/test.html`, 访问`http://localhost:3000/test.html`(默认端口的话) 例子使用 jQuery 和 axios
+
+!> 301 错误基本都是没登录就调用了需要登录的接口,如果登录了还是提示 301, 基本都是缓存把数据缓存起来了,解决方法是加时间戳或者等待 2 分钟或者重启服务重新登录后再调用接口,可自行改造缓存方法
+
+!> 部分接口如登录接口不能调用太频繁 , 否则可能会触发 503 错误或者 ip 高频错误 ,若需频繁调用 , 需要准备 IP 代理池 (更新:已加入缓存机制,但仍需注意).
+
+!> 本项目仅供学习使用,请尊重版权,请勿利用此项目从事商业行为或进行破坏版权行为
+
+!> 文档可能会有缓存 , 如果文档版本和 github 上的版本不一致,请清除缓存再查看
+
+!> 由于网易限制,此项目在国外服务器或部分国内云服务上使用会受到限制,如 `460 cheating异常`,如需解决 , 可使用`realIP`参数,传进国内IP解决,如:`?realIP=116.25.146.177`
+即可解决
+
+!> 图片加上 `?param=宽y高` 可控制图片尺寸,如 `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=200y200`, `http://p4.music.126.net/JzNK4a5PjjPIXAgVlqEc5Q==/109951164154280311.jpg?param=50y50`
+
+!> 分页接口返回字段里有`more`,more 为 true 则为有下一页
+
+### 登录
+
+说明 : 登录有三个接口,建议使用`encodeURIComponent`对密码编码或者使用`POST`请求,避免某些特殊字符无法解析,如`#`(`#`在 url 中会被识别为 hash,而不是 query)
+
+不要频繁调登录接口,不然可能会被风控,登录状态还存在就不要重复调登录接口
+
+因网易增加了网易云盾验证,密码登录暂时不要使用,尽量使用短信验证码登录和二维码登录,否则调用某些接口会触发需要验证的错误
+
+#### 1. 手机登录
+
+**必选参数 :**
+`phone`: 手机号码
+
+`password`: 密码
+
+**可选参数 :**
+`countrycode`: 国家码,用于国外手机号登录,例如美国传入:`1`
+
+`md5_password`: md5 加密后的密码,传入后 `password` 参数将失效
+
+`captcha`: 验证码,使用 [`/captcha/sent`](#发送验证码)接口传入手机号获取验证码,调用此接口传入验证码,可使用验证码登录,传入后 `password` 参数将失效
+
+**接口地址 :** `/login/cellphone`
+
+**调用例子 :** `/login/cellphone?phone=xxx&password=yyy` `/login/cellphone?phone=xxx&md5_password=yyy` `/login/cellphone?phone=xxx&captcha=1234`
+
+#### 2. 邮箱登录
+
+**必选参数 :**
+
+`email`: 163 网易邮箱
+
+`password`: 密码
+
+**可选参数 :**
+
+`md5_password`: md5 加密后的密码,传入后 `password` 将失效
+
+**接口地址 :** `/login`
+
+**调用例子 :** `/login?email=xxx@163.com&password=yyy`
+
+完成登录后 , 会在浏览器保存一个 Cookies 用作登录凭证 , 大部分 API 都需要用到这个
+Cookies,非跨域情况请求会自动带上 Cookies,跨域情况参考`调用前须知`
+
+v3.30.0 后支持手动传入 cookie,登录接口返回内容新增 `cookie` 字段,保存到本地后,get 请求带上`?cookie=xxx` (先使用 `encodeURIComponent()` 编码 cookie 值) 或者 post 请求 body 带上 `cookie` 即可,如:`/user/cloud?cookie=xxx` 或者
+
+```
+{
+ ...,
+ cookie:"xxx"
+}
+```
+
+#### 3. 二维码登录
+
+说明: 二维码登录涉及到 3 个接口,调用务必带上时间戳,防止缓存
+
+##### 1. 二维码 key 生成接口
+
+说明: 调用此接口可生成一个 key
+
+**接口地址 :** `/login/qr/key`
+
+##### 2. 二维码生成接口
+
+说明: 调用此接口传入上一个接口生成的 key 可生成二维码图片的 base64 和二维码信息,可使用 base64 展示图片,或者使用二维码信息内容自行使用第三方二维码生成库渲染二维码
+
+必选参数: `key`,由第一个接口生成
+
+可选参数: `qrimg` 传入后会额外返回二维码图片 base64 编码
+
+**接口地址 :** `/login/qr/create`
+
+**调用例子 :** `/login/qr/create?key=xxx`
+
+##### 3. 二维码检测扫码状态接口
+
+说明: 轮询此接口可获取二维码扫码状态,800 为二维码过期,801 为等待扫码,802 为待确认,803 为授权登录成功(803 状态码下会返回 cookies)
+
+必选参数: `key`,由第一个接口生成
+
+**接口地址 :** `/login/qr/check`
+
+**调用例子 :** `/login/qr/check?key=xxx`
+
+调用可参考项目文件例子`/public/qrlogin.html` (访问地址:http://localhost:3000/qrlogin.html)
+
+
+#### 3. 游客登录
+说明 : 直接调用此接口, 可获取游客cookie,如果遇到其他接口未登录状态报400状态码需要验证的错误,可使用此接口获取游客cookie避免报错
+
+**接口地址 :** `/register/anonimous`
+
+
+#### 注意
+
+调用登录接口的速度比调用其他接口慢 , 因为登录过程调用了加密算法
+
+### 刷新登录
+
+说明 : 调用此接口 , 可刷新登录状态,返回内容包含新的cookie(不支持刷新二维码登录的cookie)
+
+**调用例子 :** `/login/refresh`
+
+### 发送验证码
+
+说明 : 调用此接口 ,传入手机号码, 可发送验证码
+
+**必选参数 :** `phone`: 手机号码
+
+**可选参数 :**
+`ctcode`: 国家区号,默认 86 即中国
+
+**接口地址 :** `/captcha/sent`
+
+**调用例子 :** `/captcha/sent?phone=13xxx`
+
+### 验证验证码
+
+说明 : 调用此接口 ,传入手机号码和验证码, 可校验验证码是否正确
+
+**必选参数 :** `phone`: 手机号码
+
+`captcha`: 验证码
+
+**可选参数 :**
+
+`ctcode`: 国家区号,默认 86 即中国
+
+**接口地址 :** `/captcha/verify`
+
+**调用例子 :** `/captcha/verify?phone=13xxx&captcha=1597`
+
+### 注册(修改密码)
+
+说明 : 调用此接口 ,传入手机号码和验证码,密码,昵称, 可注册网易云音乐账号(同时可修改密码)
+
+**必选参数 :**
+
+`captcha`: 验证码
+
+`phone` : 手机号码
+
+`password`: 密码
+
+`nickname`: 昵称
+
+**可选参数 :**
+
+`countrycode`: 国家码,用于国外手机号,例如美国传入:`1` ,默认 86 即中国
+
+**接口地址 :** `/register/cellphone`
+
+**调用例子 :** `/register/cellphone?phone=13xxx&password=xxxxx&captcha=1234&nickname=binary1345`
+
+### 检测手机号码是否已注册
+
+说明 : 调用此接口 ,可检测手机号码是否已注册
+**必选参数 :**
+`phone` : 手机号码
+
+**可选参数 :**
+`countrycode`: 国家码,用于国外手机号,例如美国传入:`1` ,默认 86 即中国
+
+**接口地址 :** `/cellphone/existence/check`
+
+**调用例子 :** `/cellphone/existence/check?phone=13xxx`
+
+### 初始化昵称
+
+说明 : 刚注册的账号(需登录),调用此接口 ,可初始化昵称
+**必选参数 :**
+`nickname` : 昵称
+
+**接口地址 :** `/activate/init/profile`
+
+**调用例子 :** `/activate/init/profile?nickname=testUser2019`
+
+### 重复昵称检测
+
+说明 : 调用此接口 ,可检测昵称是否重复,并提供备用昵称
+**必选参数 :**
+`nickname` : 昵称
+
+**接口地址 :** `/nickname/check`
+
+**调用例子 :** `/nickname/check?nickname=binaryify`
+
+
+### 更换绑定手机
+
+说明 : 调用此接口 ,可更换绑定手机(流程:先发送验证码到原手机号码,再发送验证码到新手机号码然后再调用此接口)
+
+**必选参数 :**
+`oldcaptcha`: 原手机验证码
+
+`captcha`: 新手机验证码
+
+`phone` : 手机号码
+
+`ctcode` : 国家区号,默认 86 即中国
+
+**接口地址 :** `/rebind`
+
+**调用例子 :** `/rebind?phone=xxx&oldcaptcha=1234&captcha=5678`
+
+### 退出登录
+
+说明 : 调用此接口 , 可退出登录
+
+**调用例子 :** `/logout`
+
+### 登录状态
+
+说明 : 调用此接口,可获取登录状态
+
+**接口地址 :** `/login/status`
+
+### 获取用户详情
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户详情
+
+**必选参数 :** `uid` : 用户 id
+
+**接口地址 :** `/user/detail`
+
+**调用例子 :** `/user/detail?uid=32953014`
+
+### 获取账号信息
+
+说明 : 登录后调用此接口 ,可获取用户账号信息
+
+**接口地址 :** `/user/account`
+
+**调用例子 :** `/user/account`
+
+### 获取用户信息 , 歌单,收藏,mv, dj 数量
+
+说明 : 登录后调用此接口 , 可以获取用户信息
+
+**接口地址 :** `/user/subcount`
+
+**调用例子 :** `/user/subcount`
+
+### 获取用户等级信息
+
+说明 : 登录后调用此接口 , 可以获取用户等级信息,包含当前登录天数,听歌次数,下一等级需要的登录天数和听歌次数,当前等级进度,对应 https://music.163.com/#/user/level
+
+**接口地址 :** `/user/level`
+
+**调用例子 :** `/user/level`
+
+### 获取用户绑定信息
+
+说明 : 登录后调用此接口 , 可以获取用户绑定信息
+
+**必选参数 :** `uid` : 用户 id
+
+**接口地址 :** `/user/binding`
+
+**调用例子 :** `/user/binding?uid=32953014`
+
+### 用户绑定手机
+
+说明 : 登录后调用此接口 , 可以更换绑定手机
+
+**必选参数 :**
+
+`phone` : 手机号码
+
+`oldcaptcha`: 原手机号码的验证码
+
+`captcha`:新手机号码的验证码
+
+**可选参数 :**
+
+`countrycode`: 国家地区代码,默认 86
+
+**接口地址 :** `/user/replacephone`
+
+**调用例子 :** `/user/replacephone?phone=xxx&captcha=1234&oldcaptcha=2345`
+
+### 更新用户信息
+
+说明 : 登录后调用此接口 , 传入相关信息,可以更新用户信息
+
+**必选参数 :**
+
+```
+gender: 性别 0:保密 1:男性 2:女性
+
+birthday: 出生日期,时间戳 unix timestamp
+
+nickname: 用户昵称
+
+province: 省份id
+
+city: 城市id
+
+signature:用户签名
+```
+
+**接口地址 :** `/user/update`
+
+**调用例子 :** `/user/update?gender=0&signature=测试签名&city=440300&nickname=binary&birthday=1525918298004&province=440000`
+
+### 更新头像
+
+说明 : 登录后调用此接口,使用`'Content-Type': 'multipart/form-data'`上传图片 formData(name 为'imgFile'),可更新头像(参考: https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/public/avatar_update.html ),支持命令行调用,参考module_example目录下`avatar_upload.js`
+
+**可选参数 :**
+
+`imgSize` : 图片尺寸,默认为 300
+
+`imgX` : 水平裁剪偏移,方形图片可不传,默认为 0
+`imgY` : 垂直裁剪偏移,方形图片可不传,默认为 0
+
+**接口地址 :** `/avatar/upload`
+
+**调用例子 :** `/avatar/upload?imgSize=200`
+
+### 国家编码列表
+
+说明 : 调用此接口,可获取国家编码列表
+
+**接口地址 :** `/countries/code/list`
+
+### 获取用户歌单
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户歌单
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/user/playlist`
+
+**调用例子 :** `/user/playlist?uid=32953014`
+
+返回数据如下图 :
+
+
+### 更新歌单
+
+说明 : 登录后调用此接口,可以更新用户歌单
+
+**必选参数 :**
+
+```
+id:歌单id
+
+name:歌单名字
+
+desc:歌单描述
+
+tags:歌单tag ,多个用 `;` 隔开,只能用官方规定标签
+```
+
+**接口地址 :** `/playlist/update`
+
+**调用例子 :** `/playlist/update?id=24381616&name=新歌单&desc=描述&tags=欧美`
+
+### 更新歌单描述
+
+说明 : 登录后调用此接口,可以单独更新用户歌单描述
+
+**必选参数 :**
+
+```
+id:歌单id
+
+desc:歌单描述
+
+```
+
+**接口地址 :** `/playlist/desc/update`
+
+**调用例子 :** `/playlist/desc/update?id=24381616&desc=描述`
+
+### 更新歌单名
+
+说明 : 登录后调用此接口,可以单独更新用户歌单名
+
+**必选参数 :**
+
+```
+id: 歌单id
+
+name: 歌单名
+
+```
+
+**接口地址 :** `/playlist/name/update`
+
+**调用例子 :** `/playlist/name/update?id=24381616&name=歌单名`
+
+### 更新歌单标签
+
+说明 : 登录后调用此接口,可以单独更新用户歌单标签
+
+**必选参数 :**
+
+```
+id: 歌单id
+
+tags: 歌单标签
+
+```
+
+**接口地址 :** `/playlist/tags/update`
+
+**调用例子 :** `/playlist/tags/update?id=24381616&tags=学习`
+
+### 歌单封面上传
+
+说明 : 登录后调用此接口,使用`'Content-Type': 'multipart/form-data'`上传图片 formData(name 为'imgFile'),可更新歌单封面(参考:https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/public/playlist_cover_update.html)
+
+**必选参数 :**
+`id`: 歌单 id 3143833470
+
+**可选参数 :**
+
+`imgSize` : 图片尺寸,默认为 300
+
+`imgX` : 水平裁剪偏移,方形图片可不传,默认为 0
+`imgY` : 垂直裁剪偏移,方形图片可不传,默认为 0
+
+**接口地址 :** `/playlist/cover/update`
+
+**调用例子 :** `/playlist/cover/update?id=3143833470&imgSize=200`
+
+### 调整歌单顺序
+
+说明 : 登录后调用此接口,可以根据歌单 id 顺序调整歌单顺序
+
+**必选参数 :**
+
+`ids`: 歌单 id 列表
+
+**接口地址 :** `/playlist/order/update`
+
+**调用例子 :** `/playlist/order/update?ids=[111,222]`
+
+### 调整歌曲顺序
+
+说明 : 登录后调用此接口,可以根据歌曲 id 顺序调整歌曲顺序
+
+**必选参数 :**
+`pid`: 歌单 id
+
+`ids`: 歌曲 id 列表
+
+**接口地址 :** `/song/order/update`
+
+**调用例子 :** `/song/order/update?pid=2039116066&ids=[5268328,1219871]`
+
+### 获取用户历史评论
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户历史评论
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 10
+
+`time`: 上一条数据的 time,第一页不需要传,默认为 0
+
+**接口地址 :** `/user/comment/history`
+
+**调用例子 :** `/user/comment/history?uid=32953014` `/user/comment/history?uid=32953014&limit=1&time=1616217577564` (需要换成自己的用户 id)
+
+### 获取用户电台
+
+说明 : 登录后调用此接口 , 传入用户 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`
+
+### 获取用户粉丝列表
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户粉丝列表
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :**
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 ,如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/user/followeds`
+
+**调用例子 :** `/user/followeds?uid=32953014` `/user/followeds?uid=416608258&limit=1` `/user/followeds?uid=416608258&limit=1&offset=1`
+
+### 获取用户动态
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户动态
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :** `limit` : 返回数量 , 默认为 30
+
+`lasttime` : 返回数据的 `lasttime` ,默认-1,传入上一次返回结果的 lasttime,将会返回下一页的数据
+
+**接口地址 :** `/user/event`
+
+**调用例子 :** `/user/event?uid=32953014` `/user/event?uid=32953014&limit=1&lasttime=1558011138743`
+
+返回结果的`type`参数对应:
+
+```
+18 分享单曲
+19 分享专辑
+17、28 分享电台节目
+22 转发
+39 发布视频
+35、13 分享歌单
+24 分享专栏文章
+41、21 分享视频
+```
+
+### 转发用户动态
+
+说明 : 登录后调用此接口 ,可以转发用户动态
+
+**必选参数 :** `uid` : 用户 id
+
+`evId` : 动态 id
+
+`forwards` : 转发的评论
+
+**接口地址 :** `/event/forward`
+
+**调用例子 :** `/event/forward?evId=6712917601&uid=32953014&forwards=测试内容`
+
+### 删除用户动态
+
+说明 : 登录后调用此接口 ,可以删除用户动态
+
+**必选参数 :** `evId` : 动态 id
+
+**接口地址 :** `/event/del`
+
+**调用例子 :** `/event/del?evId=6712917601`
+
+### 分享文本、歌曲、歌单、mv、电台、电台节目到动态
+
+说明 : 登录后调用此接口 ,可以分享文本、歌曲、歌单、mv、电台、电台节目到动态
+
+**必选参数 :** `id` : 资源 id (歌曲,歌单,mv,电台,电台节目对应 id)
+
+**可选参数 :** `type`: 资源类型,默认歌曲 song,可传 `song`,`playlist`,`mv`,`djradio`,`djprogram`
+
+`msg`: 内容,140 字限制,支持 emoji,@用户名(`/user/follows`接口获取的用户名,用户名后和内容应该有空格),图片暂不支持
+
+**接口地址 :** `/share/resource`
+
+**调用例子 :** `/share/resource?id=1297494209&msg=测试` `/share/resource?type=djradio&id=336355127` `/share/resource?type=djprogram&id=2061034798` `/share/resource?type=djprogram&id=2061034798&msg=测试@binaryify 测试` `/share/resource?type=noresource&msg=测试`
+
+### 获取动态评论
+
+说明 : 登录后调用此接口 , 可以获取动态下评论
+
+**必选参数 :** `threadId` : 动态 id,可通过 `/event`,`/user/event` 接口获取
+
+**接口地址 :** `/comment/event`
+
+**调用例子 :** `/comment/event?threadId=A_EV_2_6559519868_32953014`
+
+### 关注/取消关注用户
+
+说明 : 登录后调用此接口 , 传入用户 id, 和操作 t,可关注/取消关注用户
+
+**必选参数 :**
+
+`id` : 用户 id
+
+`t` : `1`为关注,其他为取消关注
+
+**接口地址 :** `/follow`
+
+**调用例子 :** `/follow?id=32953014&t=1`
+
+### 获取用户播放记录
+
+说明 : 登录后调用此接口 , 传入用户 id, 可获取用户播放记录
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :** `type` : type=1 时只返回 weekData, type=0 时返回 allData
+
+**接口地址 :** `/user/record`
+
+**调用例子 :** `/user/record?uid=32953014&type=1`
+
+### 获取热门话题
+
+说明 : 调用此接口 , 可获取热门话题
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/hot/topic`
+
+**调用例子 :** `/hot/topic?limit=30&offset=30`
+
+### 获取话题详情
+
+说明 : 调用此接口 , 可获取话题详情
+
+**接口地址 :** `/topic/detail`
+
+**调用例子 :** `/topic/detail?actid=111551188`
+
+### 获取话题详情热门动态
+
+说明 : 调用此接口 , 可获取话题详情热门动态
+
+**接口地址 :** `/topic/detail/event/hot`
+
+**调用例子 :** `/topic/detail/event/hot?actid=111551188`
+
+### 云村热评(官方下架,暂不能用)
+
+说明 : 登录后调用此接口 , 可获取云村热评
+
+**接口地址 :** `/comment/hotwall/list`
+
+**调用例子 :** `/comment/hotwall/list`
+
+### 心动模式/智能播放
+
+说明 : 登录后调用此接口 , 可获取心动模式/智能播放列表
+**必选参数 :** `id` : 歌曲 id
+
+`pid` : 歌单 id
+
+**可选参数 :**
+`sid` : 要开始播放的歌曲的 id
+
+**接口地址 :** `/playmode/intelligence/list`
+
+**调用例子 :** `/playmode/intelligence/list?id=33894312&pid=24381616` , `/playmode/intelligence/list?id=33894312&pid=24381616&sid=36871368`
+
+### 获取动态消息
+
+说明 : 调用此接口 , 可获取各种动态 , 对应网页版网易云,朋友界面里的各种动态消息
+,如分享的视频,音乐,照片等!
+
+**必选参数 :**
+`pagesize` : 每页数据,默认 20
+
+`lasttime` : 返回数据的 `lasttime` ,默认-1,传入上一次返回结果的 lasttime,将会返回下一页的数据
+
+**接口地址 :** `/event`
+
+**调用例子 :** `/event?pagesize=30&lasttime=1556740526369`
+
+### 歌手分类列表
+
+说明 : 调用此接口,可获取歌手分类列表
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+`initial`: 按首字母索引查找参数,如 `/artist/list?type=1&area=96&initial=b` 返回内容将以 name 字段开头为 b 或者拼音开头为 b 为顺序排列, 热门传-1,#传 0
+
+`type` 取值:
+
+```
+-1:全部
+1:男歌手
+2:女歌手
+3:乐队
+```
+
+`area` 取值:
+
+```
+-1:全部
+7华语
+96欧美
+8:日本
+16韩国
+0:其他
+```
+
+**接口地址 :** `/artist/list`
+
+**调用例子 :** `/artist/list?type=1&area=96&initial=b` `/artist/list?type=2&area=2&initial=b`
+
+### 收藏/取消收藏歌手
+
+说明 : 调用此接口,可收藏歌手
+
+**必选参数 :**
+
+`id` : 歌手 id
+
+`t`:操作,1 为收藏,其他为取消收藏
+
+**接口地址 :** `/artist/sub`
+
+**调用例子 :** `/artist/sub?id=6452&t=1`
+
+### 歌手热门 50 首歌曲
+
+说明 : 调用此接口,可获取歌手热门 50 首歌曲
+
+**必选参数 :**
+
+`id` : 歌手 id
+
+**接口地址 :** `/artist/top/song`
+
+**调用例子 :** `/artist/top/song?id=6452`
+
+### 歌手全部歌曲
+
+说明 : 调用此接口,可获取歌手全部歌曲
+**必选参数 :**
+
+`id` : 歌手 id
+
+**可选参数 :**
+
+`order` : `hot` ,`time` 按照热门或者时间排序
+
+`limit`: 取出歌单数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*50, 其中 50 为 limit 的值
+
+**接口地址 :** `/artist/songs`
+
+**调用例子 :** `/artist/songs?id=6452`
+
+### 收藏的歌手列表
+
+说明 : 调用此接口,可获取收藏的歌手列表
+
+**接口地址 :** `/artist/sublist`
+
+**调用例子 :** `/artist/sublist`
+
+### 收藏的专栏
+
+说明 : 调用此接口,可获取收藏的专栏
+
+**可选参数 :**
+
+`limit`: 取出歌单数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*50, 其中 50 为 limit 的值
+
+**接口地址 :** `/topic/sublist`
+
+**调用例子 :** `/topic/sublist?limit=2&offset=1`
+
+### 收藏视频
+
+说明 : 调用此接口,可收藏视频
+
+**必选参数 :**
+
+`id` : 视频 id
+
+`t` : 1 为收藏,其他为取消收藏
+
+**接口地址 :** `/video/sub`
+
+**调用例子 :** `/video/sub`
+
+### 收藏/取消收藏 MV
+
+说明 : 调用此接口,可收藏/取消收藏 MV
+
+**必选参数 :**
+
+`mvid` : MV id
+
+`t` : 1 为收藏,其他为取消收藏
+
+**接口地址 :** `/mv/sub`
+
+**调用例子 :** `/mv/sub`
+
+### 收藏的 MV 列表
+
+说明 : 调用此接口,可获取收藏的 MV 列表
+
+**接口地址 :** `/mv/sublist`
+
+**调用例子 :** `/mv/sublist`
+
+### 歌单分类
+
+说明 : 调用此接口,可获取歌单分类,包含 category 信息
+
+**接口地址 :** `/playlist/catlist`
+
+**调用例子 :** `/playlist/catlist`
+
+### 热门歌单分类
+
+说明 : 调用此接口,可获取歌单分类,包含 category 信息
+
+**接口地址 :** `/playlist/hot`
+
+**调用例子 :** `/playlist/hot`
+
+### 歌单 ( 网友精选碟 )
+
+说明 : 调用此接口 , 可获取网友精选碟歌单
+
+**可选参数 :** `order`: 可选值为 'new' 和 'hot', 分别对应最新和最热 , 默认为
+'hot'
+
+`cat`: tag, 比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为
+"全部",可从歌单分类接口获取(/playlist/catlist)
+
+`limit`: 取出歌单数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*50, 其中 50 为 limit 的值
+
+**接口地址 :** `/top/playlist`
+
+**调用例子 :** `/top/playlist?limit=10&order=new`
+
+### 精品歌单标签列表
+
+说明 : 调用此接口 , 可获取精品歌单标签列表
+
+**接口地址 :** `/playlist/highquality/tags`
+
+**调用例子 :** `/playlist/highquality/tags`
+
+### 获取精品歌单
+
+说明 : 调用此接口 , 可获取精品歌单
+
+**可选参数 :** `cat`: tag, 比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为
+"全部",可从精品歌单标签列表接口获取(`/playlist/highquality/tags`)
+
+`limit`: 取出歌单数量 , 默认为 50
+
+`before`: 分页参数,取上一页最后一个歌单的 `updateTime` 获取下一页数据
+
+**接口地址 :** `/top/playlist/highquality`
+
+**调用例子 :** `/top/playlist/highquality?before=1503639064232&limit=3`
+
+### 相关歌单推荐
+
+说明 : 调用此接口,传入歌单 id 可获取相关歌单(对应页面 [https://music.163.com/#/playlist?id=1](https://music.163.com/#/playlist?id=1))
+
+**必选参数 :** `id` : 歌单 id
+
+**接口地址 :** `/related/playlist`
+
+**调用例子 :** `/related/playlist?id=1`
+
+### 获取歌单详情
+
+说明 : 歌单能看到歌单名字, 但看不到具体歌单内容 , 调用此接口 , 传入歌单 id, 可
+以获取对应歌单内的所有的音乐(未登录状态只能获取不完整的歌单,登录后是完整的),但是返回的 trackIds 是完整的,tracks 则是不完整的,可拿全部 trackIds 请求一次 `song/detail` 接口获取所有歌曲的详情 ([https://github.com/Binaryify/NeteaseCloudMusicApi/issues/452](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/452))
+
+**必选参数 :** `id` : 歌单 id
+
+**可选参数 :** `s` : 歌单最近的 s 个收藏者,默认为 8
+
+**接口地址 :** `/playlist/detail`
+
+**调用例子 :** `/playlist/detail?id=24381616`
+
+### 获取歌单所有歌曲
+
+说明 : 由于网易云接口限制,歌单详情只会提供 10 首歌,通过调用此接口,传入对应的歌单`id`,即可获得对应的所有歌曲
+
+**必选参数 :** `id` : 歌单 id
+
+**可选参数 :** `limit` : 限制获取歌曲的数量,默认值为当前歌单的歌曲数量
+
+**可选参数 :** `offset` : 默认值为0
+
+**接口地址 :** `/playlist/track/all`
+
+**调用例子 :** `/playlist/track/all?id=24381616&limit=10&offset=1`
+
+> 注:关于`offset`,你可以这样理解,假设你当前的歌单有100首歌
+>
+> 你传入limit=10&offset=0等价于limit=10,你会得到第1-10首歌曲
+>
+> 你传入limit=10&offset=1,你会得到第2-11首歌曲
+>
+> 如果你设置limit=10&offset=2,你就会得到第3-12首歌曲
+
+
+### 歌单详情动态
+
+说明 : 调用后可获取歌单详情动态部分,如评论数,是否收藏,播放数
+
+**必选参数 :** `id` : 歌单 id
+
+**接口地址 :** `/playlist/detail/dynamic`
+
+**调用例子 :** `/playlist/detail/dynamic?id=24381616`
+
+
+### 歌单更新播放量
+
+说明 : 调用后可更新歌单播放量
+
+**必选参数 :** `id` : 歌单 id
+
+**接口地址 :** `/playlist/update/playcount`
+
+**调用例子 :** `/playlist/update/playcount?id=24381616`
+
+
+
+
+### 获取音乐 url
+
+说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口, 传入的音乐 id( 可多个 , 用逗号隔开 ), 可以获取对应的音乐的 url,未登录状态或者非会员返回试听片段(返回字段包含被截取的正常歌曲的开始时间和结束时间)
+
+> 注 : 部分用户反馈获取的 url 会 403,[hwaphon](https://github.com/hwaphon)找到的解决方案是当获取到音乐的 id 后,将 https://music.163.com/song/media/outer/url?id=id.mp3 以 src 赋予 Audio 即可播放
+
+**必选参数 :** `id` : 音乐 id
+
+**可选参数 :** `br`: 码率,默认设置了 999000 即最大码率,如果要 320k 则可设置为 320000,其他类推
+
+**接口地址 :** `/song/url`
+
+**调用例子 :** `/song/url?id=33894312` `/song/url?id=405998841,33894312`
+
+### 音乐是否可用
+
+说明: 调用此接口,传入歌曲 id, 可获取音乐是否可用,返回 `{ success: true, message: 'ok' }` 或者 `{ success: false, message: '亲爱的,暂无版权' }`
+
+**必选参数 :** `id` : 歌曲 id
+
+**可选参数** : `br`: 码率,默认设置了 999000 即最大码率,如果要 320k 则可设置为 320000,其他类推
+
+**接口地址 :** `/check/music`
+
+**调用例子 :** `/check/music?id=33894312`
+
+### 搜索
+
+说明 : 调用此接口 , 传入搜索关键词可以搜索该音乐 / 专辑 / 歌手 / 歌单 / 用户 ,
+关键词可以多个 , 以空格隔开 , 如 " 周杰伦 搁浅 "( 不需要登录 ), 可通过 `/song/url` 接口传入歌曲 id 获取具体的播放链接
+
+**必选参数 :** `keywords` : 关键词
+
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`type`: 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲, 10: 专辑, 100: 歌手, 1000:
+歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频, 1018:综合, 2000:声音(搜索声音返回字段格式会不一样)
+
+**接口地址 :** `/search` 或者 `/cloudsearch`(更全)
+
+**调用例子 :** `/search?keywords=海阔天空` `/cloudsearch?keywords=海阔天空`
+
+### 默认搜索关键词
+
+说明 : 调用此接口 , 可获取默认搜索关键词
+
+**接口地址 :** `/search/default`
+
+### 热搜列表(简略)
+
+说明 : 调用此接口,可获取热门搜索列表
+
+**接口地址 :** `/search/hot`
+
+**调用例子 :** `/search/hot`
+
+### 热搜列表(详细)
+
+说明 : 调用此接口,可获取热门搜索列表
+
+**接口地址 :** `/search/hot/detail`
+
+**调用例子 :** `/search/hot/detail`
+
+### 搜索建议
+
+说明 : 调用此接口 , 传入搜索关键词可获得搜索建议 , 搜索结果同时包含单曲 , 歌手 , 歌单信息
+
+**必选参数 :** `keywords` : 关键词
+
+**可选参数 :** `type` : 如果传 'mobile' 则返回移动端数据
+
+**接口地址 :** `/search/suggest`
+
+**调用例子 :** `/search/suggest?keywords=海阔天空` `/search/suggest?keywords=海阔天空&type=mobile`
+
+### 搜索多重匹配
+
+说明 : 调用此接口 , 传入搜索关键词可获得搜索结果
+
+**必选参数 :** `keywords` : 关键词
+
+**接口地址 :** `/search/multimatch`
+
+**调用例子 :** `/search/multimatch?keywords=海阔天空`
+
+### 新建歌单
+
+说明 : 调用此接口 , 传入歌单名字可新建歌单
+
+**必选参数 :** `name` : 歌单名
+
+**可选参数 :**
+
+`privacy` : 是否设置为隐私歌单,默认否,传'10'则设置成隐私歌单
+
+`type` : 歌单类型,默认'NORMAL',传 'VIDEO'则为视频歌单,传 'SHARED'则为共享歌单
+
+**接口地址 :** `/playlist/create`
+
+**调用例子 :** `/playlist/create?name=测试歌单`,`/playlist/create?name=test&type=VIDEO`
+
+### 删除歌单
+
+说明 : 调用此接口 , 传入歌单 id 可删除歌单
+
+**必选参数 :** `id` : 歌单 id,可多个,用逗号隔开
+
+**接口地址 :** `/playlist/delete`
+
+**调用例子 :** `/playlist/delete?id=2947311456` , `/playlist/delete?id=5013464397,5013427772`
+
+### 收藏/取消收藏歌单
+
+说明 : 调用此接口 , 传入类型和歌单 id 可收藏歌单或者取消收藏歌单
+
+**必选参数 :**
+
+`t` : 类型,1:收藏,2:取消收藏
+`id` : 歌单 id
+
+**接口地址 :** `/playlist/subscribe`
+
+**调用例子 :** `/playlist/subscribe?t=1&id=106697785` `/playlist/subscribe?t=2&id=106697785`
+
+### 歌单收藏者
+
+说明 : 调用此接口 , 传入歌单 id 可获取歌单的所有收藏者
+**必选参数 :**
+
+`id` : 歌单 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/playlist/subscribers`
+
+**调用例子 :** `/playlist/subscribers?id=544215255&limit=30`
+
+### 对歌单添加或删除歌曲
+
+说明 : 调用此接口 , 可以添加歌曲到歌单或者从歌单删除某首歌曲 ( 需要登录 )
+
+**必选参数 :**
+
+`op`: 从歌单增加单曲为 add, 删除为 del
+
+`pid`: 歌单 id
+`tracks`: 歌曲 id,可多个,用逗号隔开
+
+**接口地址 :** `/playlist/tracks`
+
+**调用例子 :** `/playlist/tracks?op=add&pid=24381616&tracks=347231` ( 对应把歌曲添加到 ' 我 ' 的歌单 , 测试的时候请把这里的 pid 换成你自己的, id 和 tracks 不对可能会报 502 错误)
+
+### 收藏视频到视频歌单
+
+说明 : 调用此接口 , 可收藏视频到视频歌单 ( 需要登录 )
+
+**必选参数 :**
+
+`pid` : 歌单 id
+
+`ids` : 视频 id,支持多个,用`,`隔开
+
+**接口地址 :** `/playlist/track/add`
+
+**调用例子 :** `/playlist/track/add?pid=5271999357&ids=186041`
+
+### 删除视频歌单里的视频
+
+说明 : 调用此接口 , 可删除视频歌单里的视频 ( 需要登录 )
+**必选参数 :**
+
+`pid` : 歌单 id
+
+`ids` : 视频 id,支持多个,用`,`隔开
+
+**接口地址 :** `/playlist/track/delete`
+
+**调用例子 :** `/playlist/track/delete?pid=5271999357&ids=186041`
+
+### 最近播放的视频
+
+说明 : 调用此接口 , 可获取最近播放的视频 ( 需要登录 )
+
+**接口地址 :** `/playlist/video/recent`
+
+**调用例子 :** `/playlist/video/recent`
+
+### 获取歌词
+
+说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 )
+
+**必选参数 :** `id`: 音乐 id
+
+**接口地址 :** `/lyric`
+
+**调用例子 :** `/lyric?id=33894312`
+
+返回数据如下图 :
+
+
+### 新歌速递
+
+说明 : 调用此接口 , 可获取新歌速递
+
+**必选参数 :**
+
+`type`: 地区类型 id,对应以下:
+
+```
+全部:0
+
+华语:7
+
+欧美:96
+
+日本:8
+
+韩国:16
+```
+
+**接口地址 :** `/top/song`
+
+**调用例子 :** `/top/song?type=96`
+
+### 首页-发现
+
+说明 : 调用此接口 , 可获取 APP 首页信息
+
+**接口地址 :** `/homepage/block/page`
+
+**可选参数 :** `refresh`: 是否刷新数据,默认为 false
+
+`cursor`: 上一条数据返回的 cursor
+
+### 首页-发现-圆形图标入口列表
+
+说明 : 调用此接口 , 可获取 APP 首页圆形图标入口列表
+
+**接口地址 :** `/homepage/dragon/ball`
+
+### 歌曲评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该音乐的所有评论 ( 不需要登录 )
+
+**必选参数 :** `id`: 音乐 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/music`
+
+**调用例子 :** `/comment/music?id=186016&limit=1` 对应晴天评论
+
+返回数据如下图 :
+
+
+### 楼层评论
+
+说明 : 调用此接口 , 传入资源 parentCommentId 和资源类型 type 和资源 id 参数, 可获得该资源的歌曲楼层评论
+
+**必选参数 :**
+`parentCommentId`: 楼层评论 id
+
+`id` : 资源 id
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+
+1: mv
+
+2: 歌单
+
+3: 专辑
+
+4: 电台
+
+5: 视频
+```
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`time`: 分页参数,取上一页最后一项的 `time` 获取下一页数据
+
+**接口地址 :** `/comment/floor`
+
+**调用例子 :** `/comment/floor?parentCommentId=1438569889&id=29764564&type=0`
+
+### 专辑评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该专辑的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: 专辑 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/album`
+
+**调用例子 :** `/comment/album?id=32311`
+
+### 歌单评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该歌单的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: 歌单 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/playlist`
+
+**调用例子 :** `/comment/playlist?id=705123491`
+
+### mv 评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 mv 的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: mv id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/mv`
+
+**调用例子 :** `/comment/mv?id=5436712`
+
+### 电台节目评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 电台节目 的所有评论 (
+不需要登录 )
+
+**必选参数 :** `id`: 电台节目的 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/dj`
+
+**调用例子 :** `/comment/dj?id=794062371`
+
+### 视频评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 视频 的所有评论 (
+不需要登录 )
+
+**必选参数 :** `id`: 视频的 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/video`
+
+**调用例子 :** `/comment/video?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 热门评论
+
+说明 : 调用此接口 , 传入 type, 资源 id 可获得对应资源热门评论 ( 不需要登录 )
+
+**必选参数 :**
+
+`id` : 资源 id
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+
+1: mv
+
+2: 歌单
+
+3: 专辑
+
+4: 电台
+
+5: 视频
+```
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+`before`: 分页参数,取上一页最后一项的 `time` 获取下一页数据(获取超过 5000 条评论的时候需要用到)
+
+**接口地址 :** `/comment/hot`
+
+**调用例子 :** `/comment/hot?id=186016&type=0`
+
+### 新版评论接口
+
+说明 : 调用此接口 , 传入资源类型和资源 id,以及排序方式,可获取对应资源的评论
+
+**必选参数 :**
+`id` : 资源 id, 如歌曲 id,mv id
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+
+1: mv
+
+2: 歌单
+
+3: 专辑
+
+4: 电台
+
+5: 视频
+
+6: 动态
+```
+
+**可选参数 :**
+`pageNo`:分页参数,第 N 页,默认为 1
+
+`pageSize`:分页参数,每页多少条数据,默认 20
+
+`sortType`: 排序方式, 1:按推荐排序, 2:按热度排序, 3:按时间排序
+
+`cursor`: 当`sortType`为 3 时且页数不是第一页时需传入,值为上一条数据的 time
+
+**接口地址 :** `/comment/new`
+
+**调用例子 :** `/comment/new?type=0&id=1407551413&sortType=3`, `/comment/new?type=0&id=1407551413&sortType=3&cursor=1602072870260&pageSize=20&pageNo=2`
+
+### 给评论点赞
+
+说明 : 调用此接口 , 传入 type, 资源 id, 和评论 id cid 和 是否点赞参数 t 即可给对
+应评论点赞 ( 需要登录 )
+
+**必选参数 :** `id` : 资源 id, 如歌曲 id,mv id
+
+`cid` : 评论 id
+
+`t` : 是否点赞 , 1 为点赞 ,0 为取消点赞
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+
+1: mv
+
+2: 歌单
+
+3: 专辑
+
+4: 电台
+
+5: 视频
+
+6: 动态
+```
+
+**接口地址 :** `/comment/like`
+
+**调用例子 :** `/comment/like?id=29178366&cid=12840183&t=1&type=0` 对应给 [https://music.163.com/#/song?id=29178366](https://music.163.com/#/song?id=29178366) 最热门的评论点赞
+
+注意: 动态点赞不需要传入 id 参数,需要传入动态的 `threadId` 参数,如:`/comment/like?type=6&cid=1419532712&threadId=A_EV_2_6559519868_32953014&t=0`, `threadId` 可通过 `/event`,`/user/event` 接口获取
+
+### 抱一抱评论
+
+说明 : 调用此接口,可抱一抱评论
+
+**必选参数 :**
+
+`uid`: 用户 id
+
+`cid`: 评论 id
+
+`sid`: 资源 id
+
+**接口地址 :** `/hug/comment`
+
+**调用例子 :** `/hug/comment?uid=285516405&cid=1167145843&sid=863481066`
+
+### 评论抱一抱列表
+
+说明 : 调用此接口,可获取评论抱一抱列表
+
+**必选参数 :**
+
+`uid`: 用户 id
+
+`cid`: 评论 id
+
+`sid`: 资源 id
+
+**可选参数 :**
+
+`page`: 页数
+
+`cursor`: 上一页返回的 cursor,默认-1,第一页不需要传
+
+`idCursor`: 上一页返回的 idCursor,默认-1,第一页不需要传
+
+`pageSize` : 每页页数,默认 100
+
+**接口地址 :** `/comment/hug/list`
+
+**调用例子 :** `/comment/hug/list?uid=285516405&cid=1167145843&sid=863481066&pageSize=2&page=1`
+
+### 发送/删除评论
+
+说明 : 调用此接口,可发送评论或者删除评论
+
+**接口地址 :** `/comment`
+
+1. 发送评论
+
+ **必选参数**
+
+ `t`:1 发送, 2 回复
+
+ `type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
+
+ ```
+ 0: 歌曲
+
+ 1: mv
+
+ 2: 歌单
+
+ 3: 专辑
+
+ 4: 电台
+
+ 5: 视频
+
+ 6: 动态
+ ```
+
+ `id`:对应资源 id
+
+ `content` :要发送的内容
+
+ `commentId` :回复的评论 id (回复评论时必填)
+
+ **调用例子** : `/comment?t=1&type=1&id=5436712&content=test` (往广岛之恋 mv 发送评论: test)
+
+ 注意:如给动态发送评论,则不需要传 id,需要传动态的 `threadId`,如:`/comment?t=1&type=6&threadId=A_EV_2_6559519868_32953014&content=test`
+
+2. 删除评论
+
+ **必选参数**
+
+ `t`:0 删除
+
+ `type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
+
+
+ ```
+ 0: 歌曲
+
+ 1: mv
+
+ 2: 歌单
+
+ 3: 专辑
+
+ 4: 电台
+
+
+ 5: 视频
+
+ 6: 动态
+
+ ```
+
+ `id`:对应资源 id
+ `content` :内容 id,可通过 `/comment/mv` 等接口获取
+
+ **调用例子** : `/comment?t=0&type=1&id=5436712&commentId=1535550516319` (在广岛之恋 mv 删除评论)
+
+ 注意:如给动态删除评论,则不需要传 id,需要传动态的 `threadId`,如:`/comment?t=0&type=6&threadId=A_EV_2_6559519868_32953014&commentId=1419516382`
+
+### banner
+
+说明 : 调用此接口 , 可获取 banner( 轮播图 ) 数据
+
+**可选参数 :**
+
+`type`:资源类型,对应以下类型,默认为 0 即 PC
+
+```
+0: pc
+
+1: android
+
+2: iphone
+
+3: ipad
+```
+
+**接口地址 :** `/banner`
+
+**调用例子 :** `/banner`, `/banner?type=2`
+
+### 资源点赞( MV,电台,视频)
+
+说明 : 调用此接口 , 可对 MV,电台,视频点赞
+
+**必选参数 :**
+
+`type`:资源类型,对应以下类型
+
+
+```
+1: mv
+
+4: 电台
+
+5: 视频
+
+6: 动态
+```
+
+
+`t`: 操作,1 为点赞,其他为取消点赞
+
+`id`: 资源 id
+
+
+**接口地址 :** `/resource/like`
+
+**调用例子 :** `/resource/like?t=1&type=1&id=5436712`
+
+注意:如给动态点赞,不需要传入 id,需要传入 `threadId`,可通过 `event`,`/user/event` 接口获取,如:
+`/resource/like?t=1&type=6&threadId=A_EV_2_6559519868_32953014`
+
+
+### 获取点赞过的视频
+
+说明 : 调用此接口, 可获取获取点赞过的视频
+
+**接口地址 :** `/playlist/mylike`
+
+**调用例子 :** `/playlist/mylike`
+
+### 获取歌曲详情
+
+说明 : 调用此接口 , 传入音乐 id(支持多个 id, 用 `,` 隔开), 可获得歌曲详情(dt为歌曲时长)
+
+**必选参数 :** `ids`: 音乐 id, 如 `ids=347230`
+
+**接口地址 :** `/song/detail`
+
+**调用例子 :** `/song/detail?ids=347230`,`/song/detail?ids=347230,347231`
+
+返回字段说明(感谢 [@tuxzz](https://github.com/Binaryify/NeteaseCloudMusicApi/issues/1121#issuecomment-774438040) 整理):
+```
+name: String, 歌曲标题
+id: u64, 歌曲ID
+pst: 0,功能未知
+t: enum,
+ 0: 一般类型
+ 1: 通过云盘上传的音乐,网易云不存在公开对应
+ 如果没有权限将不可用,除了歌曲长度以外大部分信息都为null。
+ 可以通过 `/api/v1/playlist/manipulate/tracks` 接口添加到播放列表。
+ 如果添加到“我喜欢的音乐”,则仅自己可见,除了长度以外各种信息均为未知,且无法播放。
+ 如果添加到一般播放列表,虽然返回code 200,但是并没有效果。
+ 网页端打开会看到404画面。
+ 属于这种歌曲的例子: https://music.163.com/song/1345937107
+ 2: 通过云盘上传的音乐,网易云存在公开对应
+ 如果没有权限则只能看到信息,但无法直接获取到文件。
+ 可以通过 `/api/v1/playlist/manipulate/tracks` 接口添加到播放列表。
+ 如果添加到“我喜欢的音乐”,则仅自己可见,且无法播放。
+ 如果添加到一般播放列表,则自己会看到显示“云盘文件”,且云盘会多出其对应的网易云公开歌曲。其他人看到的是其对应的网易云公开歌曲。
+ 网页端打开会看到404画面。
+ 属于这种歌曲的例子: https://music.163.com/song/435005015
+ar: Vec, 歌手列表
+alia: Vec,
+ 别名列表,第一个别名会被显示作副标题
+ 例子: https://music.163.com/song/536623501
+pop: 小数,常取[0.0, 100.0]中离散的几个数值, 表示歌曲热度
+st: 0: 功能未知
+rt: Option, None、空白字串、或者类似`600902000007902089`的字符串,功能未知
+fee: enum,
+ 0: 免费或无版权
+ 1: VIP 歌曲
+ 4: 购买专辑
+ 8: 非会员可免费播放低音质,会员可播放高音质及下载
+ fee 为 1 或 8 的歌曲均可单独购买 2 元单曲
+v: u64, 常为[1, ?]任意数字, 功能未知
+crbt: Option, None或字符串表示的十六进制,功能未知
+cf: Option, 空白字串或者None,功能未知
+al: Album, 专辑,如果是DJ节目(dj_type != 0)或者无专辑信息(single == 1),则专辑id为0
+dt: u64, 歌曲时长
+h: Option, 高质量文件信息
+m: Option, 中质量文件信息
+l: Option, 低质量文件信息
+a: Option>, 常为None, 功能未知
+cd: Option, None或如"04", "1/2", "3", "null"的字符串,表示歌曲属于专辑中第几张CD,对应音频文件的Tag
+no: u32, 表示歌曲属于CD中第几曲,0表示没有这个字段,对应音频文件的Tag
+rtUrl: Option, 常为None, 功能未知
+rtUrls: Vec, 常为空列表, 功能未知
+dj_id: u64,
+ 0: 不是DJ节目
+ 其他:是DJ节目,表示DJ ID
+copyright: u32, 0, 1, 2: 功能未知
+s_id: u64, 对于t == 2的歌曲,表示匹配到的公开版本歌曲ID
+mark: u64, 功能未知
+originCoverType: enum
+ 0: 未知
+ 1: 原曲
+ 2: 翻唱
+originSongSimpleData: Option, 对于翻唱曲,可选提供原曲简单格式的信息
+single: enum,
+ 0: 有专辑信息或者是DJ节目
+ 1: 未知专辑
+noCopyrightRcmd: Option, None表示可以播,非空表示无版权
+mv: u64, 非零表示有MV ID
+rtype: 常为0,功能未知
+rurl: Option, 常为None,功能未知
+mst: u32, 偶尔为0, 常为9,功能未知
+cp: u64, 功能未知
+publish_time: i64, 毫秒为单位的Unix时间戳
+pc: 云盘歌曲信息,如果不存在该字段,则为非云盘歌曲
+```
+
+### 获取专辑内容
+
+说明 : 调用此接口 , 传入专辑 id, 可获得专辑内容
+
+**必选参数 :** `id`: 专辑 id
+
+**接口地址 :** `/album`
+
+**调用例子 :** `/album?id=32311`
+
+### 专辑动态信息
+
+说明 : 调用此接口 , 传入专辑 id, 可获得专辑动态信息,如是否收藏,收藏数,评论数,分享数
+
+**必选参数 :** `id`: 专辑 id
+
+**接口地址 :** `/album/detail/dynamic`
+
+**调用例子 :** `/album/detail/dynamic?id=32311`
+
+### 收藏/取消收藏专辑
+
+说明 : 调用此接口,可收藏/取消收藏专辑
+
+**必选参数 :**
+
+`id` : 专辑 id
+
+`t` : 1 为收藏,其他为取消收藏
+
+**接口地址 :** `/album/sub`
+
+**调用例子 :** `/album/sub?t=1` `/album/sub?t=0`
+
+### 获取已收藏专辑列表
+
+说明 : 调用此接口 , 可获得已收藏专辑列表
+
+**可选参数 :**
+`limit`: 取出数量 , 默认为 25
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*25, 其中 25 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/album/sublist`
+
+**调用例子 :** `/album/sublist` ( 周杰伦 )
+
+### 获取歌手单曲
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手部分信息和热门歌曲
+
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
+
+**接口地址 :** `/artists`
+
+**调用例子 :** `/artists?id=6452`
+
+返回数据如下图 :
+
+
+### 获取歌手 mv
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手 mv 信息 , 具体 mv 播放地址可调
+用`/mv`传入此接口获得的 mvid 来拿到 , 如 :
+`/artist/mv?id=6452`,`/mv?mvid=5461064`
+
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
+
+**接口地址 :** `/artist/mv`
+
+**调用例子 :** `/artist/mv?id=6452`
+
+### 获取歌手专辑
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手专辑内容
+
+**必选参数 :** `id`: 歌手 id
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/artist/album`
+
+**调用例子 :** `/artist/album?id=6452&limit=5` ( 周杰伦 )
+
+返回数据如下图 :
+
+
+### 获取歌手描述
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手描述
+
+**必选参数 :** `id`: 歌手 id
+
+**接口地址 :** `/artist/desc`
+
+**调用例子 :** `/artist/desc?id=6452` ( 周杰伦 )
+
+### 获取歌手详情
+
+说明 : 调用此接口 , 传入歌手 id, 可获得获取歌手详情
+
+**必选参数 :** `id`: 歌手 id
+
+**接口地址 :** `/artist/detail`
+
+**调用例子 :** `/artist/detail?id=11972054` (Billie Eilish)
+
+### 获取相似歌手
+
+说明 : 调用此接口 , 传入歌手 id, 可获得相似歌手
+
+**必选参数 :** `id`: 歌手 id
+
+**接口地址 :** `/simi/artist`
+
+**调用例子 :** `/simi/artist?id=6452` ( 对应和周杰伦相似歌手 )
+
+### 获取相似歌单
+
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌单
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/playlist`
+
+**调用例子 :** `/simi/playlist?id=347230` ( 对应 ' 光辉岁月 ' 相似歌单 )
+
+### 相似 mv
+
+说明 : 调用此接口 , 传入 `mvid` 可获取相似 mv
+
+**必选参数 :** `mvid`: mv id
+
+**接口地址 :** `/simi/mv`
+
+**调用例子 :** `/simi/mv?mvid=5436712`
+
+### 获取相似音乐
+
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌曲
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/song`
+
+**调用例子 :** `/simi/song?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
+
+### 获取最近 5 个听了这首歌的用户
+
+说明 : 调用此接口 , 传入歌曲 id, 最近 5 个听了这首歌的用户
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/user`
+
+**调用例子 :** `/simi/user?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
+
+### 获取每日推荐歌单
+
+说明 : 调用此接口 , 可获得每日推荐歌单 ( 需要登录 )
+
+**接口地址 :** `/recommend/resource`
+
+**调用例子 :** `/recommend/resource`
+
+返回数据如下图 :
+
+
+### 获取每日推荐歌曲
+
+说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 )
+
+**接口地址 :** `/recommend/songs`
+
+**调用例子 :** `/recommend/songs`
+
+返回数据如下图 :
+
+
+### 获取历史日推可用日期列表
+
+说明 : 调用此接口 , 可获得历史日推可用日期列表
+
+**接口地址 :** `/history/recommend/songs`
+
+**调用例子 :** `/history/recommend/songs`
+
+### 获取历史日推详情数据
+
+说明 : 调用此接口 ,传入当日日期, 可获得当日历史日推数据
+
+**必选参数 :** `date`: 日期,通过历史日推可用日期列表接口获取,不能任意日期
+
+**接口地址 :** `/history/recommend/songs/detail`
+
+**调用例子 :** `/history/recommend/songs/detail?date=2020-06-21`
+
+### 私人 FM
+
+说明 : 私人 FM( 需要登录 )
+
+**接口地址 :** `/personal_fm`
+
+**调用例子 :** `/personal_fm`
+
+返回数据如下图 :
+
+
+
+### 签到
+
+说明 : 调用此接口 , 传入签到类型 ( 可不传 , 默认安卓端签到 ), 可签到 ( 需要登录
+), 其中安卓端签到可获得 3 点经验 , web/PC 端签到可获得 2 点经验
+
+**可选参数 :** `type`: 签到类型 , 默认 0, 其中 0 为安卓端签到 ,1 为 web/PC 签到
+
+**接口地址 :** `/daily_signin`
+
+**调用例子 :** `/daily_signin`
+
+返回数据如下图 :
+
+
+
+
+
+### 乐签信息
+
+说明 : 调用此接口, 可获取乐签信息
+
+**接口地址 :** `/sign/happy/info`
+
+### 喜欢音乐
+
+说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐
+
+**必选参数 :** `id`: 歌曲 id
+
+**可选参数 :** `like`: 布尔值 , 默认为 true 即喜欢 , 若传 false, 则取消喜欢
+
+**接口地址 :** `/like`
+
+**调用例子 :** `/like?id=347230`
+
+返回数据如下图 :
+
+
+
+喜欢成功则返回数据的 code 为 200, 其余为失败
+
+
+
+### 喜欢音乐列表
+
+说明 : 调用此接口 , 传入用户 id, 可获取已喜欢音乐 id 列表(id 数组)
+
+**必选参数 :** `uid`: 用户 id
+
+**接口地址 :** `/likelist`
+
+**调用例子 :** `/likelist?uid=32953014`
+
+### 垃圾桶
+
+说明 : 调用此接口 , 传入音乐 id, 可把该音乐从私人 FM 中移除至垃圾桶
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/fm_trash`
+
+**调用例子 :** `/fm_trash?id=347230`
+
+返回数据如下图 :
+
+
+
+### 新碟上架
+
+说明 : 调用此接口 , 可获取新碟上架列表 , 如需具体音乐信息需要调用获取专辑列表接
+口 `/album` , 然后传入 id, 如 `/album?id=32311`
+
+**可选参数 :**
+
+
+
+`area`: ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本
+
+`type` : new:全部 hot:热门,默认为 new
+
+`year` : 年,默认本年
+
+`month` : 月,默认本月
+
+**接口地址 :** `/top/album`
+
+**调用例子 :** `/top/album?offset=0&limit=30&year=2019&month=6`
+
+### 全部新碟
+
+说明 : 登录后调用此接口 ,可获取全部新碟
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`area` : ALL:全部,ZH:华语,EA:欧美,KR:韩国,JP:日本
+
+**接口地址 :** `/album/new`
+
+**调用例子 :** `/album/new?area=KR&limit=10`
+
+### 最新专辑
+
+说明 : 调用此接口 ,获取云音乐首页新碟上架数据
+
+**接口地址 :** `/album/newest`
+
+**调用例子 :** `/album/newest`
+
+### 听歌打卡
+
+说明 : 调用此接口 , 传入音乐 id, 来源 id,歌曲时间 time,更新听歌排行数据
+
+**必选参数 :** `id`: 歌曲 id, `sourceid`: 歌单或专辑 id
+
+**可选参数 :** `time`: 歌曲播放时间,单位为秒
+
+**接口地址 :** `/scrobble`
+
+**调用例子 :** `/scrobble?id=518066366&sourceid=36780169&time=291`
+
+### 热门歌手
+
+说明 : 调用此接口 , 可获取热门歌手数据
+
+**可选参数 :** `limit`: 取出数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/top/artists`
+
+**调用例子 :** `/top/artists?offset=0&limit=30`
+
+返回数据如下图 :
+
+
+
+### 全部 mv
+
+说明 : 调用此接口 , 可获取全部 mv
+
+**可选参数 :**
+`area`: 地区,可选值为全部,内地,港台,欧美,日本,韩国,不填则为全部
+`type`: 类型,可选值为全部,官方版,原生,现场版,网易出品,不填则为全部
+
+`order`: 排序,可选值为上升最快,最热,最新,不填则为上升最快
+
+`limit`: 取出数量 , 默认为 30
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/mv/all`
+
+**调用例子 :** `/mv/all?area=港台`
+
+### 最新 mv
+
+说明 : 调用此接口 , 可获取最新 mv
+
+**可选参数 :** `area`: 地区,可选值为全部,内地,港台,欧美,日本,韩国,不填则为全部
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+**接口地址 :** `/mv/first`
+
+**调用例子 :** `/mv/first?limit=10`
+
+### 网易出品 mv
+
+说明 : 调用此接口 , 可获取网易出品 mv
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/mv/exclusive/rcmd`
+
+**调用例子 :** `/mv/exclusive/rcmd?limit=10`
+
+### 推荐 mv
+
+说明 : 调用此接口 , 可获取推荐 mv
+
+**接口地址 :** `/personalized/mv`
+
+**调用例子 :** `/personalized/mv`
+
+### 推荐歌单
+
+说明 : 调用此接口 , 可获取推荐歌单
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30 (不支持 offset)
+
+**接口地址 :** `/personalized`
+
+**调用例子 :** `/personalized?limit=1`
+
+### 推荐新音乐
+
+说明 : 调用此接口 , 可获取推荐新音乐
+
+**可选参数 :** `limit`: 取出数量 , 默认为 10 (不支持 offset)
+
+**接口地址 :** `/personalized/newsong`
+
+**调用例子 :** `/personalized/newsong`
+
+### 推荐电台
+
+说明 : 调用此接口 , 可获取推荐电台
+
+**接口地址 :** `/personalized/djprogram`
+
+**调用例子 :** `/personalized/djprogram`
+
+### 推荐节目
+
+说明 : 调用此接口 , 可获取推荐电台
+
+**接口地址 :** `/program/recommend`
+
+**调用例子 :** `/program/recommend`
+
+### 独家放送(入口列表)
+
+说明 : 调用此接口 , 可获取独家放送
+
+**接口地址 :** `/personalized/privatecontent`
+
+**调用例子 :** `/personalized/privatecontent`
+
+### 独家放送列表
+
+说明 : 调用此接口 , 可获取独家放送列表
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 60
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*60, 其中 60 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/personalized/privatecontent/list`
+
+**调用例子 :** `/personalized/privatecontent/list?limit=1&offset=2`
+
+### mv 排行
+
+说明 : 调用此接口 , 可获取 mv 排行
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+`area`: 地区,可选值为内地,港台,欧美,日本,韩国,不填则为全部
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/top/mv`
+
+**调用例子 :** `/top/mv?limit=10`
+
+### 获取 mv 数据
+
+说明 : 调用此接口 , 传入 mvid ( 在搜索音乐的时候传 type=1004 获得 ) , 可获取对应
+MV 数据 , 数据包含 mv 名字 , 歌手 , 发布时间 , mv 视频地址等数据 , 其中 mv 视频
+网易做了防盗链处理 , 可能不能直接播放 , 需要播放的话需要调用 ' mv 地址' 接口
+
+**必选参数 :** `mvid`: mv 的 id
+
+**接口地址 :** `/mv/detail`
+
+**调用例子 :** `/mv/detail?mvid=5436712`
+
+返回数据如下图 :
+
+
+
+### 获取 mv 点赞转发评论数数据
+
+说明 : 调用此接口 , 传入 mvid ( 在搜索音乐的时候传 type=1004 获得 ) , 可获取对应
+MV 点赞转发评论数数据
+
+**必选参数 :** `mvid`: mv 的 id
+
+**接口地址 :** `/mv/detail/info`
+
+**调用例子 :** `/mv/detail/info?mvid=5436712`
+
+### mv 地址
+
+说明 : 调用此接口 , 传入 mv id,可获取 mv 播放地址
+
+**必选参数 :** `id`: mv id
+
+**可选参数 :** `r`: 分辨率,默认 1080,可从 `/mv/detail` 接口获取分辨率列表
+
+**接口地址 :** `/mv/url`
+
+**调用例子 :**
+
+`/mv/url?id=5436712` `/mv/url?id=10896407&r=1080`
+
+### 获取视频标签列表
+
+说明 : 调用此接口 , 可获取视频标签列表
+
+**接口地址 :** `/video/group/list`
+
+**调用例子 :** `/video/group/list`
+
+### 获取视频分类列表
+
+说明 : 调用此接口 , 可获取视频分类列表
+
+**接口地址 :** `/video/category/list`
+
+**调用例子 :** `/video/category/list`
+
+### 获取视频标签/分类下的视频
+
+说明 : 调用此接口 , 传入标签/分类`id`,可获取到相关的视频,分页参数只能传入 offset
+
+**必选参数 :** `id`: videoGroup 的 id
+
+**可选参数 :** `offset`: 默认 0
+
+**接口地址 :** `/video/group`
+
+**调用例子 :** `/video/group?id=9104`
+
+### 获取全部视频列表
+
+说明 : 调用此接口,可获取视频分类列表,分页参数只能传入 offset
+
+**可选参数 :** `offset`: 默认 0
+
+**接口地址 :** `/video/timeline/all`
+
+**调用例子 :** `/video/timeline/all`
+
+### 获取推荐视频
+
+说明 : 调用此接口, 可获取推荐视频,分页参数只能传入 offset
+
+**可选参数 :** `offset`: 默认 0
+
+**接口地址 :** `/video/timeline/recommend`
+
+**调用例子 :** `/video/timeline/recommend?offset=10`
+
+### 相关视频
+
+说明 : 调用此接口 , 可获取相关视频
+
+**必选参数 :** `id`: 视频 的 id
+
+**接口地址 :** `/related/allvideo`
+
+**调用例子 :** `/related/allvideo?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 视频详情
+
+说明 : 调用此接口 , 可获取视频详情
+
+**必选参数 :** `id`: 视频 的 id
+
+**接口地址 :** `/video/detail`
+
+**调用例子 :** `/video/detail?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 获取视频点赞转发评论数数据
+
+说明 : 调用此接口 , 传入 vid ( 视频 id ) , 可获取对应视频点赞转发评论数数据
+**必选参数 :** `vid`: 视频 id
+
+**接口地址 :** `/video/detail/info`
+
+**调用例子 :** `/video/detail/info?vid=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 获取视频播放地址
+
+说明 : 调用此接口 , 传入视频 id,可获取视频播放地址
+
+**必选参数 :** `id`: 视频 的 id
+
+**接口地址 :** `/video/url`
+
+**调用例子 :** `/video/url?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 所有榜单
+
+说明 : 调用此接口,可获取所有榜单
+**接口地址 :** `/toplist`
+
+**调用例子 :** `/toplist`
+
+### 排行榜详情
+
+说明: 请使用[歌单详情](#获取歌单详情)接口,传入排行榜 id 获取排行榜详情数据(排行榜也是歌单的一种)
+
+~~说明 : 调用此接口 , 传入榜单 id, 可获取不同排行榜数据(v3.34.0 之后不再支持 idx 参数)~~
+
+~~**必选参数 :** `id`: 榜单 id,通过所有榜单接口获取~~
+
+~~**接口地址 :** `/top/list`~~
+
+~~**调用例子 :** `/top/list?id=2809577409`~~
+
+### 所有榜单内容摘要
+
+说明 : 调用此接口,可获取所有榜单内容摘要
+
+**接口地址 :** `/toplist/detail`
+
+**调用例子 :** `/toplist/detail`
+
+### 歌手榜
+
+说明 : 调用此接口 , 可获取排行榜中的歌手榜
+
+**可选参数 :**
+
+```
+type : 地区
+1: 华语
+2: 欧美
+3: 韩国
+4: 日本
+```
+
+**接口地址 :** `/toplist/artist`
+
+**调用例子 :** `/toplist/artist`
+
+### 云盘
+
+说明 : 登录后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一
+次 `/song/url` 获取 url
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*200, 其中 200 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/user/cloud`
+
+**调用例子 :** `/user/cloud`
+
+### 云盘数据详情
+
+说明 : 登录后调用此接口 , 传入云盘歌曲 id,可获取云盘数据详情
+
+**必选参数 :** `id`: 歌曲 id,可多个,用逗号隔开
+
+**接口地址 :** `/user/cloud/detail`
+
+**调用例子 :** `/user/cloud/detail?id=5374627`
+
+### 云盘歌曲删除
+
+说明 : 登录后调用此接口 , 可删除云盘歌曲
+
+**必选参数 :** `id`: 歌曲 id,可多个,用逗号隔开
+
+**接口地址 :** `/user/cloud/del`
+
+**调用例子 :** `/user/cloud/del`
+
+### 云盘上传
+
+说明 : 登录后调用此接口,使用`'Content-Type': 'multipart/form-data'`上传 mp3 formData(name 为'songFile'),可上传歌曲到云盘
+
+参考: https://github.com/Binaryify/NeteaseCloudMusicApi/blob/master/public/cloud.html
+
+访问地址: http://localhost:3000/cloud.html)
+
+支持命令行调用,参考 module_example 目录下`song_upload.js`
+
+**接口地址 :** `/cloud`
+
+**调用例子 :** `/cloud`
+
+### 云盘歌曲信息匹配纠正
+
+说明 : 登录后调用此接口,可对云盘歌曲信息匹配纠正,如需取消匹配,asid 需要传 0
+
+**必选参数 :**
+`uid`: 用户 id
+
+`sid`: 云盘的歌曲 id
+
+`asid`: 要匹配的歌曲 id
+
+**接口地址 :** `/cloud/match`
+
+**调用例子 :** `/cloud/match?uid=32953014&sid=aaa&asid=bbb` `/cloud/match?uid=32953014&sid=bbb&asid=0`
+
+### 电台 banner
+
+说明 : 调用此接口,可获取电台 banner
+
+**接口地址 :** `/dj/banner`
+
+**调用例子 :** `/dj/banner`
+
+### 电台个性推荐
+
+说明 : 调用此接口,可获取电台个性推荐列表
+**可选参数 :**
+
+`limit` : 返回数量,默认为 6,总条数最多 6 条
+
+**接口地址 :** `/dj/personalize/recommend`
+
+**调用例子 :** `/dj/personalize/recommend?limit=5`
+
+### 电台订阅者列表
+
+说明 : 调用此接口,可获取电台订阅者列表
+**必选参数 :** `id`: 电台 id
+
+**可选参数 :**
+`time` : 分页参数,默认-1,传入上一次返回结果的 time,将会返回下一页的数据
+
+`limit` : 返回数量,默认为 20
+
+**接口地址 :** `/dj/subscriber`
+
+**调用例子 :** `/dj/subscriber?id=335425050` , `/dj/subscriber?id=335425050&time=1602761825390`
+
+### 用户电台
+
+说明 : 调用此接口, 传入用户 id 可获取用户创建的电台
+
+**必选参数 :** `uid`: 用户 id
+
+**接口地址 :** `/user/audio`
+
+**调用例子 :** `/user/audio?uid=32953014`
+
+### 热门电台
+
+说明 : 调用此接口,可获取热门电台
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+**接口地址 :** `/dj/hot`
+
+**调用例子 :** `/dj/hot`
+
+### 电台 - 节目榜
+
+说明 : 登录后调用此接口 , 可获得电台节目榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*100, 其中 100 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/dj/program/toplist`
+
+**调用例子 :** `/dj/program/toplist?limit=1`
+
+### 电台 - 付费精品
+
+说明 : 调用此接口,可获取付费精品电台
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100 (不支持 offset)
+
+**接口地址 :** `/dj/toplist/pay`
+
+**调用例子 :** `/dj/toplist/pay?limit=30`
+
+### 电台 - 24 小时节目榜
+
+说明 : 调用此接口,可获取 24 小时节目榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100 (不支持 offset)
+
+**接口地址 :** `/dj/program/toplist/hours`
+
+**调用例子 :** `/dj/program/toplist/hours?limit=1`
+
+### 电台 - 24 小时主播榜
+
+说明 : 调用此接口,可获取 24 小时主播榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100 (不支持 offset)
+
+**接口地址 :** `/dj/toplist/hours`
+
+**调用例子 :** `/dj/toplist/hours?limit=30`
+
+### 电台 - 主播新人榜
+
+说明 : 调用此接口,可获取主播新人榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100 (不支持 offset)
+
+**接口地址 :** `/dj/toplist/newcomer`
+
+**调用例子 :** `/dj/toplist/newcomer?limit=30`
+
+### 电台 - 最热主播榜
+
+说明 : 调用此接口,可获取最热主播榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100 (不支持 offset)
+
+**接口地址 :** `/dj/toplist/popular`
+
+**调用例子 :** `/dj/toplist/popular?limit=30`
+
+### 电台 - 新晋电台榜/热门电台榜
+
+说明 : 登录后调用此接口 , 可获得新晋电台榜/热门电台榜
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 100
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*100, 其中 100 为 limit 的值 , 默认为 0
+
+`type`: 榜单类型, `new` 为新晋电台榜,`hot`为热门电台榜
+
+**接口地址 :** `/dj/toplist`
+
+**调用例子 :** `/dj/toplist?type=hot` `/dj/toplist?type=new&limit=1`
+
+### 电台 - 类别热门电台
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`cateId`: 类别 id,可通过 `/dj/category/recommend` 接口获取
+
+**接口地址 :** `/dj/radio/hot`
+
+**调用例子 :** `/dj/radio/hot?cateId=2001`(创作|翻唱) `/dj/radio/hot?cateId=10002` (3D|电子)
+
+### 电台 - 推荐
+
+说明 : 登录后调用此接口 , 可获得推荐电台
+
+**接口地址 :** `/dj/recommend`
+
+**调用例子 :** `/dj/recommend`
+
+### 电台 - 分类
+
+说明 : 登录后调用此接口 , 可获得电台类型
+
+**接口地址 :** `/dj/catelist`
+
+**调用例子 :** `/dj/catelist`
+
+### 电台 - 分类推荐
+
+说明 : 登录后调用此接口 , 传入分类,可获得对应类型电台列表
+
+**必选参数 :** `type`: 电台类型 , 数字 , 可通过`/dj/catelist`获取 , 对应关系为
+id 对应 此接口的 type, name 对应类型
+
+**接口地址 :** `/dj/recommend/type`
+
+**调用例子 :** `/dj/recommend/type?type=1`(明星做主播) `/dj/recommend/type?type=2001` (创作|翻唱)
+
+### 电台 - 订阅
+
+说明 : 登录后调用此接口 , 传入`rid`, 可订阅 dj,dj 的 `rid` 可通过搜索指定
+type='1009' 获取其 id, 如`/search?keywords= 代码时间 &type=1009`
+
+**必选参数 :** `rid`: 电台 的 id
+
+**接口地址 :** `/dj/sub`
+
+**调用例子 :** `/dj/sub?rid=336355127&t=1` ( 对应关注 ' 代码时间 ')
+`/dj/sub?rid=336355127&t=0` ( 对应取消关注 ' 代码时间 ')
+
+### 电台的订阅列表
+
+说明 : 登录后调用此接口 , 可获取订阅的电台列表
+
+**接口地址 :** `/dj/sublist`
+
+**调用例子 :** `/dj/sublist`
+
+### 电台 - 付费精选
+
+说明 : 可以获取付费精选的电台列表 , 传入 `limit` 和 `offset` 可以进行分页
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/dj/paygift`
+
+**调用例子 :** `/dj/paygift?limit=10&offset=20`
+
+### 电台 - 非热门类型
+
+说明 : 登录后调用此接口, 可获得电台非热门类型
+
+**接口地址 :** `/dj/category/excludehot`
+
+**调用例子 :** `/dj/category/excludehot`
+
+### 电台 - 推荐类型
+
+说明 : 登录后调用此接口, 可获得电台推荐类型
+
+**接口地址 :** `/dj/category/recommend`
+
+**调用例子 :** `/dj/category/recommend`
+
+### 电台 - 今日优选
+
+说明 : 登录后调用此接口, 可获得电台今日优选
+
+**接口地址 :** `/dj/today/perfered`
+
+**调用例子 :** `/dj/today/perfered`
+
+### 电台 - 详情
+
+说明 : 登录后调用此接口 , 传入`rid`, 可获得对应电台的详情介绍
+
+**必选参数 :** `rid`: 电台 的 id
+
+**接口地址 :** `/dj/detail`
+
+**调用例子 :** `/dj/detail?rid=336355127` ( 对应 ' 代码时间 ' 的详情介绍 )
+
+### 电台 - 节目
+
+说明 : 登录后调用此接口 , 传入`rid`, 可查看对应电台的电台节目以及对应的 id, 需要
+注意的是这个接口返回的 mp3Url 已经无效 , 都为 null, 但是通过调用 `/song/url` 这
+个接口 , 传入节目 id 仍然能获取到节目音频 , 如 `/song/url?id=478446370` 获取代
+码时间的一个节目的音频
+
+**必选参数 :** `rid`: 电台 的 id
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`asc` : 排序方式,默认为 `false` (新 => 老 ) 设置 `true` 可改为 老 => 新
+
+**接口地址 :** `/dj/program`
+
+**调用例子 :** `/dj/program?rid=336355127&limit=40` ( 对应 ' 代码时间 ' 的节目列表 )
+
+### 电台 - 节目详情
+
+说明 : 调用此接口传入电台节目 id,可获得电台节目详情
+
+**必选参数 :** `id`: 电台节目 的 id
+
+**接口地址 :** `/dj/program/detail`
+
+**调用例子 :** `/dj/program/detail?id=1367665101`
+
+### 通知 - 私信
+
+说明 : 登录后调用此接口 ,可获取私信
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/msg/private`
+
+**调用例子 :** `/msg/private?limit=3`
+
+### 发送私信
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息, 可以发送私信,返回内容为历史私信,包含带歌单的私信信息(注:不能发送私信给自己)
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/text`
+
+**调用例子 :** `/send/text?user_ids=32953014&msg=test`,`/send/text?user_ids=32953014,475625142&msg=test`
+
+### 发送私信(带歌曲)
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息,音乐 id, 可以发送音乐私信,返回内容为历史私信
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`id` : 要发送音乐的 id
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/song`
+
+**调用例子 :** `/send/song?user_ids=1&id=351318&msg=测试`
+
+### 发送私信(带专辑)
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息,专辑 id, 可以发送专辑私信,返回内容为消息 id
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`id` : 要发送专辑的 id
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/album`
+
+**调用例子 :** `/send/album?user_ids=1&id=351318&msg=测试`
+
+### 发送私信(带歌单)
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息和歌单 id, 可以发送带歌单的私信(注:不能发送重复的歌单)
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/playlist`
+
+**调用例子 :** `/send/playlist?msg=test&user_ids=475625142&playlist=705123491`,`/send/playlist?msg=test2&user_ids=475625142,32953014&playlist=705123493`
+
+### 最近联系人
+
+说明 : 登录后调用此接口 ,可获取最接近联系人
+
+**接口地址 :** `/msg/recentcontact`
+
+**调用例子 :** `/msg/recentcontact`
+
+### 私信内容
+
+说明 : 登录后调用此接口 , 可获取私信内容
+
+**必选参数 :**
+`uid` : 用户 id
+
+**可选参数 :**
+`limit` : 返回数量 , 默认为 30
+
+`before` : 分页参数,取上一页最后一项的 `time` 获取下一页数据
+
+**接口地址 :**
+`/msg/private/history`
+
+**调用例子 :**
+`/msg/private/history?uid=9003` (云音乐小秘书)
+
+### 通知 - 评论
+
+说明 : 登录后调用此接口 ,可获取评论
+
+**必选参数 :** `uid`: 用户 的 id,只能和登录账号的 id 一致
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`before` : 分页参数,取上一页最后一个歌单的 `updateTime` 获取下一页数据
+
+**接口地址 :** `/msg/comments`
+
+**调用例子 :** `/msg/comments?uid=32953014`
+
+### 通知 - @我
+
+说明 : 登录后调用此接口 ,可获取@我数据
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/msg/forwards`
+
+**调用例子 :** `/msg/forwards?limit=3`
+
+### 通知 - 通知
+
+说明 : 登录后调用此接口 ,可获取通知
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`lasttime` : 返回数据的 `time` ,默认-1,传入上一次返回结果的 time,将会返回下一页的数据
+
+**接口地址 :** `/msg/notices`
+
+**调用例子 :** `/msg/notices?limit=3`
+
+### 设置
+
+说明 : 登录后调用此接口 ,可获取用户设置
+
+**接口地址 :** `/setting`
+
+**调用例子 :** `/setting`
+
+### 数字专辑-新碟上架
+
+说明 : 调用此接口 ,可获取数字专辑-新碟上架
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+**接口地址 :** `/album/list`
+
+**调用例子 :** `/album/list?limit=10`
+
+### 数字专辑&数字单曲-榜单
+
+说明 : 调用此接口 ,可获取数字专辑&数字单曲-榜单
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`albumType` : 为数字专辑,1 为数字单曲
+
+`type` : daily:日榜,week:周榜,year:年榜,total:总榜
+
+**接口地址 :** `/album_songsaleboard`
+
+**调用例子 :** `/album/songsaleboard?type=year&year=2020&albumType=0`
+
+### 数字专辑-语种风格馆
+
+说明 : 调用此接口 ,可获取语种风格馆数字专辑列表
+
+**可选参数 :**
+
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`area` 地区 Z_H:华语,E_A:欧美,KR:韩国,JP:日本
+
+**接口地址 :** `/album/list/style`
+
+**调用例子 :** `/album/list/style?area=Z_H&offset=2`
+
+### 数字专辑详情
+
+说明 : 调用此接口 ,传入数字专辑 id 可获取数字专辑详情(和歌单详情有差异)
+
+**接口地址 :** `/album/detail`
+
+**调用例子 :** `/album/detail?id=84547195`
+
+### 我的数字专辑
+
+说明 : 登录后调用此接口 ,可获取我的数字专辑
+
+**接口地址 :** `/digitalAlbum/purchased`
+
+**调用例子 :** `/digitalAlbum/purchased?limit=10`
+
+### 购买数字专辑
+
+说明 : 登录后调用此接口 ,可获取购买数字专辑的地址,把地址生成二维码后,可扫描购买专辑
+
+**必选参数 :**
+
+`id` : 专辑的 id
+
+`payment` : 支付方式, 0 为支付宝 3 为微信
+
+`quantity` : 购买的数量
+
+**接口地址 :** `/digitalAlbum/ordering`
+
+**调用例子 :** `/digitalAlbum/ordering?id=86286082&payment=3&quantity=1`
+
+### 音乐日历
+
+说明 : 登录后调用此接口,传入开始和结束时间,可获取音乐日历
+
+**接口地址 :** `/calendar`
+
+**调用例子 :** `/calendar?startTime=1606752000000&endTime=1609430399999`
+
+### 云贝
+
+说明 : 登录后调用此接口可获取云贝签到信息(连续签到天数,第二天全部可获得的云贝)
+
+**接口地址 :** `/yunbei`
+
+**调用例子 :** `/yunbei`
+
+### 云贝今日签到信息
+
+说明 : 登录后调用此接口可获取云贝今日签到信息(今日签到获取的云贝数)
+
+**接口地址 :** `/yunbei/today`
+
+**调用例子 :** `/yunbei/today`
+
+### 云贝签到
+
+说明 : 登录后调用此接口可进行云贝签到
+
+**接口地址 :** `/yunbei/sign`
+
+**调用例子 :** `/yunbei/sign`
+
+### 云贝账户信息
+
+说明 :登录后调用此接口可获取云贝账户信息(账户云贝数)
+
+**接口地址 :** `/yunbei/info`
+
+**调用例子 :** `/yunbei/info`
+
+### 云贝所有任务
+
+说明 :登录后调用此接口可获取云贝所有任务
+
+**接口地址 :** `/yunbei/tasks`
+
+**调用例子 :** `/yunbei/tasks`
+
+### 云贝 todo 任务
+
+说明 :登录后调用此接口可获取云贝 todo 任务
+
+**接口地址 :** `/yunbei/tasks/todo`
+
+**调用例子 :** `/yunbei/tasks/todo`
+
+### 云贝完成任务
+
+**必选参数 :**
+
+`userTaskId` : 任务 id
+
+**可选参数 :**
+
+`depositCode`: 任务 depositCode
+
+**接口地址 :** `/yunbei/task/finish`
+
+**调用例子 :** `/yunbei/task/finish?userTaskId=5146243240&depositCode=0`
+
+### 云贝收入
+
+说明 :登录后调用此接口可获取云贝收入
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 10
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
+
+**接口地址 :** `/yunbei/tasks/receipt`
+
+**调用例子 :** `/yunbei/tasks/receipt?limit=1`
+
+### 云贝支出
+
+说明 :登录后调用此接口可获取云贝支出
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 10
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
+**接口地址 :** `/yunbei/tasks/expense`
+
+**调用例子 :** `/yunbei/tasks/expense?limit=1`
+
+### 关注歌手新歌
+
+说明 :登录后调用此接口可获取关注歌手新歌
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`before`: 上一页数据返回的 publishTime 的数据
+
+**接口地址 :** `/artist/new/song`
+
+**调用例子 :** `/artist/new/song?limit=1` `/artist/new/song?limit=1&before=1602777625000`
+
+### 关注歌手新 MV
+
+说明 :登录后调用此接口可获取关注歌手新 MV
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`before`: 上一页数据返回的 publishTime 的数据
+
+**接口地址 :** `/artist/new/mv`
+
+**调用例子 :** `/artist/new/mv?limit=1` `/artist/new/mv?limit=1&before=1602777625000`
+
+### 一起听状态
+
+说明 :登录后调用此接口可获取一起听状态
+
+**接口地址 :** `/listen/together/status`
+
+**调用例子 :** `/listen/together/status`
+
+### batch 批量请求接口
+
+说明 : 登录后调用此接口 ,传入接口和对应原始参数(原始参数非文档里写的参数,需参考源码),可批量请求接口
+
+**接口地址 :** `/batch`
+
+**调用例子 :** 使用 GET 方式:`/batch?/api/v2/banner/get={"clientType":"pc"}` 使用 POST 方式传入参数:`{ "/api/v2/banner/get": {"clientType":"pc"} }`
+
+### 云贝推歌
+
+说明 : 登录后调用此接口 , 传入歌曲 id, 可以进行云贝推歌
+
+**必选参数 :** `id` : 歌曲 id
+
+**可选参数 :** `reason` : 推歌理由
+
+`yunbeiNum`: 云贝数量,默认10
+
+**接口地址 :** `/yunbei/rcmd/song`
+
+**调用例子 :** `/yunbei/rcmd/song?id=65528` `/yunbei/rcmd/song?id=65528&reason=人间好声音推荐给你听`
+
+### 云贝推歌历史记录
+
+说明 : 登录后调用此接口 , 可以获得云贝推歌历史记录
+
+**可选参数 :** `size` : 返回数量 , 默认为 20
+
+`cursor` : 返回数据的 cursor, 默认为 '' , 传入上一次返回结果的 cursor,将会返回下一页的数据
+
+**接口地址 :** `/yunbei/rcmd/song/history`
+
+**调用例子 :** `/yunbei/rcmd/song/history?size=10`
+
+### 已购单曲
+
+说明 :登录后调用此接口可获取已购买的单曲
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
+
+**接口地址 :** `/song/purchased`
+
+**调用例子 :** `/song/purchased?limit=10`
+
+### 获取 mlog 播放地址
+
+说明 : 调用此接口 , 传入 mlog id, 可获取 mlog 播放地址
+
+**必选参数 :** `id` : mlog id
+
+**可选参数 :** `res`: 分辨率 , 默认为 1080
+
+**接口地址 :** `/mlog/url`
+
+**调用例子 :** `/mlog/url?id=a1qOVPTWKS1ZrK8`
+
+### 将 mlog id 转为视频 id
+
+说明 : 调用此接口 , 传入 mlog id, 可获取 video id,然后通过`video/url` 获取播放地址
+
+**必选参数 :** `id` : mlog id
+
+**接口地址 :** `/mlog/to/video`
+
+**调用例子 :** `/mlog/to/video?id=a1qOVPTWKS1ZrK8`
+
+### vip 成长值
+
+说明 : 登陆后调用此接口 , 可获取当前会员成长值
+
+**接口地址 :** `/vip/growthpoint`
+
+**调用例子 :** `/vip/growthpoint`
+
+### vip 成长值获取记录
+
+说明 :登录后调用此接口可获取会员成长值领取记录
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
+
+**接口地址 :** `/vip/growthpoint/details`
+
+**调用例子 :** `/vip/growthpoint/details?limit=10`
+
+### vip 任务
+
+说明 : 登陆后调用此接口 , 可获取会员任务
+
+**接口地址 :** `/vip/tasks`
+
+**调用例子 :** `/vip/tasks`
+
+### 领取 vip 成长值
+
+说明 : 登陆后调用此接口 , 可获取已完成的会员任务的成长值奖励
+
+**必选参数 :** `ids` : 通过`/vip/tasks`获取到的`unGetIds`
+
+**接口地址 :** `/vip/growthpoint/get`
+
+**调用例子 :** `/vip/growthpoint/get?ids=7043206830_7` `/vip/growthpoint/get?ids=8613118351_1,8607552957_1`
+
+### 歌手粉丝
+
+说明 : 调用此接口 , 传入歌手 id, 可获取歌手粉丝
+**必选参数 :** `id` : 歌手 id
+
+
+**接口地址 :** `/artist/fans`
+
+**调用例子 :** `/artist/fans?id=2116&limit=10&offset=0`
+
+### 歌手粉丝数量
+
+说明 : 调用此接口 , 传入歌手 id, 可获取歌手粉丝数量
+
+
+**必选参数 :** `id` : 歌手 id
+
+**可选参数 :** `limit`: 取出粉丝数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*10, 其中 10 为 limit 的值
+
+**接口地址 :** `/artist/follow/count`
+
+**调用例子 :** `/artist/follow/count?id=2116`
+
+### 数字专辑详情
+
+说明 : 调用此接口 , 传入专辑 id, 可获取数字专辑信息
+
+**必选参数 :** `id` : 专辑 id
+
+**接口地址 :** `/digitalAlbum/detail`
+
+**调用例子 :** `/digitalAlbum/detail?id=120605500`
+
+### 数字专辑销量
+
+说明 : 调用此接口 , 传入专辑 id, 可获取数字专辑销量
+
+**必选参数 :** `ids` : 专辑 id, 支持多个,用`,`隔开
+
+**接口地址 :** `/digitalAlbum/sales`
+
+**调用例子 :** `/digitalAlbum/sales?ids=120605500` `/digitalAlbum/sales?ids=120605500,125080528`
+
+### 音乐人数据概况
+
+说明 : 音乐人登录后调用此接口 , 可获取统计数据概况
+
+**接口地址 :** `/musician/data/overview`
+
+**调用例子 :** `/musician/data/overview`
+
+### 音乐人播放趋势
+
+说明 : 音乐人登录后调用此接口 , 可获取歌曲播放趋势
+
+**必选参数 :** `startTime` : 开始时间
+
+`endTime` : 结束时间
+
+**接口地址 :** `/musician/play/trend`
+
+**调用例子 :** `/musician/play/trend?startTime=2021-05-24&endTime=2021-05-30`
+
+### 音乐人任务
+
+说明 : 音乐人登录后调用此接口 , 可获取音乐人任务。返回的数据中`status`字段为任务状态,0 表示任务未开始,10 表示任务正在进行中,20 表示任务完成,但未领取云豆,100 表示任务完成,并且已经领取了相应的云豆(貌似只能获取到做过的任务了)
+
+**接口地址 :** `/musician/tasks`
+
+**调用例子 :** `/musician/tasks`
+
+### 音乐人任务(新)
+
+说明 : 音乐人登录后调用此接口 , 可获取音乐人任务。返回的数据中`status`字段为任务状态,0 表示任务未开始,10 表示任务正在进行中,20 表示任务完成,但未领取云豆,100 表示任务完成,并且已经领取了相应的云豆
+
+**接口地址 :** `/musician/tasks/new`
+
+**调用例子 :** `/musician/tasks/new`
+
+### 账号云豆数
+
+说明 : 音乐人登录后调用此接口 , 可获取账号云豆数
+
+**接口地址 :** `/musician/cloudbean`
+
+**调用例子 :** `/musician/cloudbean`
+
+### 领取云豆
+
+说明 : 音乐人登录后调用此接口 , 可领取已完成的音乐人任务的云豆奖励
+
+**必选参数 :** `id` : 任务 id,通过`/musician/tasks`获取到的`userMissionId`即为任务 id
+
+`period` : 通过`/musician/tasks`获取
+
+**接口地址 :** `/musician/cloudbean/obtain`
+
+**调用例子 :** `/musician/cloudbean/obtain?id=7036416928&period=1`
+
+### 获取 VIP 信息
+
+说明: 登录后调用此接口,可获取当前 VIP 信息。
+
+**接口地址 :** `/vip/info`
+
+**调用例子 :** `/vip/info`
+
+### 音乐人签到
+
+说明: 音乐人登录后调用此接口,可以完成“登录音乐人中心”任务,然后通过`/musician/cloudbean/obtain`接口可以领取相应的云豆。
+
+**接口地址 :** `/musician/sign`
+
+**调用例子 :** `/musician/sign`
+
+### 歌曲相关视频
+
+说明: 可以调用此接口获取歌曲相关视频 (区别于 MV), 有些歌曲没有 MV 但是有用户上传的与此歌曲相关的 Mlog。 此功能仅在 网易云音乐 APP 上存在。
+
+请注意:此接口偶尔会在相关视频后返回不相关视频,请合理使用。
+
+**必选参数 :** `songid` : 歌曲 ID
+
+**可选参数 :** `mvid` : 如果定义,此 mvid 对应的 MV 将会作为第一个返回。
+`limit` : 取出的 Mlog 数量, 不包含第一个 mvid
+
+**接口地址 :** `/mlog/music/rcmd`
+
+### 公开隐私歌单
+
+说明: 可以调用此接口将当前用户的隐私歌单公开。
+
+**必选参数 :** `id` : 歌单 ID
+
+**接口地址 :** `/playlist/privacy`
+
+### 获取客户端歌曲下载 url
+
+说明 : 使用 `/song/url` 接口获取的是歌曲试听 url, 但存在部分歌曲在非 VIP 账号上可以下载无损音质而不能试听无损音质, 使用此接口可使非 VIP 账号获取这些歌曲的无损音频
+
+**必选参数 :** `id` : 音乐 id (仅支持单首歌曲)
+
+**可选参数 :** `br` : 码率, 默认设置了 999000 即最大码率, 如果要 320k 则可设置为 320000, 其他类推
+
+**接口地址 :** `/song/download/url`
+
+### 获取歌手视频
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手视频
+
+**必选参数 :** `id` : 歌手 id
+
+**可选参数 :** `size` : 返回数量 , 默认为 10
+
+`cursor` : 返回数据的 cursor, 默认为 0 , 传入上一次返回结果的 cursor,将会返回下一页的数据
+
+`order` : 排序方法, 0 表示按时间排序, 1 表示按热度排序, 默认为 0
+
+**接口地址 :** `/artist/video`
+
+**调用例子 :** `/artist/video?id=2116`
+
+### 最近播放-歌曲
+
+说明 : 调用此接口 , 可获得最近播放-歌曲
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/song`
+
+**调用例子 :** `/record/recent/song?limit=1`
+
+### 最近播放-视频
+
+说明 : 调用此接口 , 可获得最近播放-视频
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/video`
+
+**调用例子 :** `/record/recent/video?limit=1`
+
+### 最近播放-声音
+
+说明 : 调用此接口 , 可获得最近播放-声音
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/voice`
+
+**调用例子 :** `/record/recent/voice?limit=1`
+
+### 最近播放-歌单
+
+说明 : 调用此接口 , 可获得最近播放-歌单
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/playlist`
+
+**调用例子 :** `/record/recent/playlist?limit=1`
+
+### 最近播放-专辑
+
+说明 : 调用此接口 , 可获得最近播放-专辑
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/album`
+
+**调用例子 :** `/record/recent/album?limit=1`
+
+### 最近播放-播客
+
+说明 : 调用此接口 , 可获得最近播放-播客
+
+**可选参数 :** `limit` : 返回数量 , 默认为 100
+
+**接口地址 :** `/record/recent/dj`
+
+**调用例子 :** `/record/recent/dj?limit=1`
+
+### 签到进度
+
+说明 : 调用此接口 , 可获得签到进度
+
+**可选参数 :** `moduleId` : 模块 id,默认为 '1207signin-1207signin'
+
+**接口地址 :** `/signin/progress`
+
+**调用例子 :** `/signin/progress?moduleId=1207signin-1207signin`
+
+### 内部版本接口
+
+说明 : 调用此接口 , 可获得内部版本号(从package.json读取)
+
+**接口地址 :** `/inner/version`
+
+**调用例子 :** `/inner/version`
+
+### 黑胶时光机
+
+说明 : 调用此接口 , 可获得黑胶时光机数据
+
+**可选参数 :** `startTime` : 开始时间
+`endTime` : 结束时间
+`limit` : 返回数量 , 默认为 60
+
+**接口地址 :** `/vip/timemachine`
+
+**调用例子 :** `/vip/timemachine` `/vip/timemachine?startTime=1638288000000&endTime=1640966399999&limit=10`(2021年12月) `/vip/timemachine?startTime=1609430400&endTime=1640966399999&limit=60`(2021年)
+
+
+## 离线访问此文档
+
+此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问
+
+## 关于此文档
+
+此文档由 [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/docs/_coverpage.md b/docs/_coverpage.md
new file mode 100644
index 0000000..e65dce2
--- /dev/null
+++ b/docs/_coverpage.md
@@ -0,0 +1,13 @@
+# 网易云音乐 API
+
+> 网易云音乐 NodeJS 版 API
+
+- 全部接口已升级到最新
+- 具备登录接口,多达200多个接口
+- 更完善的文档
+
+
+[GitHub](https://github.com/Binaryify/NeteaseCloudMusicApi)
+[Get Started](#neteasecloudmusicapi)
+
+
diff --git a/docs/favicon.ico b/docs/favicon.ico
new file mode 100644
index 0000000..2e28d04
Binary files /dev/null and b/docs/favicon.ico differ
diff --git a/docs/icon.png b/docs/icon.png
new file mode 100644
index 0000000..92eda4c
Binary files /dev/null and b/docs/icon.png differ
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..966c514
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+ 网易云音乐 NodeJS 版 API
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/sw.js b/docs/sw.js
new file mode 100644
index 0000000..a50f9ba
--- /dev/null
+++ b/docs/sw.js
@@ -0,0 +1,90 @@
+/* ===========================================================
+ * docsify sw.js
+ * ===========================================================
+ * Copyright 2016 @huxpro
+ * Licensed under Apache 2.0
+ * Register service worker.
+ * ========================================================== */
+
+const RUNTIME = 'docsify'
+const HOSTNAME_WHITELIST = [
+ self.location.hostname,
+ 'fonts.gstatic.com',
+ 'fonts.googleapis.com',
+ 'unpkg.com',
+]
+
+// The Util Function to hack URLs of intercepted requests
+const getFixedUrl = (req) => {
+ var now = Date.now()
+ var url = new URL(req.url)
+
+ // 1. fixed http URL
+ // Just keep syncing with location.protocol
+ // fetch(httpURL) belongs to active mixed content.
+ // And fetch(httpRequest) is not supported yet.
+ url.protocol = self.location.protocol
+
+ // 2. add query for caching-busting.
+ // Github Pages served with Cache-Control: max-age=600
+ // max-age on mutable content is error-prone, with SW life of bugs can even extend.
+ // Until cache mode of Fetch API landed, we have to workaround cache-busting with query string.
+ // Cache-Control-Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=453190
+ if (url.hostname === self.location.hostname) {
+ url.search += (url.search ? '&' : '?') + 'cache-bust=' + now
+ }
+ return url.href
+}
+
+/**
+ * @Lifecycle Activate
+ * New one activated when old isnt being used.
+ *
+ * waitUntil(): activating ====> activated
+ */
+self.addEventListener('activate', (event) => {
+ event.waitUntil(self.clients.claim())
+})
+
+/**
+ * @Functional Fetch
+ * All network requests are being intercepted here.
+ *
+ * void respondWith(Promise r)
+ */
+self.addEventListener('fetch', (event) => {
+ // Skip some of cross-origin requests, like those for Google Analytics.
+ if (HOSTNAME_WHITELIST.indexOf(new URL(event.request.url).hostname) > -1) {
+ // Stale-while-revalidate
+ // similar to HTTP's stale-while-revalidate: https://www.mnot.net/blog/2007/12/12/stale
+ // Upgrade from Jake's to Surma's: https://gist.github.com/surma/eb441223daaedf880801ad80006389f1
+ const cached = caches.match(event.request)
+ const fixedUrl = getFixedUrl(event.request)
+ const fetched = fetch(fixedUrl, { cache: 'no-store' })
+ const fetchedCopy = fetched.then((resp) => resp.clone())
+
+ // Call respondWith() with whatever we get first.
+ // If the fetch fails (e.g disconnected), wait for the cache.
+ // If there’s nothing in cache, wait for the fetch.
+ // If neither yields a response, return offline pages.
+ event.respondWith(
+ Promise.race([fetched.catch((_) => cached), cached])
+ .then((resp) => resp || fetched)
+ .catch((_) => {
+ /* eat any errors */
+ }),
+ )
+
+ // Update the cache with the version we fetched (only for ok status)
+ event.waitUntil(
+ Promise.all([fetchedCopy, caches.open(RUNTIME)])
+ .then(
+ ([response, cache]) =>
+ response.ok && cache.put(event.request, response),
+ )
+ .catch((_) => {
+ /* eat any errors */
+ }),
+ )
+ }
+})
diff --git a/docs/v2.md b/docs/v2.md
new file mode 100644
index 0000000..08ba02f
--- /dev/null
+++ b/docs/v2.md
@@ -0,0 +1,1430 @@
+# 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
+
+## 功能特性
+
+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. 获取动态
+63. 获取热搜
+64. 发送私信
+65. 发送私信歌单
+66. 新建歌单
+67. 收藏/取消收藏歌单
+68. 歌单分类
+69. 收藏的歌手列表
+70. 订阅的电台列表
+71. 相关歌单推荐
+72. 付费精选接口
+73. 音乐是否可用检查接口
+74. 登录状态
+75. 获取视频数据
+76. 发送/删除评论
+77. 热门评论
+78. 视频评论
+79. 退出登录
+
+## 安装
+
+```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
+```
+
+## 可以使用代理
+
+在 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}
+```
+
+## Docker 容器运行
+
+> 注意: 在 docker 中运行的时候, 由于使用了 request 来发请求, 所以会检查几个
+> proxy 相关的环境变量(如下所列), 这些环境变量 会影响到 request 的代理, 详情请参
+> 考[request 的文档](https://github.com/request/request#proxies), 如果这些环境变
+> 量 指向的代理不可用, 那么就会造成错误, 所以在使用 docker 的时候一定要注意这些
+> 环境变量. 不过, 要是你在 query 中加上了 proxy 参数, 那么环境变量会被覆盖, 就会
+> 用你通过 proxy 参数提供的代理了.
+
+request 相关的环境变量
+
+1. http_proxy
+2. https_proxy
+3. HTTP_PROXY
+4. HTTPS_PROXY
+5. no_proxy
+6. NO_PROXY
+
+```shell
+docker pull twesix/netease-cloud-music
+docker run -d -p 3000:3000 --name netease-cloud-music twesix/netease-music-api
+
+// 去掉或者设置相关的环境变量
+docker run -d -p 3000:3000 --name netease-cloud-music -e http_proxy= -e https_proxy= -e no_proxy= -e HTTP_PROXY= -e HTTPS_PROXY= -e NO_PROXY= netease-cloud-music
+```
+
+> 由于 docker 镜像更新不是很及时,推荐自己 build, 以下为 build 镜像的方式
+
+```
+$ git clone https://github.com/Binaryify/NeteaseCloudMusicApi && cd NeteaseCloudMusicApi
+$ sudo docker build . -t netease-music-api
+$ sudo docker run -d -p 3000:3000 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 上的版本不一致,请清除缓存再查看
+
+!> 由于网易限制,此项目在国外服务器上使用会受到限制,如需解决 , 可使用大陆服务器或者使用代理 , 感谢 [@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)~~
+
+> 更新 : 此接口已经可以正常使用(2018.07.03)
+
+**必选参数 :** `email`: 163 网易邮箱 `password`: 密码
+
+**接口地址 :** `/login`
+
+**调用例子 :** `/login?email=xxx@163.com&password=yyy`
+
+返回数据如下图 :
+
+
+完成登录后 , 会在浏览器保存一个 Cookies 用作登录凭证 , 大部分 API 都需要用到这个
+Cookies
+
+#### 注意
+
+调用登录接口的速度比调用其他接口慢 , 因为登录过程调用了加密算法
+
+### 刷新登录
+
+说明 : 调用此接口 , 可刷新登录状态
+
+**调用例子 :** `/login/refresh`
+
+### 退出登录
+
+说明 : 调用此接口 , 可退出登录
+
+**调用例子 :** `/logout`
+
+### 登录状态
+
+说明 : 调用此接口,可获取登录状态
+
+**接口地址 :** `/login/status`
+返回数据如下图:
+
+
+### 获取用户详情
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户详情
+
+**必选参数 :** `uid` : 用户 id
+
+**接口地址 :** `/user/detail`
+
+**调用例子 :** `/user/detail?uid=32953014`
+
+### 获取用户信息 , 歌单,收藏,mv, dj 数量
+
+说明 : 登录后调用此接口 , 可以获取用户信息
+
+**接口地址 :** `/user/subcount`
+
+**调用例子 :** `/user/subcount`
+
+### 更新用户信息
+
+说明 : 登录后调用此接口 , 传入相关信息,可以更新用户信息
+
+**必选参数 :**
+
+```
+gender: 性别 0:保密 1:男性 2:女性
+birthday: 出生日期,时间戳 unix timestamp
+nickname: 用户昵称
+province: 省份id
+city: 城市id
+signature:用户签名
+```
+
+**接口地址 :** `/user/subcount`
+
+**调用例子 :** `/user/update/?gender=0&signature=测试签名&city=440300&nickname=binary&birthday=1525918298004&province=440000`
+
+### 获取用户歌单
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户歌单
+
+**必选参数 :** `uid` : 用户 id
+
+**接口地址 :** `/user/playlist`
+
+**调用例子 :** `/user/playlist?uid=32953014`
+
+返回数据如下图 :
+
+
+### 更新歌单
+
+说明 : 登录后调用此接口,可以更新用户歌单
+参数:
+
+```
+id:歌单id
+name:歌单名字
+desc:歌单描述
+tags:歌单tag
+```
+
+**接口地址 :** `/playlist/update`
+
+**调用例子 :** `/playlist/update/?id=24381616&name=新歌单&desc=描述&tags=学习`
+
+### 发送私信
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息, 可以发送私信,返回内容为历史私信,包含带歌单的私信信息(注:不能发送私信给自己)
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/text`
+
+**调用例子 :** `/send/text?user_ids=32953014&msg=test`,`/send/text?user_ids=32953014,475625142&msg=test`
+返回数据如下图:
+
+
+### 发送私信(带歌单)
+
+说明 : 登录后调用此接口 , 传入用户 id 和要发送的信息和歌单 id, 可以发送带歌单的私信(注:不能发送重复的歌单)
+
+**必选参数 :**
+
+`user_ids` : 用户 id,多个需用逗号隔开
+
+`msg` : 要发送的信息
+
+**接口地址 :** `/send/playlist`
+
+**调用例子 :** `/send/playlist?msg=test&user_ids=475625142&playlist=705123491`,`/send/playlist?msg=test2&user_ids=475625142,32953014&playlist=705123493`
+返回数据如下图:
+
+
+### 获取用户电台
+
+说明 : 登录后调用此接口 , 传入用户 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`
+
+### 获取用户粉丝列表
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户粉丝列表
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/user/followeds`
+
+**调用例子 :** `/user/followeds?uid=32953014`
+
+### 获取用户动态
+
+说明 : 登录后调用此接口 , 传入用户 id, 可以获取用户动态
+
+**必选参数 :** `uid` : 用户 id
+
+**接口地址 :** `/user/event`
+
+**调用例子 :** `/user/event?uid=32953014`
+
+### 获取用户播放记录
+
+说明 : 登录后调用此接口 , 传入用户 id, 可获取用户播放记录
+
+**必选参数 :** `uid` : 用户 id
+
+**可选参数 :** `type` : type=1 时只返回 weekData, type=0 时返回 allData
+
+**接口地址 :** `/user/record`
+
+**调用例子 :** `/user/record?uid=32953014&type=1`
+
+### 获取动态消息
+
+说明 : 调用此接口 , 可获取各种动态 , 对应网页版网易云,朋友界面里的各种动态消息
+,如分享的视频,音乐,照片等!
+
+**必选参数 :** 未知
+
+**接口地址 :** `/event`
+
+**调用例子 :** `/event`
+
+### 歌手分类列表
+
+说明 : 调用此接口,可获取歌手分类列表
+**必选参数 :** `cat` : 即 category Code,歌手类型,默认 1001,返回华语男歌手数据
+**可选参数 :**
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+`initial`: 按首字母索引查找参数,如 `/artist/list?cat=1001&initial=b` 返回内容将以 name 字段开头为 b 或者拼音开头为 b 为顺序排列
+
+category Code 取值:
+
+```
+入驻歌手 5001
+华语男歌手 1001
+华语女歌手 1002
+华语组合/乐队 1003
+欧美男歌手 2001
+欧美女歌手 2002
+欧美组合/乐队 2003
+日本男歌手 6001
+日本女歌手 6002
+日本组合/乐队 6003
+韩国男歌手 7001
+韩国女歌手 7002
+韩国组合/乐队 7003
+其他男歌手 4001
+其他女歌手 4002
+其他组合/乐队 4003
+```
+
+**接口地址 :** `/artist/list`
+
+**调用例子 :** `/artist/list?cat=1001`
+
+返回数据如下图:
+
+
+### 收藏歌手
+
+说明 : 调用此接口,可收藏歌手
+**必选参数 :** `artistId` : 歌手 id
+
+**接口地址 :** `/artist/sub`
+
+**调用例子 :** `/artist/sub?id=6452`
+
+### 取消收藏歌手
+
+说明 : 调用此接口,可取消收藏歌手
+**必选参数 :** `artistId` : 歌手 id
+
+**接口地址 :** `/artist/unsub`
+
+**调用例子 :** `/artist/unsub?id=6452`
+
+### 收藏的歌手列表
+
+说明 : 调用此接口,可获取收藏的歌手列表
+
+**接口地址 :** `/artist/sublist`
+
+**调用例子 :** `/artist/sublist`
+
+### 歌单分类
+
+说明 : 调用此接口,可获取歌单分类,包含 category 信息
+
+**接口地址 :** `/playlist/catlist`
+
+**调用例子 :** `/playlist/catlist`
+
+### 热门歌单分类
+
+说明 : 调用此接口,可获取歌单分类,包含 category 信息
+
+**接口地址 :** `/playlist/hot`
+
+**调用例子 :** `/playlist/hot`
+
+### 歌单 ( 网友精选碟 )
+
+说明 : 调用此接口 , 可获取网友精选碟歌单
+
+**可选参数 :** `order`: 可选值为 'new' 和 'hot', 分别对应最新和最热 , 默认为
+'hot'
+
+`cat`:`cat`: tag, 比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为
+"全部",可从歌单分类接口获取(/playlist/catlist)
+
+**接口地址 :** `/top/playlist`
+
+**调用例子 :** `/top/playlist?limit=10&order=new`
+
+返回数据如下图 :
+
+
+
+
+
+### 获取精品歌单
+
+说明 : 调用此接口 , 可获取精品歌单
+
+**可选参数 :** `cat`: tag, 比如 " 华语 "、" 古风 " 、" 欧美 "、" 流行 ", 默认为
+"全部",可从歌单分类接口获取(/playlist/catlist)
+
+`limit`: 取出歌单数量 , 默认为 20
+
+**接口地址 :** `/top/playlist/highquality`
+
+**调用例子 :** `/top/playlist/highquality?limit=30`
+
+### 相关歌单推荐
+
+说明 : 调用此接口,传入歌单 id 可获取相关歌单(对应页面 [https://music.163.com/#/playlist?id=1](https://music.163.com/#/playlist?id=1))
+
+**必选参数 :** `id` : 歌单 id
+
+**接口地址 :** `/related/playlist`
+
+**调用例子 :** `/related/playlist?id=1`
+
+
+### 获取歌单详情
+
+说明 : 歌单能看到歌单名字 , 但看不到具体歌单内容 , 调用此接口 , 传入歌单 id, 可
+以获取对应歌单内的所有的音乐
+
+**必选参数 :** `id` : 歌单 id
+
+**可选参数 :** `s` : 歌单最近的 s 个收藏者
+
+**接口地址 :** `/playlist/detail`
+
+**调用例子 :** `/playlist/detail?id=24381616`
+
+返回数据如下图 :
+
+
+### 获取音乐 url
+
+说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口
+, 传入的音乐 id( 可多个 , 用逗号隔开 ), 可以获取对应的音乐的 url( 不需要登录 )
+
+> 注 : 部分用户反馈获取的 url 会 403,[hwaphon](https://github.com/hwaphon)找到的
+> 解决方案是当获取到音乐的 id 后,将
+> https://music.163.com/song/media/outer/url?id=id.mp3 以 src 赋予 Audio 即可播放
+
+**必选参数 :** `id` : 音乐 id
+
+**可选参数 :** `br`: 码率,默认设置了 999000 即最大码率,如果要 320k 则可设置为 320000,其他类推
+
+**接口地址 :** `/music/url`
+
+**调用例子 :** `/music/url?id=33894312` `/music/url?id=405998841,33894312`
+
+返回数据如下图 :
+
+
+### 音乐是否可用
+
+说明: 调用此接口,传入歌曲 id, 可获取音乐是否可用,返回 `{ success: true, message: 'ok' }` 或者 `{ success: false, message: '亲爱的,暂无版权' }`
+
+**必选参数 :** `id` : 歌曲 id
+
+**可选参数** : `br`: 码率,默认设置了 999000 即最大码率,如果要 320k 则可设置为 320000,其他类推
+
+**接口地址 :** `/check/music`
+
+**调用例子 :** `/check/music?id=33894312`
+
+### 搜索
+
+说明 : 调用此接口 , 传入搜索关键词可以搜索该音乐 / 专辑 / 歌手 / 歌单 / 用户 ,
+关键词可以多个 , 以空格隔开 , 如 " 周杰伦 搁浅 "( 不需要登录 ), 搜索获取的
+mp3url 不能直接用 , 可通过 `/music/url` 接口传入歌曲 id 获取具体的播放链接
+
+**必选参数 :** `keywords` : 关键词
+
+**可选参数 :** `limit` : 返回数量 , 默认为 30 `offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`type`: 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲, 10: 专辑, 100: 歌手, 1000:
+歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频
+
+**接口地址 :** `/search`
+
+**调用例子 :** `/search?keywords= 海阔天空`
+
+返回数据如下图 :
+
+
+### 热搜
+
+说明 : 调用此接口,可获取热门搜索列表
+
+**接口地址 :** `/search/hot`
+
+**调用例子 :** `/search/hot`
+
+### 搜索建议
+
+说明 : 调用此接口 , 传入搜索关键词可获得搜索建议 , 搜索结果同时包含单曲 , 歌手 ,
+歌单 ,mv 信息
+
+**必选参数 :** `keywords` : 关键词
+
+**可选参数 :**
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+`type`: 搜索类型;默认为 1 即单曲 , 取值意义 : 1: 单曲 10: 专辑 100: 歌手 1000:
+歌单 1002: 用户 1004: MV 1006: 歌词 1009: 电台
+
+**接口地址 :** `/search/suggest`
+
+**调用例子 :** `/search/suggest?keywords= 海阔天空`
+
+### 搜索多重匹配
+
+说明 : 调用此接口 , 传入搜索关键词可获得搜索结果
+
+**必选参数 :** `keywords` : 关键词
+
+**接口地址 :** `/search/multimatch`
+
+**调用例子 :** `/search/multimatch?keywords= 海阔天空`
+
+### 新建歌单
+
+说明 : 调用此接口 , 传入歌单名字可新建歌单
+
+**必选参数 :** `name` : 歌单名
+
+**接口地址 :** `/playlist/create`
+
+**调用例子 :** `/playlist/create?name=测试歌单`
+
+返回数据如下图:
+
+
+### 收藏/取消收藏歌单
+
+说明 : 调用此接口 , 传入类型和歌单 id 可收藏歌单或者取消收藏歌单
+
+**必选参数 :**
+`t` : 类型,1:收藏,2:取消收藏
+`id` : 歌单 id
+
+**接口地址 :** `/playlist/subscribe`
+
+**调用例子 :** `/playlist/subscribe?t=1&id=106697785` `/playlist/subscribe?t=2&id=106697785`
+
+返回数据如下图:
+
+
+### 对歌单添加或删除歌曲
+
+说明 : 调用此接口 , 可以添加歌曲到歌单或者从歌单删除某首歌曲 ( 需要登录 )
+
+**必选参数 :**
+`op`: 从歌单增加单曲为 add, 删除为 del
+
+`pid`: 歌单 id
+`tracks`: 歌曲 id,可多个,用逗号隔开
+
+**接口地址 :** `/playlist/tracks`
+
+**调用例子 :** `/playlist/tracks?op=add&pid=24381616&tracks=347231` ( 对应把歌曲添加到 ' 我 ' 的歌单 , 测试的时候请把这里的 pid 换成你自己的, id 和 tracks 不对可能会报 502 错误)
+
+### 获取歌词
+
+说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 )
+
+**必选参数 :** `id`: 音乐 id
+
+**接口地址 :** `/lyric`
+
+**调用例子 :** `/lyric?id=33894312`
+
+返回数据如下图 :
+
+
+### 歌曲评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该音乐的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: 音乐 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/music`
+
+**调用例子 :** `/comment/music?id=186016&limit=1` 对应晴天评论
+
+返回数据如下图 :
+
+
+### 专辑评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该专辑的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: 专辑 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/album`
+
+**调用例子 :** `/comment/album?id=32311`
+
+### 歌单评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该歌单的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: 歌单 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/playlist`
+
+**调用例子 :** `/comment/playlist?id=705123491`
+
+### mv 评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 mv 的所有评论 ( 不需要
+登录 )
+
+**必选参数 :** `id`: mv id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/mv`
+
+**调用例子 :** `/comment/mv?id=5436712`
+
+### 电台节目评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 电台节目 的所有评论 (
+不需要登录 )
+
+**必选参数 :** `id`: 电台节目的 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/dj`
+
+**调用例子 :** `/comment/dj?id=794062371`
+
+### 视频评论
+
+说明 : 调用此接口 , 传入音乐 id 和 limit 参数 , 可获得该 视频 的所有评论 (
+不需要登录 )
+
+**必选参数 :** `id`: 视频的 id
+
+**可选参数 :** `limit`: 取出评论数量 , 默认为 20
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 评论页数 -1)\*20, 其中 20 为 limit 的值
+
+**接口地址 :** `/comment/video`
+
+**调用例子 :** `/comment/video?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+### 热门评论
+
+说明 : 调用此接口 , 传入 type, 资源 id 可获得对应资源热门评论 ( 不需要登录 )
+
+**必选参数 :**
+
+`id` : 资源 id
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+1: mv
+2: 歌单
+3: 专辑
+4: 电台
+5: 视频
+```
+
+**接口地址 :** `/comment/hot`
+
+**调用例子 :** `/comment/hot?id=186016&type=0`
+
+### 给评论点赞
+
+说明 : 调用此接口 , 传入 type, 资源 id, 和评论 id cid 和 是否点赞参数 t 即可给对
+应评论点赞 ( 需要登录 )
+
+**必选参数 :** `id` : 资源 id, 如歌曲 id,mv id
+
+`cid` : 评论 id
+
+`t` : 是否点赞 ,1 为点赞 ,0 为取消点赞
+
+`type`: 数字 , 资源类型 , 对应歌曲 , mv, 专辑 , 歌单 , 电台, 视频对应以下类型
+
+```
+0: 歌曲
+1: mv
+2: 歌单
+3: 专辑
+4: 电台
+5: 视频
+```
+
+**接口地址 :** `comment/like`
+
+**调用例子 :** `/comment/like?id=29178366&cid=12840183&t=1&type=0` 对应给 [https://music.163.com/#/song?id=29178366](https://music.163.com/#/song?id=29178366) 最热门的评论点赞
+
+### 发送/删除评论
+
+说明 : 调用此接口,可发送评论或者删除评论
+
+**接口地址 :** `/comment`
+
+1. 发送评论
+
+ **必选参数**
+ `action`:1 发送
+
+ `type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
+
+ ```
+ 0: 歌曲
+ 1: mv
+ 2: 歌单
+ 3: 专辑
+ 4: 电台
+ 5: 视频
+ ```
+
+ `id`:对应资源 id
+
+ `content` :要发送的内容
+
+ **调用例子** : `/comment?action=1&type=1&id=5436712&content=test` (往广岛之恋 mv 发送评论: test)
+
+2. 删除评论
+
+ **必选参数**
+ `action`:0 删除
+
+ `type`: 数字,资源类型,对应歌曲,mv,专辑,歌单,电台,视频对应以下类型
+
+ ```
+ 0: 歌曲
+ 1: mv
+ 2: 歌单
+ 3: 专辑
+ 4: 电台
+ 5: 视频
+ ```
+
+ `id`:对应资源 id
+ `content` :内容 id,可通过 `/comment/mv` 等接口获取
+
+ **调用例子** : `/comment?action=0&type=1&id=5436712&commentId=1535550516319` (在广岛之恋 mv 删除评论)
+
+### banner
+
+说明 : 调用此接口 , 可获取 banner( 轮播图 ) 数据注 : 因参数未知 , 只能获取比较旧
+的数据 , 如果有知道参数的小伙伴 , 可提交 PR
+
+**接口地址 :** `/banner`
+
+**调用例子 :** `/banner`
+
+### 获取歌曲详情
+
+说明 : 调用此接口 , 传入音乐 id, 可获得歌曲详情(注意:歌曲封面现在需要通过专辑内容接口获取)
+
+**必选参数 :** `ids`: 音乐 id, 如 `ids=347230`
+
+**接口地址 :** `/song/detail`
+
+**调用例子 :** `/song/detail?ids=347230`
+
+返回数据如下图 :
+
+
+### 获取专辑内容
+
+说明 : 调用此接口 , 传入专辑 id, 可获得专辑内容
+
+**必选参数 :** `id`: 专辑 id
+
+**接口地址 :** `/album`
+
+**调用例子 :** `/album?id=32311`
+
+返回数据如下图 :
+
+
+### 获取歌手单曲
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手部分信息和热门歌曲
+
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
+
+**接口地址 :** `/artists`
+
+**调用例子 :** `/artists?id=6452`
+
+返回数据如下图 :
+
+
+### 获取歌手 mv
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手 mv 信息 , 具体 mv 播放地址可调
+用`/mv`传入此接口获得的 mvid 来拿到 , 如 :
+`/artist/mv?id=6452`,`/mv?mvid=5461064`
+
+**必选参数 :** `id`: 歌手 id, 可由搜索接口获得
+
+**接口地址 :** `/artist/mv`
+
+**调用例子 :** `/artist/mv?id=6452`
+
+### 获取歌手专辑
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手专辑内容
+
+**必选参数 :** `id`: 歌手 id
+
+**可选参数 :** `limit`: 取出数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/artist/album`
+
+**调用例子 :** `/artist/album?id=6452&limit=30` ( 周杰伦 )
+
+返回数据如下图 :
+
+
+### 获取歌手描述
+
+说明 : 调用此接口 , 传入歌手 id, 可获得歌手描述
+
+**必选参数 :** `id`: 歌手 id
+
+**接口地址 :** `/artist/desc`
+
+**调用例子 :** `/artist/desc?id=6452` ( 周杰伦 )
+
+### 获取相似歌手
+
+说明 : 调用此接口 , 传入歌手 id, 可获得相似歌手
+
+**必选参数 :** `id`: 歌手 id
+
+**接口地址 :** `/simi/artist`
+
+**调用例子 :** `/simi/artist?id=6452` ( 对应和周杰伦相似歌手 )
+
+### 获取相似歌单
+
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌单
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/playlist`
+
+**调用例子 :** `/simi/playlist?id=347230` ( 对应 ' 光辉岁月 ' 相似歌单 )
+
+### 相似 mv
+
+说明 : 调用此接口 , 传入 `mvid` 可获取相似 mv
+
+**必选参数 :** `mvid`: mv id
+
+**接口地址 :** `/simi/mv`
+
+**调用例子 :** `/simi/mv?mvid=5436712`
+
+### 获取相似音乐
+
+说明 : 调用此接口 , 传入歌曲 id, 可获得相似歌曲
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/song`
+
+**调用例子 :** `/simi/song?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
+
+### 获取最近 5 个听了这首歌的用户
+
+说明 : 调用此接口 , 传入歌曲 id, 最近 5 个听了这首歌的用户
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/simi/user`
+
+**调用例子 :** `/simi/user?id=347230` ( 对应 ' 光辉岁月 ' 相似歌曲 )
+
+### 获取每日推荐歌单
+
+说明 : 调用此接口 , 可获得每日推荐歌单 ( 需要登录 )
+
+**接口地址 :** `/recommend/resource`
+
+**调用例子 :** `/recommend/resource`
+
+返回数据如下图 :
+
+
+### 获取每日推荐歌曲
+
+说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 )
+
+**接口地址 :** `/recommend/songs`
+
+**调用例子 :** `/recommend/songs`
+
+返回数据如下图 :
+
+
+### 私人 FM
+
+说明 : 私人 FM( 需要登录 )
+
+**接口地址 :** `/personal_fm`
+
+**调用例子 :** `/personal_fm`
+
+返回数据如下图 :
+
+
+
+### 签到
+
+说明 : 调用此接口 , 传入签到类型 ( 可不传 , 默认安卓端签到 ), 可签到 ( 需要登录
+), 其中安卓端签到可获得 3 点经验 , web/PC 端签到可获得 2 点经验
+
+**可选参数 :** `type`: 签到类型 , 默认 0, 其中 0 为安卓端签到 ,1 为 web/PC 签到
+
+**接口地址 :** `/daily_signin`
+
+**调用例子 :** `/daily_signin`
+
+返回数据如下图 :
+
+
+
+
+
+### 喜欢音乐
+
+说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐
+
+**必选参数 :** `id`: 歌曲 id
+
+**可选参数 :** `like`: 布尔值 , 默认为 true 即喜欢 , 若传 false, 则取消喜欢
+
+**接口地址 :** `/like`
+
+**调用例子 :** `/like?id=347230`
+
+返回数据如下图 :
+
+
+
+喜欢成功则返回数据的 code 为 200, 其余为失败
+
+
+
+### 垃圾桶
+
+说明 : 调用此接口 , 传入音乐 id, 可把该音乐从私人 FM 中移除至垃圾桶
+
+**必选参数 :** `id`: 歌曲 id
+
+**接口地址 :** `/fm_trash`
+
+**调用例子 :** `/fm_trash?id=347230`
+
+返回数据如下图 :
+
+
+
+### 新碟上架
+
+说明 : 调用此接口 , 可获取新碟上架列表 , 如需具体音乐信息需要调用获取专辑列表接
+口 `/album` , 然后传入 id, 如 `/album?id=32311&limit=30`
+
+**可选参数 :** `limit`: 取出数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/top/album`
+
+**调用例子 :** `/top/album?offset=0&limit=30`
+
+返回数据如下图 :
+
+
+
+### 热门歌手
+
+说明 : 调用此接口 , 可获取热门歌手数据
+
+**可选参数 :** `limit`: 取出数量 , 默认为 50
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*50, 其中 50 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `/top/artists`
+
+**调用例子 :** `/top/artists?offset=0&limit=30`
+
+返回数据如下图 :
+
+
+
+### 最新 mv
+
+说明 : 调用此接口 , 可获取最新 mv
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+**接口地址 :** `/mv/first`
+
+**调用例子 :** `/mv/first?limit=10`
+
+### 推荐 mv
+
+说明 : 调用此接口 , 可获取推荐 mv
+
+**接口地址 :** `/personalized/mv`
+
+**调用例子 :** `/personalized/mv`
+
+### 推荐歌单
+
+说明 : 调用此接口 , 可获取推荐歌单
+
+**接口地址 :** `/personalized`
+
+**调用例子 :** `/personalized`
+
+### 推荐新音乐
+
+说明 : 调用此接口 , 可获取推荐新音乐
+
+**接口地址 :** `/personalized/newsong`
+
+**调用例子 :** `/personalized/newsong`
+
+### 推荐电台
+
+说明 : 调用此接口 , 可获取推荐电台
+
+**接口地址 :** `/personalized/djprogram`
+
+**调用例子 :** `/personalized/djprogram`
+
+### 推荐节目
+
+说明 : 调用此接口 , 可获取推荐电台
+
+**接口地址 :** `/program/recommend`
+
+**调用例子 :** `/program/recommend`
+
+### 独家放送
+
+说明 : 调用此接口 , 可获取独家放送
+
+**接口地址 :** `/personalized/privatecontent`
+
+**调用例子 :** `/personalized/privatecontent`
+
+### mv 排行
+
+说明 : 调用此接口 , 可获取 mv 排行
+
+**可选参数 :** `limit`: 取出数量 , 默认为 30
+
+`offset`: 偏移数量 , 用于分页 , 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认
+为 0
+
+**接口地址 :** `top/mv`
+
+**调用例子 :** `top/mv?limit=10`
+
+### 获取 mv 数据
+
+说明 : 调用此接口 , 传入 mvid ( 在搜索音乐的时候传 type=1004 获得 ) , 可获取对应
+MV 数据 , 数据包含 mv 名字 , 歌手 , 发布时间 , mv 视频地址等数据 , 其中 mv 视频
+网易做了防盗链处理 , 可能不能直接播放 , 需要播放的话需要调用 ' 播放 mv/视频' 接口
+
+**必选参数 :** `mvid`: mv 的 id
+
+**接口地址 :** `/mv`
+
+**调用例子 :** `/mv?mvid=5436712`
+
+返回数据如下图 :
+
+
+
+### 获取视频数据
+
+说明 : 调用此接口 , 传入视频的 id ( 在搜索音乐的时候传 type=1014 获得 ) , 可获取对应
+视频数据,其中视频网易做了防盗链处理 , 可能不能直接播放 , 需要播放的话需要调用 ' 播放 mv/视频' 接口
+
+**必选参数 :** `id`: 视频 的 id
+
+**接口地址 :** `/video`
+
+**调用例子 :** `/video?id=89ADDE33C0AAE8EC14B99F6750DB954D`
+
+返回数据如下图 :
+
+
+
+### 播放 mv/视频
+
+说明 : 调用此接口 , 传入 mv/视频 地址 , 可播放 mv/视频, 也可将接口嵌入 video 标签使用 , 由
+于使用了 'pipe', 进度条无法通过拖动进度条控制进度 , 如有解决方案可提出 PR 或者自
+行改造
+
+**可选参数 :** `url`: mv/视频 的 地址
+
+**接口地址 :** `/mv/url`
+
+**调用例子 :**
+`/mv/url?url=http://v4.music.126.net/20170422034915/c98eab2f5e2c85fc8de2ab3f0f8ed1c6/web/cloudmusic/MjQ3NDQ3MjUw/89a6a279dc2acfcd068b45ce72b1f560/533e4183a709699d566180ed0cd9abe9.mp4`
+
+如下图 :
+
+
+
+### 排行榜
+
+说明 : 调用此接口 , 传入数字 idx, 可获取不同排行榜
+
+**必选参数 :** `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排行榜,
+"21": Beatport全球电子舞曲榜,
+"22": 云音乐ACG音乐榜,
+"23": 云音乐嘻哈榜
+```
+
+**接口地址 :** `/top/list`
+
+**调用例子 :** `/top/list?idx=6`
+
+返回数据如下图 :
+
+
+
+### 歌手榜
+
+说明 : 调用此接口 , 可获取 PC 版排行榜中的歌手榜
+
+**接口地址 :** `/toplist/artist`
+
+**调用例子 :** `/toplist/artist`
+
+### 云盘
+
+说明 : 登录后调用此接口 , 可获取云盘数据 , 获取的数据没有对应 url, 需要再调用一
+次 `/music/url` 获取 url
+
+**接口地址 :** `/user/cloud`
+
+**调用例子 :** `/user/cloud`
+
+### 电台 - 推荐
+
+说明 : 登录后调用此接口 , 可获得推荐电台
+
+**接口地址 :** `/dj/recommend`
+
+**调用例子 :** `/dj/recommend`
+
+### 电台 - 分类
+
+说明 : 登录后调用此接口 , 可获得电台类型
+
+**接口地址 :** `/dj/catelist`
+
+**调用例子 :** `/dj/catelist`
+
+### 电台 - 分类推荐
+
+说明 : 登录后调用此接口 , 可获得推荐电台
+
+**必选参数 :** `type`: 电台类型 , 数字 , 可通过`/dj/catelist`获取 , 对应关系为
+id 对应 此接口的 type, name 对应类型意义
+
+**接口地址 :** `/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?rid=336355127&t=1` ( 对应关注 ' 代码时间 ')
+`/dj/sub?rid=336355127&t=0` ( 对应取消关注 ' 代码时间 ')
+
+### 电台的订阅列表
+
+说明 : 登录后调用此接口 , 可获取订阅的电台列表
+
+**接口地址 :** `/dj/sublist`
+
+**调用例子 :** `/dj/sublist`
+
+### 电台 - 付费精选
+
+说明 : 可以获取付费精选的电台列表 , 传入 `limit` 和 `offset` 可以进行分页
+
+**接口地址 :** `/dj/paygift`
+
+**调用例子 :** `/dj/paygift?limit=10&offset=20`
+
+### 电台 - 详情
+
+说明 : 登录后调用此接口 , 传入`rid`, 可获得对应电台的详情介绍
+
+**必选参数 :** `rid`: 电台 的 id
+
+**接口地址 :** `/dj/detail?rid=336355127`
+
+**调用例子 :** `/dj/detail?rid=336355127` ( 对应 ' 代码时间 ' 的详情介绍 )
+
+### 电台 - 节目
+
+说明 : 登录后调用此接口 , 传入`rid`, 可查看对应电台的电台节目以及对应的 id, 需要
+注意的是这个接口返回的 mp3Url 已经无效 , 都为 null, 但是通过调用 `/music/url` 这
+个接口 , 传入节目 id 仍然能获取到节目音频 , 如 `/music/url?id=478446370` 获取代
+码时间的一个节目的音频
+
+**必选参数 :** `rid`: 电台 的 id
+
+**可选参数 :**
+`limit` : 返回数量 , 默认为 30
+
+`offset` : 偏移数量,用于分页 , 如
+: 如 :( 页数 -1)\*30, 其中 30 为 limit 的值 , 默认为 0
+
+**接口地址 :** `/dj/program`
+
+**调用例子 :** `/dj/program?rid=336355127&limit=40` ( 对应 ' 代码时间 ' 的节目列表 )
+
+## 离线访问此文档
+
+此文档同时也是 Progressive Web Apps(PWA), 加入了 serviceWorker, 可离线访问
+
+## 关于此文档
+
+此文档由 [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/examples/get_static_moddef.js b/examples/get_static_moddef.js
new file mode 100644
index 0000000..f430aed
--- /dev/null
+++ b/examples/get_static_moddef.js
@@ -0,0 +1,22 @@
+const fsPromises = require('fs/promises')
+const path = require('path')
+const server = require('../server')
+
+const exportFile = path.join(__dirname, 'moddef.json')
+
+async function main() {
+ const def = await server.getModulesDefinitions(
+ path.join(__dirname, '..', 'module'),
+ {
+ 'daily_signin.js': '/daily_signin',
+ 'fm_trash.js': '/fm_trash',
+ 'personal_fm.js': '/personal_fm',
+ },
+ false,
+ )
+
+ fsPromises.writeFile(exportFile, JSON.stringify(def, null, 4))
+ console.log(`👍 Get your own definition at: ${exportFile}`)
+}
+
+main()
diff --git a/generateConfig.js b/generateConfig.js
new file mode 100644
index 0000000..b1d3a95
--- /dev/null
+++ b/generateConfig.js
@@ -0,0 +1,24 @@
+const fs = require('fs')
+const { register_anonimous } = require('./main')
+const { cookieToJson } = require('./util/index')
+const config = require('./util/config.json')
+const path = require('path')
+async function generateConfig() {
+ try {
+ const res = await register_anonimous()
+ const cookie = res.body.cookie
+ if (cookie) {
+ const cookieObj = cookieToJson(cookie)
+ let newConfig = { ...config }
+ newConfig.anonymous_token = cookieObj.MUSIC_A
+ fs.writeFileSync(
+ path.resolve(__dirname, 'util/config.json'),
+ JSON.stringify(newConfig, null, 2),
+ 'utf-8',
+ )
+ }
+ } catch (error) {
+ console.log(error)
+ }
+}
+module.exports = generateConfig
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..39d0ba3
--- /dev/null
+++ b/index.js
@@ -0,0 +1 @@
+require('./app.js')
diff --git a/interface.d.ts b/interface.d.ts
new file mode 100644
index 0000000..ef35640
--- /dev/null
+++ b/interface.d.ts
@@ -0,0 +1,1625 @@
+export interface RequestBaseConfig {
+ cookie?: string
+ realIP?: string // IPv4/IPv6 filled in X-Real-IP
+ proxy?: string // HTTP proxy
+}
+
+export interface MultiPageConfig {
+ limit?: string | number
+ offset?: string | number
+}
+
+export interface ImageUploadConfig {
+ imgFile: {
+ name: string
+ data: string | Buffer
+ }
+ imgSize?: number
+ imgX?: number
+ imgY?: number
+}
+
+export interface APIBaseResponse {
+ code: number
+ cookie: string
+ [index: string]: unknown
+}
+
+export interface Response {
+ status: number // The Http Response Code
+ body: APIBaseResponse // API Response body
+ cookie: string[]
+}
+
+export const enum SubAction {
+ sub = 1,
+ unsub = 0,
+}
+
+export function activate_init_profile(
+ params: { nickname: string } & RequestBaseConfig,
+): Promise
+
+export function album(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function album_detail(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function album_detail_dynamic(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export const enum AlbumListArea {
+ all = 'ALL',
+ zh = 'ZH',
+ ea = 'EA',
+ kr = 'KR',
+ jp = 'JP',
+}
+
+export const enum ListOrder {
+ hot = 'hot',
+ new = 'new',
+}
+
+export function album_list(
+ params: { area?: AlbumListArea; type: string } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export const enum AlbumListStyleArea {
+ zh = 'Z_H',
+ ea = 'E_A',
+ kr = 'KR',
+ jp = 'JP',
+}
+
+export function album_list_style(
+ params: { area?: AlbumListStyleArea } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function album_new(
+ params: { area?: AlbumListArea } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function album_newest(params: RequestBaseConfig): Promise
+
+export const enum AlbumSongsaleboardType {
+ daily = 'daily',
+ week = 'week',
+ year = 'year',
+ total = 'total',
+}
+
+export const enum AlbumSongsaleboardAlbumType {
+ album = 0,
+ single = 1,
+}
+
+export function album_songsaleboard(
+ params: {
+ albumType?: AlbumSongsaleboardAlbumType // 0 为数字专辑,1 为数字单曲
+ type?: AlbumSongsaleboardType
+ year?: string | number // 年份,默认本年。 type 为 year 时有效
+ } & RequestBaseConfig,
+): Promise
+
+export function album_sub(
+ params: {
+ id: string | number
+ t: SubAction
+ } & RequestBaseConfig,
+): Promise
+
+export function album_sublist(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function artist_album(
+ params: { id: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function artist_desc(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export const enum ArtistListArea {
+ zh = 'Z_H',
+ ea = 'E_A',
+ kr = 'KR',
+ jp = 'JP',
+}
+
+export const enum ArtistArea {
+ all = '-1',
+ zh = '7',
+ ea = '96',
+ ja = '8',
+ kr = '16',
+ other = '0',
+}
+
+export const enum ArtistType {
+ male = '1',
+ female = '2',
+ band = '3',
+}
+
+export function artist_list(
+ params: {
+ area: ArtistArea
+ initial?:
+ | 'a'
+ | 'b'
+ | 'c'
+ | 'd'
+ | 'e'
+ | 'f'
+ | 'g'
+ | 'h'
+ | 'i'
+ | 'j'
+ | 'k'
+ | 'l'
+ | 'm'
+ | 'n'
+ | 'o'
+ | 'p'
+ | 'q'
+ | 'r'
+ | 's'
+ | 't'
+ | 'u'
+ | 'v'
+ | 'w'
+ | 'x'
+ | 'y'
+ | 'z'
+ | 'A'
+ | 'B'
+ | 'C'
+ | 'D'
+ | 'E'
+ | 'F'
+ | 'G'
+ | 'H'
+ | 'I'
+ | 'J'
+ | 'K'
+ | 'L'
+ | 'M'
+ | 'N'
+ | 'O'
+ | 'P'
+ | 'Q'
+ | 'R'
+ | 'S'
+ | 'T'
+ | 'U'
+ | 'V'
+ | 'W'
+ | 'X'
+ | 'Y'
+ | 'Z'
+ type?: ArtistType
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function artist_mv(
+ params: { id: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export const enum ArtistSongsOrder {
+ hot = 'hot',
+ time = 'time',
+}
+
+export function artist_songs(
+ params: {
+ id: string | number
+ order?: ArtistSongsOrder
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function artist_sub(
+ params: { id: string | number; t: SubAction } & RequestBaseConfig,
+): Promise
+
+export function artist_sublist(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function artist_top_song(
+ params: {
+ id: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function artists(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function avatar_upload(
+ params: ImageUploadConfig & RequestBaseConfig,
+): Promise
+
+export const enum BannerType {
+ pc = 0,
+ android = 1,
+ iphone = 2,
+ ipad = 3,
+}
+
+export function banner(
+ params: { type?: BannerType } & RequestBaseConfig,
+): Promise
+
+export function batch(
+ params: { [index: string]: unknown } & RequestBaseConfig,
+): Promise
+
+export function captcha_sent(
+ params: { cellphone: string; ctcode?: number | string } & RequestBaseConfig,
+): Promise
+
+export function captcha_verify(
+ params: {
+ ctcode?: number | string
+ cellphone: number | string
+ captcha: string
+ } & RequestBaseConfig,
+): Promise
+
+export function cellphone_existence_check(
+ params: {
+ cellphone: number | string
+ countrycode: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function check_music(
+ params: { id: string | number; br: string | number } & RequestBaseConfig,
+): Promise
+
+export const enum SearchType {
+ single = 1,
+ album = 10,
+ artist = 100,
+ playlist = 1000,
+ user = 1002,
+ mv = 1004,
+ lyric = 1006,
+ dj = 1009,
+ video = 1014,
+ complex = 1018,
+}
+
+export function cloudsearch(
+ params: {
+ keywords: string
+ type?: SearchType
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export const enum CommentType {
+ song = 0,
+ mv = 1,
+ playlist = 2,
+ album = 3,
+ dj = 4,
+ video = 5,
+ event = 6,
+}
+
+export const enum CommentAction {
+ add = 1,
+ delete = 0,
+ reply = 2,
+}
+
+export function comment(
+ params: {
+ id: string | number
+ type: CommentType
+ t: CommentAction.delete
+ commentId: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment(
+ params: {
+ type: CommentType.event
+ t: CommentAction.delete
+ threadId: string
+ commentId: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment(
+ params: {
+ id: string | number
+ type: CommentType
+ t: CommentAction.add
+ content: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment(
+ params: {
+ type: CommentType.event
+ t: CommentAction.add
+ threadId: string
+ content: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment(
+ params: {
+ id: string | number
+ type: CommentType
+ t: CommentAction.reply
+ content: string | number
+ commentId: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment(
+ params: {
+ type: CommentType.event
+ t: CommentAction.reply
+ threadId: string
+ content: string | number
+ commentId: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment_album(
+ params: {
+ id: string | number
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_dj(
+ params: {
+ id: string | number
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_event(
+ params: {
+ threadId: string
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_floor(
+ params: {
+ id: string | number
+ parentCommentId: string | number
+ type: CommentType
+ limit?: string | number
+ time?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function comment_hot(
+ params: {
+ id: string | number
+ type: CommentType
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_hotwall_list(
+ params: RequestBaseConfig,
+): Promise
+
+export function comment_like(
+ params: {
+ id: string | number
+ type: CommentType
+ t: SubAction
+ cid: string | number
+ threadId?: string
+ } & RequestBaseConfig,
+): Promise
+
+export function comment_music(
+ params: {
+ id: string | number
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_mv(
+ params: {
+ id: string | number
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_playlist(
+ params: {
+ id: string | number
+
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function comment_video(
+ params: {
+ id: string | number
+ before?: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function countries_code_list(
+ params: RequestBaseConfig,
+): Promise
+
+export const enum DailySigninType {
+ android = 0,
+ pc = 1,
+}
+
+export function daily_signin(
+ params: { type?: DailySigninType } & RequestBaseConfig,
+): Promise
+
+export function digitalAlbum_ordering(
+ params: {
+ payment: string
+ id: string | number
+ quantity: string
+ } & RequestBaseConfig,
+): Promise
+
+export function digitalAlbum_purchased(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_banner(params: RequestBaseConfig): Promise
+
+export function dj_category_excludehot(
+ params: RequestBaseConfig,
+): Promise
+
+export function dj_category_recommend(
+ params: RequestBaseConfig,
+): Promise
+
+export function dj_catelist(params: RequestBaseConfig): Promise
+
+export function dj_detail(
+ params: { rid: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_hot(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_paygift(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_personalize_recommend(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_program(
+ params: {
+ rid: string | number
+ asc: 'true' | 1 | 'false' | 0
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function dj_program_detail(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_program_toplist(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_program_toplist_hours(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_radio_hot(
+ params: {
+ cateId: string | number
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function dj_recommend(params: RequestBaseConfig): Promise
+
+/*
+ 有声书 10001
+ 知识技能 453050
+ 商业财经 453051
+ 人文历史 11
+ 外语世界 13
+ 亲子宝贝 14
+ 创作|翻唱 2001
+ 音乐故事 2
+ 3D|电子 10002
+ 相声曲艺 8
+ 情感调频 3
+ 美文读物 6
+ 脱口秀 5
+ 广播剧 7
+ 二次元 3001
+ 明星做主播 1
+ 娱乐|影视 4
+ 科技科学 453052
+ 校园|教育 4001
+ 旅途|城市 12
+*/
+
+export function dj_recommend_type(
+ params: { type: number } & RequestBaseConfig,
+): Promise
+
+export function dj_sub(
+ params: { t: SubAction; rid: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_sublist(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_today_perfered(
+ params: { page?: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_toplist(
+ params: { type?: ListOrder } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_toplist_hours(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_toplist_newcomer(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function dj_toplist_pay(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function dj_toplist_popular(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function event(
+ params: { pagesize?: number; lasttime?: number } & RequestBaseConfig,
+): Promise
+
+export function event_del(
+ params: { evId: string | number } & RequestBaseConfig,
+): Promise
+
+export function event_forward(
+ params: {
+ forwords: string
+ evId: string | number
+ uid: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function fm_trash(
+ params: { id: string | number; time?: string | number } & RequestBaseConfig,
+): Promise
+
+export function follow(
+ params: { t: SubAction; id: string | number } & RequestBaseConfig,
+): Promise
+
+export function history_recommend_songs(
+ params: RequestBaseConfig,
+): Promise
+
+export function history_recommend_songs_detail(
+ params: { date?: string } & RequestBaseConfig,
+): Promise
+
+export function homepage_block_page(
+ params: {
+ refresh?: 'true' | 'false' | boolean
+ cursor?: string
+ } & RequestBaseConfig,
+): Promise
+
+export function homepage_dragon_ball(
+ params: RequestBaseConfig,
+): Promise
+
+export function hot_topic(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function like(
+ params: {
+ like?: 'true' | 'false' | boolean
+ id: string | number
+ alg?: string
+ time?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function likelist(
+ params: { uid: string | number } & RequestBaseConfig,
+): Promise
+
+export function login(
+ params: { email: string; password: string } & RequestBaseConfig,
+): Promise
+
+export function login(
+ params: { email: string; md5_password: string } & RequestBaseConfig,
+): Promise
+
+export function login_cellphone(
+ params: {
+ phone: number | string
+ countrycode?: number | string
+ password: string
+ } & RequestBaseConfig,
+): Promise
+
+export function login_cellphone(
+ params: {
+ phone: number | string
+ countrycode?: number | string
+ md5_password: string
+ } & RequestBaseConfig,
+): Promise
+
+export function login_cellphone(
+ params: {
+ phone: number | string
+ countrycode?: number | string
+ captcha: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function login_refresh(params: RequestBaseConfig): Promise
+
+export function login_status(params: RequestBaseConfig): Promise
+
+export function logout(params: RequestBaseConfig): Promise
+
+export function lyric(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function msg_comments(
+ params: {
+ uid: string | number
+ before?: string | number
+ limit?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function msg_forwards(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function msg_notices(
+ params: {
+ limit?: string | number
+ lasttime?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function msg_private(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function msg_private_history(
+ params: {
+ before?: string | number
+ limit?: string | number
+ uid: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export const enum MvArea {
+ all = '全部',
+ zh = '内地',
+ hk = '港台',
+ ea = '欧美',
+ kr = '韩国',
+ jp = '日本',
+}
+
+export const enum MvType {
+ all = '全部',
+ offical = '官方版',
+ raw = '原生',
+ live = '现场版',
+ netease = '网易出品',
+}
+
+export const enum MvOrder {
+ trend = '上升最快',
+ hot = '最热',
+ new = '最新',
+}
+
+export function mv_all(
+ params: {
+ area?: MvArea
+ type?: MvType
+ order?: MvOrder
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function mv_detail(
+ params: { mvid?: string | number } & RequestBaseConfig,
+): Promise
+
+export function mv_detail_info(
+ params: { mvid: string | number } & RequestBaseConfig,
+): Promise
+
+export function mv_exclusive_rcmd(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function mv_first(
+ params: { area?: MvArea; limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function mv_sub(
+ params: { t: SubAction; mvid: string | number } & RequestBaseConfig,
+): Promise
+
+export function mv_sublist(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function mv_url(
+ params: { id?: string | number; r?: string | number } & RequestBaseConfig,
+): Promise
+
+export function personal_fm(params: RequestBaseConfig): Promise
+
+export function personalized(
+ params: { limit?: string | number } & RequestBaseConfig,
+): Promise
+
+export function personalized_djprogram(
+ params: RequestBaseConfig,
+): Promise
+
+export function personalized_mv(params: RequestBaseConfig): Promise
+
+export function personalized_newsong(
+ params: {
+ area?: string | number
+ limit?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function personalized_privatecontent(
+ params: RequestBaseConfig,
+): Promise
+
+export function personalized_privatecontent_list(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function playlist_catlist(params: RequestBaseConfig): Promise
+
+export function playlist_cover_update(
+ params: { id: string } & ImageUploadConfig & RequestBaseConfig,
+): Promise
+
+export function playlist_create(
+ params: {
+ name: string
+ privacy: 0 | 10
+ type?: PlaylistType
+ } & RequestBaseConfig,
+): Promise
+
+export function playlist_delete(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function playlist_desc_update(
+ params: { id: string | number; desc: string } & RequestBaseConfig,
+): Promise
+
+export function playlist_detail(
+ params: { id: string | number; s?: string | number } & RequestBaseConfig,
+): Promise
+
+export function playlist_highquality_tags(
+ params: RequestBaseConfig,
+): Promise
+
+export function playlist_hot(params: RequestBaseConfig): Promise
+
+export function playlist_name_update(
+ params: { id: string | number; name: string } & RequestBaseConfig,
+): Promise
+
+export function playlist_order_update(
+ params: { ids: string } & RequestBaseConfig,
+): Promise
+
+export function playlist_subscribe(
+ params: { t: SubAction; id: string | number } & RequestBaseConfig,
+): Promise
+
+export function playlist_subscribers(
+ params: { id?: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function playlist_tags_update(
+ params: { id: string | number; tags: string } & RequestBaseConfig,
+): Promise
+
+export function playlist_tracks(
+ params: {
+ op: 'add' | 'del'
+ pid: string | number
+ tracks: string
+ } & RequestBaseConfig,
+): Promise
+
+export function playlist_update(
+ params: {
+ id: string | number
+ name: string
+ desc?: string
+ tags?: string
+ } & RequestBaseConfig,
+): Promise
+
+export function playmode_intelligence_list(
+ params: {
+ id: string | number
+ pid: string | number
+ sid?: string | number
+ count?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function program_recommend(
+ params: { type: string } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function rebind(
+ params: {
+ captcha: string
+ phone: string
+ oldcaptcha: string
+ ctcode?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function recommend_resource(params: RequestBaseConfig): Promise
+
+export function recommend_songs(params: RequestBaseConfig): Promise
+
+export function register_cellphone(
+ params: {
+ captcha: string
+ phone: string
+ password: string
+ nickname: string
+ } & RequestBaseConfig,
+): Promise
+
+export function related_allvideo(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function related_playlist(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export const enum ResourceType {
+ mv = 1,
+ dj = 4,
+ video = 5,
+ event = 6,
+}
+type PlaylistType = 'NROMAL' | 'VIDEO'
+
+export function resource_like(
+ params: {
+ t: SubAction
+ type: ResourceType
+ id?: string | number
+ threadId?: string
+ } & RequestBaseConfig,
+): Promise
+
+export function scrobble(
+ params: {
+ id: string | number
+ sourceid: string | number
+ time: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function search(
+ params: {
+ keywords: string
+ type?: SearchType
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function search_default(params: RequestBaseConfig): Promise
+
+export function search_hot(params: RequestBaseConfig): Promise
+
+export function search_hot_detail(params: RequestBaseConfig): Promise
+
+export function search_multimatch(
+ params: { type?: number; keywords: string } & RequestBaseConfig,
+): Promise
+
+export const enum SearchSuggestType {
+ mobile = 'mobile',
+ web = 'web',
+}
+
+export function search_suggest(
+ params: { keywords: string; type?: SearchSuggestType } & RequestBaseConfig,
+): Promise
+
+export function send_playlist(
+ params: {
+ playlist: string | number
+ msg: string
+ user_ids: string
+ } & RequestBaseConfig,
+): Promise
+
+export function send_text(
+ params: { msg: string; user_ids: string } & RequestBaseConfig,
+): Promise
+
+export function setting(params: RequestBaseConfig): Promise
+
+export const enum ShareResourceType {
+ song = 'song',
+ playlist = 'playlist',
+ mv = 'mv',
+ djprogram = 'djprogram',
+ djradio = 'djradio',
+}
+
+export function share_resource(
+ params: {
+ type?: ShareResourceType
+ msg?: string
+ id?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function simi_artist(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function simi_mv(
+ params: { mvid: string | number } & RequestBaseConfig,
+): Promise
+
+export function simi_playlist(
+ params: { id: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function simi_song(
+ params: { id: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function simi_user(
+ params: { id: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function song_detail(
+ params: { ids: string } & RequestBaseConfig,
+): Promise
+
+export function song_order_update(
+ params: { pid: string | number; ids: string } & RequestBaseConfig,
+): Promise
+
+export function song_url(
+ params: { id: string | number; br?: string | number } & RequestBaseConfig,
+): Promise
+
+export function top_album(
+ params: {
+ area?: AlbumListArea
+ type?: ListOrder
+ year?: string
+ mouth?: string
+ } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function top_artists(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function top_list(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function top_mv(
+ params: { area?: MvArea } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function top_playlist(
+ params: { cat?: string; order?: ListOrder } & MultiPageConfig &
+ RequestBaseConfig,
+): Promise
+
+export function top_playlist_highquality(
+ params: {
+ cat?: string
+ before?: string | number
+ limit?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export const enum TopSongType {
+ all = 0,
+ zh = 7,
+ ea = 96,
+ kr = 16,
+ ja = 8,
+}
+
+export function top_song(
+ params: { type: TopSongType } & RequestBaseConfig,
+): Promise
+
+export function toplist(params: RequestBaseConfig): Promise
+
+export const enum ToplistArtistType {
+ zh = 1,
+ ea = 2,
+ kr = 3,
+ ja = 4,
+}
+
+export function toplist_artist(
+ params: { type?: ToplistArtistType } & RequestBaseConfig,
+): Promise
+
+export function toplist_detail(params: RequestBaseConfig): Promise
+
+export function user_audio(
+ params: { uid: string | number } & RequestBaseConfig,
+): Promise
+
+export function user_cloud(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function user_cloud_del(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function user_cloud_detail(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function user_detail(
+ params: { uid: string | number } & RequestBaseConfig,
+): Promise
+
+export function user_dj(
+ params: { uid: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function user_event(
+ params: {
+ lasttime?: string | number
+ limit?: string | number
+ uid: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function user_followeds(
+ params: {
+ uid: string | number
+ lasttime?: string | number
+ limit?: string | number
+ } & RequestBaseConfig,
+): Promise
+
+export function user_follows(
+ params: { uid: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function user_level(params: RequestBaseConfig): Promise
+
+export function user_playlist(
+ params: { uid: string | number } & MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export const enum UserRecordType {
+ all = 0,
+ weekly = 1,
+}
+
+export function user_record(
+ params: { uid: string | number; type?: UserRecordType } & RequestBaseConfig,
+): Promise
+
+export function user_subcount(params: RequestBaseConfig): Promise
+
+export function user_update(
+ params: {
+ birthday: string
+ city: string
+ gender: string
+ nickname: string
+ province: string
+ signature: string
+ } & RequestBaseConfig,
+): Promise
+
+export function video_category_list(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function video_detail(
+ params: { id: string } & RequestBaseConfig,
+): Promise
+
+export function video_detail_info(
+ params: { vid: string } & RequestBaseConfig,
+): Promise
+
+export function video_group(
+ params: { id: string; offset?: string | number } & RequestBaseConfig,
+): Promise
+
+export function video_group_list(params: RequestBaseConfig): Promise
+
+export function video_sub(
+ params: { t?: SubAction; id: string } & RequestBaseConfig,
+): Promise
+
+export function video_timeline_all(
+ params: { offset?: string | number } & RequestBaseConfig,
+): Promise
+
+export function video_timeline_recommend(
+ params: { offset?: string | number } & RequestBaseConfig,
+): Promise
+
+export function video_url(
+ params: { id: string | number; res?: number } & RequestBaseConfig,
+): Promise
+
+export function weblog(
+ params: { data?: { [index: string]: unknown } } & RequestBaseConfig,
+): Promise
+
+export function playlist_mylike(
+ params: {
+ time?: number | string
+ limit: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function playlist_track_add(
+ params: { pid?: number | string; ids: number | string } & RequestBaseConfig,
+): Promise
+
+export function playlist_track_delete(
+ params: { pid?: number | string; ids: number | string } & RequestBaseConfig,
+): Promise
+
+export function comment_new(
+ params: {
+ type?: number | string
+ id: number | string
+ pageNo?: number | string
+ pageSize?: number | string
+ sortType?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function calendar(
+ params: {
+ startTime?: number | string
+ endTime: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function playlist_video_recent(
+ params: RequestBaseConfig,
+): Promise
+
+export function user_binding(
+ params: { uid?: number | string } & RequestBaseConfig,
+): Promise
+
+export function user_replacephone(
+ params: {
+ phone: number | string
+ captcha: number | string
+ oldcaptcha: number | string
+ countrycode?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function user_safe(params: RequestBaseConfig): Promise
+
+export function dj_subscriber(
+ params: {
+ id: number | string
+ limit?: number | string
+ time?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function user_account(params: RequestBaseConfig): Promise
+
+export function yunbei(params: RequestBaseConfig): Promise
+
+export function yunbei_info(params: RequestBaseConfig): Promise
+
+export function yunbei_sign(params: RequestBaseConfig): Promise
+
+export function yunbei_receipt(
+ params: {
+ limit?: number | string
+ offset?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function yunbei_expense(
+ params: {
+ limit?: number | string
+ offset?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function yunbei_tasks(params: RequestBaseConfig): Promise
+
+export function yunbei_today(params: RequestBaseConfig): Promise
+
+export function yunbei_tasks_todo(params: RequestBaseConfig): Promise
+
+export function yunbei_task_finish(
+ params: {
+ userTaskId: number | string
+ depositCode?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function msg_recentcontact(params: RequestBaseConfig): Promise
+
+export function hug_comment(
+ params: {
+ uid: number | string
+ cid: number | string
+ sid: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function comment_hug_list(
+ params: {
+ page: number | string
+ cursor: number | string
+ idCursor: number | string
+ pageSize?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function topic_sublist(
+ params: {
+ limit?: number | string
+ offset?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function topic_sublist(
+ params: {
+ limit?: number | string
+ offset?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function artist_new_mv(
+ params: {
+ limit?: number | string
+ startTimestamp?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function artist_new_song(
+ params: {
+ limit?: number | string
+ startTimestamp?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function artist_detail(
+ params: {
+ id: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function cloud(
+ params: {
+ songFile: {
+ name: string
+ data: Buffer
+ }
+ } & RequestBaseConfig,
+): Promise
+
+export function topic_detail(
+ params: {
+ actid?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function topic_detail_event_hot(
+ params: {
+ actid?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function login_qr_key(params: RequestBaseConfig): Promise
+
+export function login_qr_create(
+ params: {
+ key?: number | string
+ qrimg?: boolean | string
+ } & RequestBaseConfig,
+): Promise
+
+export function login_qr_check(
+ params: {
+ key?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function playlist_detail_dynamic(
+ params: { id: string | number } & RequestBaseConfig,
+): Promise
+
+export function user_bindingcellphone(
+ params: {
+ phone: number | string
+ captcha: number | string
+ countrycode?: number | string
+ password?: string
+ } & RequestBaseConfig,
+): Promise
+
+export function listen_together_status(
+ params: RequestBaseConfig,
+): Promise
+
+export function user_comment_history(
+ params: {
+ limit?: number | string
+ uid: number | string
+ time?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function cloud_match(
+ params: {
+ uid: number | string
+ sid: number | string
+ asid: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function yunbei_rcmd_song(
+ params: {
+ id: number | string
+ reason?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function yunbei_rcmd_song_history(
+ params: {
+ size?: number | string
+ cursor?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function song_purchased(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function mlog_url(
+ params: {
+ id?: number | string
+ res?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function mlog_to_video(
+ params: {
+ id?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function vip_growthpoint(params: RequestBaseConfig): Promise
+
+export function vip_growthpoint_details(
+ params: MultiPageConfig & RequestBaseConfig,
+): Promise
+
+export function vip_tasks(params: RequestBaseConfig): Promise
+
+export function vip_growthpoint_get(
+ params: {
+ ids?: number | string
+ } & RequestBaseConfig,
+): Promise
+
+export function artist_fans(
+ params: {
+ id: number | string
+ limit?: number | string
+ offset?: number | string
+ } & RequestBaseConfig,
+): Promise