From 0d3df4a1e4f44adafe8a52b81623bf3e34c22262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=AF=E8=99=B9=E5=B7=9D=E9=A3=B4?= Date: Mon, 6 Dec 2021 18:27:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20issues=20#1019=20?= =?UTF-8?q?=E7=9A=84=E8=B7=9F=E8=BF=9B=E9=97=AE=E9=A2=98=20(#1068)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * issues #1019 的迫真修复 * 修复 issues #1019 * 修复 issues #1019 * 改回 pickedLyric() 逻辑 * 更进一步的避免取词卡死问题 * 更新网易云 api 到 4.2.0 * Update README.md * Revert "Update README.md" This reverts commit b862ef7d4dabd40c8fe57e4837fc6220806a1456. --- netease_api/module/artist_video.js | 24 ++++++++ netease_api/module/comment.js | 36 ------------ netease_api/module/comment_album.js | 22 ------- netease_api/module/comment_dj.js | 22 ------- netease_api/module/comment_floor.js | 21 ------- netease_api/module/comment_hot.js | 24 -------- netease_api/module/comment_hug_list.js | 27 --------- netease_api/module/comment_like.js | 26 --------- netease_api/module/comment_music.js | 22 ------- netease_api/module/comment_mv.js | 22 ------- netease_api/module/comment_new.js | 31 ---------- netease_api/module/comment_playlist.js | 22 ------- netease_api/module/comment_video.js | 22 ------- netease_api/module/playlist_create.js | 2 +- netease_api/module/playlist_track_all.js | 47 +++++++++++++++ ...omment_event.js => record_recent_album.js} | 8 +-- ...{share_resource.js => record_recent_dj.js} | 8 +-- netease_api/module/record_recent_playlist.js | 16 +++++ netease_api/module/record_recent_song.js | 16 +++++ netease_api/module/record_recent_video.js | 16 +++++ netease_api/module/record_recent_voice.js | 16 +++++ netease_api/module/song_download_url.js | 20 +++++++ netease_api/package.json | 2 +- netease_api/public/home.html | 58 +++++++++++++++++++ netease_api/public/login.html | 47 +++++++++++++++ netease_api/test/login.test.js | 7 ++- netease_api/util/request.js | 16 +++-- src/views/library.vue | 3 + 28 files changed, 286 insertions(+), 317 deletions(-) create mode 100644 netease_api/module/artist_video.js delete mode 100644 netease_api/module/comment.js delete mode 100644 netease_api/module/comment_album.js delete mode 100644 netease_api/module/comment_dj.js delete mode 100644 netease_api/module/comment_floor.js delete mode 100644 netease_api/module/comment_hot.js delete mode 100644 netease_api/module/comment_hug_list.js delete mode 100644 netease_api/module/comment_like.js delete mode 100644 netease_api/module/comment_music.js delete mode 100644 netease_api/module/comment_mv.js delete mode 100644 netease_api/module/comment_new.js delete mode 100644 netease_api/module/comment_playlist.js delete mode 100644 netease_api/module/comment_video.js create mode 100644 netease_api/module/playlist_track_all.js rename netease_api/module/{comment_event.js => record_recent_album.js} (53%) rename netease_api/module/{share_resource.js => record_recent_dj.js} (52%) create mode 100644 netease_api/module/record_recent_playlist.js create mode 100644 netease_api/module/record_recent_song.js create mode 100644 netease_api/module/record_recent_video.js create mode 100644 netease_api/module/record_recent_voice.js create mode 100644 netease_api/module/song_download_url.js create mode 100644 netease_api/public/home.html create mode 100644 netease_api/public/login.html diff --git a/netease_api/module/artist_video.js b/netease_api/module/artist_video.js new file mode 100644 index 0000000..735fe07 --- /dev/null +++ b/netease_api/module/artist_video.js @@ -0,0 +1,24 @@ +// 歌手相关视频 + +module.exports = (query, request) => { + const data = { + artistId: query.id, + page: JSON.stringify({ + size: query.size || 10, + cursor: query.cursor || 0, + }), + tab: 0, + order: query.order || 0, + } + return request( + 'POST', + `https://music.163.com/weapi/mlog/artist/video`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) +} diff --git a/netease_api/module/comment.js b/netease_api/module/comment.js deleted file mode 100644 index 9395bf3..0000000 --- a/netease_api/module/comment.js +++ /dev/null @@ -1,36 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -// 发送与删除评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - query.t = { - 1: 'add', - 0: 'delete', - 2: 'reply', - }[query.t] - query.type = resourceTypeMap[query.type] - const data = { - threadId: query.type + query.id, - } - - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId - } - if (query.t == 'add') data.content = query.content - else if (query.t == 'delete') data.commentId = query.commentId - else if (query.t == 'reply') { - data.commentId = query.commentId - data.content = query.content - } - return request( - 'POST', - `https://music.163.com/weapi/resource/comments/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_album.js b/netease_api/module/comment_album.js deleted file mode 100644 index d701d2d..0000000 --- a/netease_api/module/comment_album.js +++ /dev/null @@ -1,22 +0,0 @@ -// 专辑评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_AL_3_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_dj.js b/netease_api/module/comment_dj.js deleted file mode 100644 index 70b7dbf..0000000 --- a/netease_api/module/comment_dj.js +++ /dev/null @@ -1,22 +0,0 @@ -// 电台评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_DJ_1_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_floor.js b/netease_api/module/comment_floor.js deleted file mode 100644 index de28470..0000000 --- a/netease_api/module/comment_floor.js +++ /dev/null @@ -1,21 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -module.exports = (query, request) => { - query.type = resourceTypeMap[query.type] - const data = { - parentCommentId: query.parentCommentId, - threadId: query.type + query.id, - time: query.time || -1, - limit: query.limit || 20, - } - return request( - 'POST', - `https://music.163.com/api/resource/comment/floor/get`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_hot.js b/netease_api/module/comment_hot.js deleted file mode 100644 index 4858678..0000000 --- a/netease_api/module/comment_hot.js +++ /dev/null @@ -1,24 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -// 热门评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - query.type = resourceTypeMap[query.type] - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/hotcomments/${query.type}${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_hug_list.js b/netease_api/module/comment_hug_list.js deleted file mode 100644 index 394a2df..0000000 --- a/netease_api/module/comment_hug_list.js +++ /dev/null @@ -1,27 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -module.exports = (query, request) => { - query.cookie.os = 'ios' - query.cookie.appver = '8.1.20' - query.type = resourceTypeMap[query.type || 0] - const threadId = query.type + query.sid - const data = { - targetUserId: query.uid, - commentId: query.cid, - cursor: query.cursor || '-1', - threadId: threadId, - pageNo: query.page || 1, - idCursor: query.idCursor || -1, - pageSize: query.pageSize || 100, - } - return request( - 'POST', - `https://music.163.com/api/v2/resource/comments/hug/list`, - data, - { - crypto: 'api', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_like.js b/netease_api/module/comment_like.js deleted file mode 100644 index fa382a8..0000000 --- a/netease_api/module/comment_like.js +++ /dev/null @@ -1,26 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -// 点赞与取消点赞评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - query.t = query.t == 1 ? 'like' : 'unlike' - query.type = resourceTypeMap[query.type] - const data = { - threadId: query.type + query.id, - commentId: query.cid, - } - if (query.type == 'A_EV_2_') { - data.threadId = query.threadId - } - return request( - 'POST', - `https://music.163.com/weapi/v1/comment/${query.t}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_music.js b/netease_api/module/comment_music.js deleted file mode 100644 index 9fbc8f1..0000000 --- a/netease_api/module/comment_music.js +++ /dev/null @@ -1,22 +0,0 @@ -// 歌曲评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/api/v1/resource/comments/R_SO_4_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_mv.js b/netease_api/module/comment_mv.js deleted file mode 100644 index 979c035..0000000 --- a/netease_api/module/comment_mv.js +++ /dev/null @@ -1,22 +0,0 @@ -// MV评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_MV_5_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_new.js b/netease_api/module/comment_new.js deleted file mode 100644 index ad3cb0b..0000000 --- a/netease_api/module/comment_new.js +++ /dev/null @@ -1,31 +0,0 @@ -const { resourceTypeMap } = require('../util/config.json') -// 评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - query.type = resourceTypeMap[query.type] - const threadId = query.type + query.id - const pageSize = query.pageSize || 20 - const pageNo = query.pageNo || 1 - const data = { - threadId: threadId, - pageNo, - showInner: query.showInner || true, - pageSize, - cursor: - +query.sortType === 3 ? query.cursor || '0' : (pageNo - 1) * pageSize, - sortType: query.sortType || 1, //1:按推荐排序,2:按热度排序,3:按时间排序 - } - return request( - 'POST', - `https://music.163.com/api/v2/resource/comments`, - data, - { - crypto: 'eapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - url: '/api/v2/resource/comments', - }, - ) -} diff --git a/netease_api/module/comment_playlist.js b/netease_api/module/comment_playlist.js deleted file mode 100644 index 52fc544..0000000 --- a/netease_api/module/comment_playlist.js +++ /dev/null @@ -1,22 +0,0 @@ -// 歌单评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/A_PL_0_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/comment_video.js b/netease_api/module/comment_video.js deleted file mode 100644 index ae015a9..0000000 --- a/netease_api/module/comment_video.js +++ /dev/null @@ -1,22 +0,0 @@ -// 视频评论 - -module.exports = (query, request) => { - query.cookie.os = 'pc' - const data = { - rid: query.id, - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, - } - return request( - 'POST', - `https://music.163.com/weapi/v1/resource/comments/R_VI_62_${query.id}`, - data, - { - crypto: 'weapi', - cookie: query.cookie, - proxy: query.proxy, - realIP: query.realIP, - }, - ) -} diff --git a/netease_api/module/playlist_create.js b/netease_api/module/playlist_create.js index 8a1ae26..f33f5f0 100644 --- a/netease_api/module/playlist_create.js +++ b/netease_api/module/playlist_create.js @@ -5,7 +5,7 @@ module.exports = (query, request) => { const data = { name: query.name, privacy: query.privacy, //0 为普通歌单,10 为隐私歌单 - type: query.type || 'NORMAL', // NORMAL|VIDEO + type: query.type || 'NORMAL', // NORMAL|VIDEO|SHARED } return request('POST', `https://music.163.com/api/playlist/create`, data, { crypto: 'weapi', diff --git a/netease_api/module/playlist_track_all.js b/netease_api/module/playlist_track_all.js new file mode 100644 index 0000000..03a8c3a --- /dev/null +++ b/netease_api/module/playlist_track_all.js @@ -0,0 +1,47 @@ +// 通过传过来的歌单id拿到所有歌曲数据 +// 支持传递参数limit来限制获取歌曲的数据数量 例如: /playlist/track/all?id=7044354223&limit=10 + +module.exports = (query, request) => { + const data = { + id: query.id, + n: 100000, + s: query.s || 8, + } + //不放在data里面避免请求带上无用的数据 + let limit = query.limit + let trackIds + let idsData = Object.create(null) + + return request('POST', `https://music.163.com/api/v6/playlist/detail`, data, { + crypto: 'api', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }).then((res) => { + const ids = [] + let trackIds = res.body.playlist.trackIds + if (typeof limit === 'undefined') { + limit = trackIds.length + } + trackIds.forEach((item, index) => { + if (index < limit) { + ids.push(item.id) + } + }) + idsData = { + c: '[' + ids.map((id) => '{"id":' + id + '}').join(',') + ']', + } + + return request( + 'POST', + `https://music.163.com/api/v3/song/detail`, + idsData, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) + }) +} diff --git a/netease_api/module/comment_event.js b/netease_api/module/record_recent_album.js similarity index 53% rename from netease_api/module/comment_event.js rename to netease_api/module/record_recent_album.js index 460a560..804bc19 100644 --- a/netease_api/module/comment_event.js +++ b/netease_api/module/record_recent_album.js @@ -1,14 +1,10 @@ -// 获取动态评论 - module.exports = (query, request) => { const data = { - limit: query.limit || 20, - offset: query.offset || 0, - beforeTime: query.before || 0, + limit: query.limit || 100, } return request( 'POST', - `https://music.163.com/weapi/v1/resource/comments/${query.threadId}`, + `https://music.163.com/api/play-record/album/list`, data, { crypto: 'weapi', diff --git a/netease_api/module/share_resource.js b/netease_api/module/record_recent_dj.js similarity index 52% rename from netease_api/module/share_resource.js rename to netease_api/module/record_recent_dj.js index 64c016a..6bd6062 100644 --- a/netease_api/module/share_resource.js +++ b/netease_api/module/record_recent_dj.js @@ -1,14 +1,10 @@ -// 分享歌曲到动态 - module.exports = (query, request) => { const data = { - type: query.type || 'song', // song,playlist,mv,djprogram,djradio - msg: query.msg || '', - id: query.id || '', + limit: query.limit || 100, } return request( 'POST', - `https://music.163.com/weapi/share/friends/resource`, + `https://music.163.com/api/play-record/djradio/list`, data, { crypto: 'weapi', diff --git a/netease_api/module/record_recent_playlist.js b/netease_api/module/record_recent_playlist.js new file mode 100644 index 0000000..d9a7d3d --- /dev/null +++ b/netease_api/module/record_recent_playlist.js @@ -0,0 +1,16 @@ +module.exports = (query, request) => { + const data = { + limit: query.limit || 100, + } + return request( + 'POST', + `https://music.163.com/api/play-record/playlist/list`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) +} diff --git a/netease_api/module/record_recent_song.js b/netease_api/module/record_recent_song.js new file mode 100644 index 0000000..275caaa --- /dev/null +++ b/netease_api/module/record_recent_song.js @@ -0,0 +1,16 @@ +module.exports = (query, request) => { + const data = { + limit: query.limit || 100, + } + return request( + 'POST', + `https://music.163.com/api/play-record/song/list`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) +} diff --git a/netease_api/module/record_recent_video.js b/netease_api/module/record_recent_video.js new file mode 100644 index 0000000..5a22b96 --- /dev/null +++ b/netease_api/module/record_recent_video.js @@ -0,0 +1,16 @@ +module.exports = (query, request) => { + const data = { + limit: query.limit || 100, + } + return request( + 'POST', + `https://music.163.com/api/play-record/newvideo/list`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) +} diff --git a/netease_api/module/record_recent_voice.js b/netease_api/module/record_recent_voice.js new file mode 100644 index 0000000..43f5b1c --- /dev/null +++ b/netease_api/module/record_recent_voice.js @@ -0,0 +1,16 @@ +module.exports = (query, request) => { + const data = { + limit: query.limit || 100, + } + return request( + 'POST', + `https://music.163.com/api/play-record/voice/list`, + data, + { + crypto: 'weapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + }, + ) +} diff --git a/netease_api/module/song_download_url.js b/netease_api/module/song_download_url.js new file mode 100644 index 0000000..73eccc9 --- /dev/null +++ b/netease_api/module/song_download_url.js @@ -0,0 +1,20 @@ +// 获取客户端歌曲下载链接 + +module.exports = (query, request) => { + const data = { + id: query.id, + br: parseInt(query.br || 999000), + } + return request( + 'POST', + `https://interface.music.163.com/eapi/song/enhance/download/url`, + data, + { + crypto: 'eapi', + cookie: query.cookie, + proxy: query.proxy, + realIP: query.realIP, + url: '/api/song/enhance/download/url', + }, + ) +} diff --git a/netease_api/package.json b/netease_api/package.json index 3990157..8a81185 100644 --- a/netease_api/package.json +++ b/netease_api/package.json @@ -1,6 +1,6 @@ { "name": "NeteaseCloudMusicApi", - "version": "4.0.8", + "version": "4.2.0", "description": "网易云音乐 NodeJS 版 API", "scripts": { "start": "node app.js", diff --git a/netease_api/public/home.html b/netease_api/public/home.html new file mode 100644 index 0000000..1459dc9 --- /dev/null +++ b/netease_api/public/home.html @@ -0,0 +1,58 @@ + + + + + + + home + + + + + + + + diff --git a/netease_api/public/login.html b/netease_api/public/login.html new file mode 100644 index 0000000..1aa597d --- /dev/null +++ b/netease_api/public/login.html @@ -0,0 +1,47 @@ + + + + + + + 登录 + + + + + + + + diff --git a/netease_api/test/login.test.js b/netease_api/test/login.test.js index d10da4b..e7551d6 100644 --- a/netease_api/test/login.test.js +++ b/netease_api/test/login.test.js @@ -3,11 +3,14 @@ const axios = require('axios') const host = global.host || 'http://localhost:3000' console.log('注意: 测试登录需在 test/login.test.js 中填写账号密码!!!') -const phone = '' -const password = '' +const country_code = '1' +const phone = '3156678705' +const password = '1q2w3e4R' describe('测试登录是否正常', () => { it('手机登录 code 应该等于200', (done) => { const qs = { + countrycode: + process.env.NCM_API_TEST_LOGIN_COUNTRY_CODE || country_code || '', phone: process.env.NCM_API_TEST_LOGIN_PHONE || phone || '', password: process.env.NCM_API_TEST_LOGIN_PASSWORD || password || '', } diff --git a/netease_api/util/request.js b/netease_api/util/request.js index 7b4f45a..bcb245a 100644 --- a/netease_api/util/request.js +++ b/netease_api/util/request.js @@ -117,7 +117,7 @@ const createRequest = (method, url, data, options) => { headers: headers, data: queryString.stringify(data), httpAgent: new http.Agent({ keepAlive: true }), - httpsAgent: new https.Agent({ keepAlive: true, rejectUnauthorized: false }), + httpsAgent: new https.Agent({ keepAlive: true }), } if (options.crypto === 'eapi') settings.encoding = null @@ -127,7 +127,7 @@ const createRequest = (method, url, data, options) => { settings.httpAgent = new PacProxyAgent(options.proxy) settings.httpsAgent = new PacProxyAgent(options.proxy) } else { - var purl = qs.parse(options.proxy) + const purl = qs.parse(options.proxy) if (purl.hostname) { const agent = tunnel.httpsOverHttp({ proxy: { @@ -142,6 +142,8 @@ const createRequest = (method, url, data, options) => { console.error('代理配置无效,不使用代理') } } + } else { + settings.proxy = false } if (options.crypto === 'eapi') { settings = { @@ -172,13 +174,19 @@ const createRequest = (method, url, data, options) => { } } catch (e) { // console.log(e) - answer.body = body + try { + answer.body = JSON.parse(body.toString()) + } catch (err) { + // console.log(err) + // can't decrypt and can't parse directly + answer.body = body + } answer.status = res.status } answer.status = 100 < answer.status && answer.status < 600 ? answer.status : 400 - if (answer.status == 200) resolve(answer) + if (answer.status === 200) resolve(answer) else reject(answer) }) .catch((err) => { diff --git a/src/views/library.vue b/src/views/library.vue index 693b1da..c8243a7 100644 --- a/src/views/library.vue +++ b/src/views/library.vue @@ -289,6 +289,9 @@ export default { if (data.lrc !== undefined) { let ifl = data.lrc.lyric.split('\n').filter(l => { if (l.includes('作词')) { + if (l.includes('纯音乐,请欣赏') || l.includes('作词 : 无')) { + return false; + } this.lyric = data.lrc.lyric; return true + ifl; }