diff --git a/app.js b/app.js index f2f5cdc..dd2e422 100644 --- a/app.js +++ b/app.js @@ -42,14 +42,6 @@ app.use(cache('2 minutes', onlyStatus200)) app.use(express.static(path.resolve(__dirname, 'public'))) -app.use(function(req, res, next) { - const proxy = req.query.proxy - if (proxy) { - req.headers.cookie += `__proxy__${proxy}` - } - next() -}) - // 补全缺失的cookie const { completeCookie } = require('./util/init') app.use(function(req, res, next) { @@ -59,6 +51,24 @@ app.use(function(req, res, next) { next() }) +// cookie parser +app.use(function(req, res, next) { + req.cookies = {}, (req.headers.cookie || '').split(/\s*;\s*/).forEach(pair => { + let crack = pair.indexOf('=') + if(crack < 1 || crack == pair.length - 1) return + req.cookies[decodeURIComponent(pair.slice(0, crack)).trim()] = decodeURIComponent(pair.slice(crack + 1)).trim() + }) + next() +}) + +app.use(function(req, res, next) { + const proxy = req.query.proxy + if (proxy) { + req.headers.cookie += `__proxy__${proxy}` + } + next() +}) + // 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理 const UnusualRouteFileMap = { // key 为文件名, value 为对外注册的路由 @@ -72,27 +82,41 @@ const { createWebAPIRequest, request } = require('./util/util') const Wrap = fn => (req, res) => fn(req, res, createWebAPIRequest, request) // 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由 -fs.readdirSync(path.resolve(__dirname, 'router')) - .reverse() - .forEach(file => { - if (/\.js$/i.test(file) === false) { - return - } +fs.readdirSync(path.join(__dirname, 'router')) +.reverse() +.forEach(file => { + if (!/\.js$/i.test(file)) return + let route = (file in UnusualRouteFileMap) ? UnusualRouteFileMap[file] : '/' + file.replace(/\.js$/i, '').replace(/_/g, '/') + app.use(route, Wrap(require(path.join(__dirname, 'router', file)))) +}) - let route - if (typeof UnusualRouteFileMap[file] !== 'undefined') { - route = UnusualRouteFileMap[file] - } else { - route = - '/' + - file - .replace(/\.js$/i, '') - .replace(/_/g, '/') - } - - app.use(route, Wrap(require('./router/' + file))) +// 改写router为module +const requestMod = require('./util/request') +let dev = express() +fs.readdirSync(path.join(__dirname, 'module')) +.reverse() +.forEach(file => { + if (!(/\.js$/i.test(file))) return + let route = (file in UnusualRouteFileMap) ? UnusualRouteFileMap[file] : '/' + file.replace(/\.js$/i, '').replace(/_/g, '/') + let question = require(path.join(__dirname, 'module', file)) + + dev.use(route, (req, res) => { + let query = {...req.query, cookie: req.cookies} + question(query, requestMod) + .then(answer => { + console.log('[OK]', decodeURIComponent(req.originalUrl)) + res.append('Set-Cookie', answer.cookie) + res.status(answer.status).send(answer.body) + }) + .catch(answer => { + console.log('[ERR]', decodeURIComponent(req.originalUrl)) + res.append('Set-Cookie', answer.cookie) + res.status(answer.status).send(answer.body) + }) }) +}) +app.use('/dev', dev) const port = process.env.PORT || 3000 diff --git a/module/album.js b/module/album.js new file mode 100644 index 0000000..d8d0ecd --- /dev/null +++ b/module/album.js @@ -0,0 +1,8 @@ +// 专辑内容 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/v1/album/${query.id}`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_album.js b/module/artist_album.js new file mode 100644 index 0000000..8964c2a --- /dev/null +++ b/module/artist_album.js @@ -0,0 +1,13 @@ +// 歌手专辑列表 + +module.exports = (query, request) => { + const data = { + limit: query.limit || 30, + offset: query.offset || 0, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/artist/albums/${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_desc.js b/module/artist_desc.js new file mode 100644 index 0000000..37677a3 --- /dev/null +++ b/module/artist_desc.js @@ -0,0 +1,11 @@ +// 歌手介绍 + +module.exports = (query, request) => { + const data = { + id: query.id + } + return request( + 'POST', `http://music.163.com/weapi/artist/introduction`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_list.js b/module/artist_list.js new file mode 100644 index 0000000..7fbce65 --- /dev/null +++ b/module/artist_list.js @@ -0,0 +1,37 @@ +// 歌手分类 + +/* + categoryCode 取值 + 入驻歌手 5001 + 华语男歌手 1001 + 华语女歌手 1002 + 华语组合/乐队 1003 + 欧美男歌手 2001 + 欧美女歌手 2002 + 欧美组合/乐队 2003 + 日本男歌手 6001 + 日本女歌手 6002 + 日本组合/乐队 6003 + 韩国男歌手 7001 + 韩国女歌手 7002 + 韩国组合/乐队 7003 + 其他男歌手 4001 + 其他女歌手 4002 + 其他组合/乐队 4003 + + initial 取值 a-z/A-Z +*/ + +module.exports = (query, request) => { + const data = { + categoryCode: query.cat || '1001', + initial: (query.initial || '').toUpperCase().charCodeAt() || '', + offset: query.offset || 0, + limit: query.limit || 30, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/artist/list`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_mv.js b/module/artist_mv.js new file mode 100644 index 0000000..8eb953c --- /dev/null +++ b/module/artist_mv.js @@ -0,0 +1,14 @@ +// 歌手相关MV + +module.exports = (query, request) => { + const data = { + artistId: query.id, + limit: query.limit, + offset: query.offset, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/artist/mvs`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_sub.js b/module/artist_sub.js new file mode 100644 index 0000000..05bc4cf --- /dev/null +++ b/module/artist_sub.js @@ -0,0 +1,13 @@ +// 收藏与取消收藏歌手 + +module.exports = (query, request) => { + query.t = (query.t == 1 ? 'sub' : 'unsub') + const data = { + artistId: query.id, + artistIds: '[' + query.id + ']' + } + return request( + 'POST', `http://music.163.com/weapi/artist/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artist_sublist.js b/module/artist_sublist.js new file mode 100644 index 0000000..d4d8096 --- /dev/null +++ b/module/artist_sublist.js @@ -0,0 +1,13 @@ +// 我的歌手列表 + +module.exports = (query, request) => { + const data = { + limit: query.limit || 25, + offset: query.offset || 0, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/artist/sublist`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/artists.js b/module/artists.js new file mode 100644 index 0000000..a9efd17 --- /dev/null +++ b/module/artists.js @@ -0,0 +1,8 @@ +// 歌手单曲 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/v1/artist/${query.id}`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/banner.js b/module/banner.js new file mode 100644 index 0000000..869bd2a --- /dev/null +++ b/module/banner.js @@ -0,0 +1,20 @@ +// 首页轮播图 + +module.exports = (query, request) => { + return request( + 'GET', `http://music.163.com/discover`, {}, + {ua: 'pc', proxy: query.proxy} + ) + .then(response => { + try{ + const banners = eval(`(${/Gbanners\s*=\s*([^;]+);/.exec(response.body)[1]})`) + response.body = {code: 200, banners: banners} + return response + } + catch(err){ + response.status = 500 + response.body = {code: 500, msg: err.stack} + return Promise.reject(response) + } + }) +} \ No newline at end of file diff --git a/module/check_music.js b/module/check_music.js new file mode 100644 index 0000000..8d11dff --- /dev/null +++ b/module/check_music.js @@ -0,0 +1,25 @@ +// 歌曲可用性 + +module.exports = (query, request) => { + const data = { + ids: '[' + parseInt(query.id) + ']', + br: parseInt(query.br || 999000) + } + return request( + 'POST', `http://music.163.com/weapi/song/enhance/player/url`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) + .then(response => { + if (response.body.code == 200) { + if (response.body.data[0].code == 200){ + response.body = {success: true, message: 'ok'} + return response + } + } + else{ + response.status = 404 + response.body = {success: false, message: '亲爱的,暂无版权'} + return Promise.reject(response) + } + }) +} \ No newline at end of file diff --git a/module/comment.js b/module/comment.js new file mode 100644 index 0000000..bac7ce3 --- /dev/null +++ b/module/comment.js @@ -0,0 +1,25 @@ +// 发送与删除评论 + +module.exports = (query, request) => { + query.cookie.os = 'pc' + query.t = (query.t == 1 ? 'add' : 'delete') + query.type = { + 0: 'R_SO_4_', // 歌曲 + 1: 'R_MV_5_', // MV + 2: 'A_PL_0_', // 歌单 + 3: 'R_AL_3_', // 专辑 + 4: 'A_DJ_1_', // 电台, + 5: 'R_VI_62_' // 视频 + }[query.type] + const data = { + threadId: query.type + query.id + } + if(query.t == 'add') + data.content = query.content + else if(query.t == 'delete') + data.commentId = query.commentId + return request( + 'POST', `http://music.163.com/weapi/resource/comments/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_album.js b/module/comment_album.js new file mode 100644 index 0000000..da56f03 --- /dev/null +++ b/module/comment_album.js @@ -0,0 +1,13 @@ +// 专辑评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/R_AL_3_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_dj.js b/module/comment_dj.js new file mode 100644 index 0000000..c436a35 --- /dev/null +++ b/module/comment_dj.js @@ -0,0 +1,13 @@ +// 电台评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/A_DJ_1_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_hot.js b/module/comment_hot.js new file mode 100644 index 0000000..e03d959 --- /dev/null +++ b/module/comment_hot.js @@ -0,0 +1,22 @@ +// 热门评论 + +module.exports = (query, request) => { + query.cookie.os = 'pc' + query.type = { + 0: 'R_SO_4_', // 歌曲 + 1: 'R_MV_5_', // MV + 2: 'A_PL_0_', // 歌单 + 3: 'R_AL_3_', // 专辑 + 4: 'A_DJ_1_', // 电台, + 5: 'R_VI_62_' // 视频 + }[query.type] + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/hotcomments/${query.type}${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_like.js b/module/comment_like.js new file mode 100644 index 0000000..98c0cf4 --- /dev/null +++ b/module/comment_like.js @@ -0,0 +1,22 @@ +// 点赞与取消点赞评论 + +module.exports = (query, request) => { + query.cookie.os = 'pc' + query.t = (query.t == 1 ? 'like' : 'unlike') + query.type = { + 0: 'R_SO_4_', // 歌曲 + 1: 'R_MV_5_', // MV + 2: 'A_PL_0_', // 歌单 + 3: 'R_AL_3_', // 专辑 + 4: 'A_DJ_1_', // 电台, + 5: 'R_VI_62_' // 视频 + }[query.type] + const data = { + threadId: query.type + query.id, + commentId: query.cid + } + return request( + 'POST', `http://music.163.com/weapi/v1/comment/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_music.js b/module/comment_music.js new file mode 100644 index 0000000..afb3315 --- /dev/null +++ b/module/comment_music.js @@ -0,0 +1,13 @@ +// 歌曲评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/R_SO_4_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_mv.js b/module/comment_mv.js new file mode 100644 index 0000000..57133bf --- /dev/null +++ b/module/comment_mv.js @@ -0,0 +1,13 @@ +// MV评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/R_MV_5_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_playlist.js b/module/comment_playlist.js new file mode 100644 index 0000000..1431483 --- /dev/null +++ b/module/comment_playlist.js @@ -0,0 +1,13 @@ +// 歌单评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/A_PL_0_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/comment_video.js b/module/comment_video.js new file mode 100644 index 0000000..7df4221 --- /dev/null +++ b/module/comment_video.js @@ -0,0 +1,13 @@ +// 视频评论 + +module.exports = (query, request) => { + const data = { + rid: query.id, + limit: query.limit || 20, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/v1/resource/comments/R_VI_62_${query.id}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/daily_signin.js b/module/daily_signin.js new file mode 100644 index 0000000..f0ba150 --- /dev/null +++ b/module/daily_signin.js @@ -0,0 +1,18 @@ +// 签到 + +/* + 0为安卓端签到 3点经验, 1为网页签到,2点经验 + 签到成功 {'android': {'point': 3, 'code': 200}, 'web': {'point': 2, 'code': 200}} + 重复签到 {'android': {'code': -2, 'msg': '重复签到'}, 'web': {'code': -2, 'msg': '重复签到'}} + 未登录 {'android': {'code': 301}, 'web': {'code': 301}} +*/ + +module.exports = (query, request) => { + const data = { + type: query.type || 0 + } + return request( + 'POST', `http://music.163.com/weapi/point/dailyTask`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_catelist.js b/module/dj_catelist.js new file mode 100644 index 0000000..d64709f --- /dev/null +++ b/module/dj_catelist.js @@ -0,0 +1,8 @@ +// 电台分类列表 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/djradio/category/get`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_detail.js b/module/dj_detail.js new file mode 100644 index 0000000..35fe0c4 --- /dev/null +++ b/module/dj_detail.js @@ -0,0 +1,11 @@ +// 电台详情 + +module.exports = (query, request) => { + const data = { + id: query.rid + } + return request( + 'POST', `http://music.163.com/weapi/djradio/get`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_hot.js b/module/dj_hot.js new file mode 100644 index 0000000..175294d --- /dev/null +++ b/module/dj_hot.js @@ -0,0 +1,17 @@ +// 热门电台 + +module.exports = (query, request) => { + const data = { + cat: query.type, + cateId: query.type, + type: query.type, + categoryId: query.type, + category: query.type, + limit: query.limit, + offset: query.offset + } + return request( + 'POST', `http://music.163.com/weapi/djradio/hot/v1`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_paygift.js b/module/dj_paygift.js new file mode 100644 index 0000000..2f4680b --- /dev/null +++ b/module/dj_paygift.js @@ -0,0 +1,12 @@ +// 付费电台 + +module.exports = (query, request) => { + const data = { + limit: query.limit || 10, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/djradio/home/paygift/list?_nmclfl=1`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_program.js b/module/dj_program.js new file mode 100644 index 0000000..9ed4020 --- /dev/null +++ b/module/dj_program.js @@ -0,0 +1,14 @@ +// 电台节目列表 + +module.exports = (query, request) => { + const data = { + radioId: query.rid, + limit: query.limit || 30, + offset: query.offset || 0, + asc: query.asc + } + return request( + 'POST', `http://music.163.com/weapi/dj/program/byradio`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_program_detail.js b/module/dj_program_detail.js new file mode 100644 index 0000000..838d9b3 --- /dev/null +++ b/module/dj_program_detail.js @@ -0,0 +1,11 @@ +// 电台节目详情 + +module.exports = (query, request) => { + const data = { + id: query.id + } + return request( + 'POST', `http://music.163.com/weapi/dj/program/detail`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_recommend.js b/module/dj_recommend.js new file mode 100644 index 0000000..43e7f4e --- /dev/null +++ b/module/dj_recommend.js @@ -0,0 +1,8 @@ +// 精选电台 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/djradio/recommend/v1`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} diff --git a/module/dj_recommend_type.js b/module/dj_recommend_type.js new file mode 100644 index 0000000..b39720b --- /dev/null +++ b/module/dj_recommend_type.js @@ -0,0 +1,34 @@ +// 精选电台分类 + +/* + 有声书 10001 + 知识技能 453050 + 商业财经 453051 + 人文历史 11 + 外语世界 13 + 亲子宝贝 14 + 创作|翻唱 2001 + 音乐故事 2 + 3D|电子 10002 + 相声曲艺 8 + 情感调频 3 + 美文读物 6 + 脱口秀 5 + 广播剧 7 + 二次元 3001 + 明星做主播 1 + 娱乐|影视 4 + 科技科学 453052 + 校园|教育 4001 + 旅途|城市 12 +*/ + +module.exports = (query, request) => { + const data = { + cateId: query.type + } + return request( + 'POST', `http://music.163.com/weapi/djradio/recommend`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_sub.js b/module/dj_sub.js new file mode 100644 index 0000000..8a2523e --- /dev/null +++ b/module/dj_sub.js @@ -0,0 +1,12 @@ +// 订阅与取消电台 + +module.exports = (query, request) => { + query.t = (query.t == 1 ? 'sub' : 'unsub') + const data = { + id: query.rid + } + return request( + 'POST', `http://music.163.com/weapi/djradio/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/dj_sublist.js b/module/dj_sublist.js new file mode 100644 index 0000000..d42c830 --- /dev/null +++ b/module/dj_sublist.js @@ -0,0 +1,13 @@ +// 我的电台列表 + +module.exports = (query, request) => { + const data = { + limit: query.limit || 30, + offset: query.offset || 0, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/djradio/get/subed`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/event.js b/module/event.js new file mode 100644 index 0000000..de941b3 --- /dev/null +++ b/module/event.js @@ -0,0 +1,8 @@ +// 动态 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/v1/event/get`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/fm_trash.js b/module/fm_trash.js new file mode 100644 index 0000000..35a4ee9 --- /dev/null +++ b/module/fm_trash.js @@ -0,0 +1,11 @@ +// 垃圾桶 + +module.exports = (query, request) => { + const data = { + songId: query.id + } + return request( + 'POST', `http://music.163.com/weapi/radio/trash/add?alg=RT&songId=${query.id}&time=${query.time || 25}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/follow.js b/module/follow.js new file mode 100644 index 0000000..460d76b --- /dev/null +++ b/module/follow.js @@ -0,0 +1,9 @@ +// 关注与取消关注用户 + +module.exports = (query, request) => { + query.t = (query.t == 1 ? 'follow' : 'delfollow') + return request( + 'POST', `http://music.163.com/weapi/user/${query.t}/${query.id}`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/like.js b/module/like.js new file mode 100644 index 0000000..3e29699 --- /dev/null +++ b/module/like.js @@ -0,0 +1,13 @@ +// 红心取消红心歌曲 + +module.exports = (query, request) => { + query.like = (query.like ? true : false) + const data = { + trackId: query.id, + like: query.like + } + return request( + 'POST', `http://music.163.com/weapi/radio/like?alg=${query.alg || 'itembased'}&trackId=${query.id}&like=${query.like}&time=${query.time || 25}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/likelist.js b/module/likelist.js new file mode 100644 index 0000000..6dbd62f --- /dev/null +++ b/module/likelist.js @@ -0,0 +1,11 @@ +// 喜欢的歌曲(无序) + +module.exports = (query, request) => { + const data = { + uid: query.uid + } + return request( + 'POST', `http://music.163.com/weapi/song/like/get`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/login.js b/module/login.js new file mode 100644 index 0000000..d3c2345 --- /dev/null +++ b/module/login.js @@ -0,0 +1,15 @@ +// 邮箱登录 + +const crypto = require('crypto') + +module.exports = (query, request) => { + const data = { + username: query.email, + password: crypto.createHash('md5').update(query.password).digest('hex'), + rememberLogin: 'true' + } + return request( + 'POST', `http://music.163.com/weapi/login`, data, + {crypto: 'weapi', ua: 'pc', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/login_cellphone.js b/module/login_cellphone.js new file mode 100644 index 0000000..71beb88 --- /dev/null +++ b/module/login_cellphone.js @@ -0,0 +1,15 @@ +// 手机登录 + +const crypto = require('crypto') + +module.exports = (query, request) => { + const data = { + phone: query.phone, + password: crypto.createHash('md5').update(query.password).digest('hex'), + rememberLogin: 'true' + } + return request( + 'POST', `http://music.163.com/weapi/login/cellphone`, data, + {crypto: 'weapi', ua: 'pc', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/login_refresh.js b/module/login_refresh.js new file mode 100644 index 0000000..fa83612 --- /dev/null +++ b/module/login_refresh.js @@ -0,0 +1,8 @@ +// 登录刷新 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/login/token/refresh`, {}, + {crypto: 'weapi', ua: 'pc', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/login_status.js b/module/login_status.js new file mode 100644 index 0000000..edd21ab --- /dev/null +++ b/module/login_status.js @@ -0,0 +1,21 @@ +// 登录状态 + +module.exports = (query, request) => { + return request( + 'GET', `http://music.163.com`, {}, + {cookie: query.cookie, proxy: query.proxy} + ) + .then(response => { + try{ + let profile = eval(`(${/GUser\s*=\s*([^;]+);/.exec(response.body)[1]})`) + let bindings = eval(`(${/GBinds\s*=\s*([^;]+);/.exec(response.body)[1]})`) + response.body = {code: 200, profile: profile, bindings: bindings} + return response + } + catch(err){ + response.status = 301 + response.body = {code: 301} + return Promise.reject(response) + } + }) +} \ No newline at end of file diff --git a/module/logout.js b/module/logout.js new file mode 100644 index 0000000..8063e1d --- /dev/null +++ b/module/logout.js @@ -0,0 +1,8 @@ +// 退出登录 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/logout`, {}, + {crypto: 'weapi', ua: 'pc', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/lyric.js b/module/lyric.js new file mode 100644 index 0000000..02d9f8c --- /dev/null +++ b/module/lyric.js @@ -0,0 +1,8 @@ +// 歌词 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/song/lyric?os=osx&id=${query.id}&lv=-1&kv=-1&tv=-1`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/mv_detail.js b/module/mv_detail.js new file mode 100644 index 0000000..0c69478 --- /dev/null +++ b/module/mv_detail.js @@ -0,0 +1,11 @@ +// MV详情 + +module.exports = (query, request) => { + const data = { + id: query.mvid + } + return request( + 'POST', `http://music.163.com/weapi/mv/detail`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/mv_first.js b/module/mv_first.js new file mode 100644 index 0000000..59af71a --- /dev/null +++ b/module/mv_first.js @@ -0,0 +1,13 @@ +// 最新MV + +module.exports = (query, request) => { + const data = { + // 'offset': query.offset || 0, + limit: query.limit || 30, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/mv/first`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/mv_sub.js b/module/mv_sub.js new file mode 100644 index 0000000..b87e99b --- /dev/null +++ b/module/mv_sub.js @@ -0,0 +1,13 @@ +// 收藏与取消收藏MV + +module.exports = (query, request) => { + query.t = (query.t == 1 ? 'sub' : 'unsub') + const data = { + mvId: query.mvid, + mvIds: '["' + query.mvid + '"]' + } + return request( + 'POST', `http://music.163.com/weapi/mv/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/mv_url.js b/module/mv_url.js new file mode 100644 index 0000000..1338861 --- /dev/null +++ b/module/mv_url.js @@ -0,0 +1,12 @@ +// MV链接 + +module.exports = (query, request) => { + const data = { + id: query.id, + r: query.res || 1080 + } + return request( + 'POST', `http://music.163.com/weapi/song/enhance/play/mv/url`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personal_fm.js b/module/personal_fm.js new file mode 100644 index 0000000..128c3f3 --- /dev/null +++ b/module/personal_fm.js @@ -0,0 +1,8 @@ +// 私人FM + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/v1/radio/get`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personalized.js b/module/personalized.js new file mode 100644 index 0000000..67b9296 --- /dev/null +++ b/module/personalized.js @@ -0,0 +1,14 @@ +// 推荐歌单 + +module.exports = (query, request) => { + const data = { + limit: query.limit || 30, + offset: query.limit || 0, + total: true, + n: 1000 + } + return request( + 'POST', `http://music.163.com/weapi/personalized/playlist`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personalized_djprogram.js b/module/personalized_djprogram.js new file mode 100644 index 0000000..9a3de44 --- /dev/null +++ b/module/personalized_djprogram.js @@ -0,0 +1,8 @@ +// 推荐电台 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/personalized/djprogram`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personalized_mv.js b/module/personalized_mv.js new file mode 100644 index 0000000..2381871 --- /dev/null +++ b/module/personalized_mv.js @@ -0,0 +1,8 @@ +// 推荐MV + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/personalized/mv`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personalized_newsong.js b/module/personalized_newsong.js new file mode 100644 index 0000000..7b8ae31 --- /dev/null +++ b/module/personalized_newsong.js @@ -0,0 +1,11 @@ +// 推荐新歌 + +module.exports = (query, request) => { + const data = { + type: "recommend" + } + return request( + 'POST', `http://music.163.com/weapi/personalized/newsong`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/personalized_privatecontent.js b/module/personalized_privatecontent.js new file mode 100644 index 0000000..8d130c5 --- /dev/null +++ b/module/personalized_privatecontent.js @@ -0,0 +1,8 @@ +// 独家放送 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/personalized/privatecontent`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_catlist.js b/module/playlist_catlist.js new file mode 100644 index 0000000..3d4b557 --- /dev/null +++ b/module/playlist_catlist.js @@ -0,0 +1,8 @@ +// 全部歌单分类 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/playlist/catalogue`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_create.js b/module/playlist_create.js new file mode 100644 index 0000000..da818e4 --- /dev/null +++ b/module/playlist_create.js @@ -0,0 +1,12 @@ +// 创建歌单 + +module.exports = (query, request) => { + query.cookie.os = 'pc' + const data = { + name: query.name + } + return request( + 'POST', `http://music.163.com/weapi/playlist/create`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_detail.js b/module/playlist_detail.js new file mode 100644 index 0000000..306c8f0 --- /dev/null +++ b/module/playlist_detail.js @@ -0,0 +1,13 @@ +// 歌单详情 + +module.exports = (query, request) => { + const data = { + id: query.id, + n: 100000, + s: query.s || 8 + } + return request( + 'POST', `http://music.163.com/weapi/v3/playlist/detail`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_hot.js b/module/playlist_hot.js new file mode 100644 index 0000000..bda73b5 --- /dev/null +++ b/module/playlist_hot.js @@ -0,0 +1,8 @@ +// 热门歌单分类 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/playlist/hottags`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_subscribe.js b/module/playlist_subscribe.js new file mode 100644 index 0000000..be2ac35 --- /dev/null +++ b/module/playlist_subscribe.js @@ -0,0 +1,12 @@ +// 收藏与取消收藏歌单 + +module.exports = (query, request) => { + query.t = (query.t == 1 ? 'subscribe' : 'unsubscribe') + const data = { + id: query.id + } + return request( + 'POST', `http://music.163.com/weapi/playlist/${query.t}`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_tracks.js b/module/playlist_tracks.js new file mode 100644 index 0000000..a612232 --- /dev/null +++ b/module/playlist_tracks.js @@ -0,0 +1,13 @@ +// 收藏单曲到歌单 从歌单删除歌曲 + +module.exports = (query, request) => { + const data = { + op: query.op, // del,add + pid: query.pid, // 歌单id + trackIds: '[' + query.tracks + ']' // 歌曲id + } + return request( + 'POST', `http://music.163.com/weapi/playlist/manipulate/tracks`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/playlist_update.js b/module/playlist_update.js new file mode 100644 index 0000000..ade75be --- /dev/null +++ b/module/playlist_update.js @@ -0,0 +1,16 @@ +// 编辑歌单 + +module.exports = (query, request) => { + query.cookie.os = 'pc' + query.desc = query.desc || '' + query.tags = query.tags || '' + const data = { + "/api/playlist/desc/update": `{"id":${query.id},"desc":"${query.desc}"}`, + "/api/playlist/tags/update": `{"id":${query.id},"tags":"${query.tags}"}`, + "/api/playlist/update/name": `{"id":${query.id},"name":"${query.name}"}` + } + return request( + 'POST', `http://music.163.com/weapi/batch`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/program_recommend.js b/module/program_recommend.js new file mode 100644 index 0000000..55f7a6e --- /dev/null +++ b/module/program_recommend.js @@ -0,0 +1,13 @@ +// 推荐节目 + +module.exports = (query, request) => { + const data = { + cateId: query.type, + limit: query.limit || 10, + offset: query.offset || 0 + } + return request( + 'POST', `http://music.163.com/weapi/program/recommend/v1`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/recommend_resource.js b/module/recommend_resource.js new file mode 100644 index 0000000..d66913f --- /dev/null +++ b/module/recommend_resource.js @@ -0,0 +1,8 @@ +// 每日推荐歌单 + +module.exports = (query, request) => { + return request( + 'POST', `http://music.163.com/weapi/v1/discovery/recommend/resource`, {}, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/recommend_songs.js b/module/recommend_songs.js new file mode 100644 index 0000000..8804e50 --- /dev/null +++ b/module/recommend_songs.js @@ -0,0 +1,13 @@ +// 每日推荐歌曲 + +module.exports = (query, request) => { + const data = { + limit: 20, + offset: 0, + total: true + } + return request( + 'POST', `http://music.163.com/weapi/v1/discovery/recommend/songs`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/related_allvideo.js b/module/related_allvideo.js new file mode 100644 index 0000000..1d6e635 --- /dev/null +++ b/module/related_allvideo.js @@ -0,0 +1,12 @@ +// 相关视频 + +module.exports = (query, request) => { + const data = { + id: query.id, + type: (/^\d+$/.test(query.id)) ? 0 : 1 + } + return request( + 'POST', `http://music.163.com/weapi/cloudvideo/v1/allvideo/rcmd`, data, + {crypto: 'weapi', cookie: query.cookie, proxy: query.proxy} + ) +} \ No newline at end of file diff --git a/module/related_playlist.js b/module/related_playlist.js new file mode 100644 index 0000000..c7431ee --- /dev/null +++ b/module/related_playlist.js @@ -0,0 +1,32 @@ +// 相关歌单 + +module.exports = (query, request) => { + return request( + 'GET', `http://music.163.com/playlist?id=${query.id}`, {}, + {ua: 'pc', cookie: query.cookie, proxy: query.proxy} + ) + .then(response => { + try{ + const pattern = /