提交 7aca52e1 编写于 作者: B binaryify 提交者: GitHub

Merge pull request #340 from nondanee/bandage

国庆节大礼包😳
......@@ -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
}
let route
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))))
})
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
......
// 专辑内容
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
// 歌手专辑列表
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
// 歌手介绍
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
// 歌手分类
/*
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
// 歌手相关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
// 收藏与取消收藏歌手
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
// 我的歌手列表
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
// 歌手单曲
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
// 首页轮播图
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
// 歌曲可用性
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
// 发送与删除评论
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
// 专辑评论
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
// 电台评论
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
// 热门评论
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
// 点赞与取消点赞评论
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
// 歌曲评论
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
// 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
// 歌单评论
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
// 视频评论
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
// 签到
/*
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
// 电台分类列表
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
// 电台详情
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
// 热门电台
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
// 付费电台
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
// 电台节目列表
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
// 电台节目详情
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
// 精选电台
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/djradio/recommend/v1`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
// 精选电台分类
/*
有声书 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
// 订阅与取消电台
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
// 我的电台列表
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
// 动态
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
// 垃圾桶
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
// 关注与取消关注用户
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
// 红心取消红心歌曲
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
// 喜欢的歌曲(无序)
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
// 邮箱登录
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
// 手机登录
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
// 登录刷新
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
// 登录状态
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
// 退出登录
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
// 歌词
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
// 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
// 最新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
// 收藏与取消收藏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
// 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
// 私人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
// 推荐歌单
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
// 推荐电台
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
// 推荐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
// 推荐新歌
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
// 独家放送
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
// 全部歌单分类
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
// 创建歌单
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
// 歌单详情
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
// 热门歌单分类
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
// 收藏与取消收藏歌单
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
// 收藏单曲到歌单 从歌单删除歌曲
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
// 编辑歌单
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
// 推荐节目
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
// 每日推荐歌单
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
// 每日推荐歌曲
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
// 相关视频
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
// 相关歌单
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 = /<div class="cver u-cover u-cover-3">[\s\S]*?<img src="([^"]+)">[\s\S]*?<a class="sname f-fs1 s-fc0" href="([^"]+)"[^>]*>([^<]+?)<\/a>[\s\S]*?<a class="nm nm f-thide s-fc3" href="([^"]+)"[^>]*>([^<]+?)<\/a>/g;
let result, playlists = []
while((result = pattern.exec(response.body)) != null){
playlists.push({
creator: {
userId: result[4].slice('/user/home?id='.length),
nickname: result[5]
},
coverImgUrl: result[1].slice(0,-('?param=50y50'.length)),
name: result[3],
id: result[2].slice('/playlist?id='.length)
})
}
response.body = {code: 200, playlists: playlists}
return response
}
catch(err){
response.status = 500
response.body = {code: 500, msg: err.stack}
return Promise.reject(response)
}
})
}
// 点赞与取消点赞资源
module.exports = (query, request) => {
query.t = (query.t == 1 ? 'like' : 'unlike')
query.type = {
1: 'R_MV_5_', // MV
4: 'A_DJ_1_', // 电台
5: 'R_VI_62_' // 视频
}[query.type]
const data = {
threadId: query.type + query.id
}
return request(
'POST', `http://music.163.com/weapi/resource/${query.t}`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 搜索
module.exports = (query, request) => {
const data = {
s: query.keywords,
type: query.type || 1, // 1: 单曲, 10: 专辑, 100: 歌手, 1000: 歌单, 1002: 用户, 1004: MV, 1006: 歌词, 1009: 电台, 1014: 视频
limit: query.limit || 30,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/search/get`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 热门搜索
module.exports = (query, request) => {
const data = {
type: 1111
}
return request(
'POST', `http://music.163.com/weapi/search/hot`, data,
{crypto: 'weapi', ua: 'mobile', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 多类型搜索
module.exports = (query, request) => {
const data = {
type: query.type || 1,
s: query.keywords || ''
}
return request(
'POST', `http://music.163.com/weapi/search/suggest/multimatch`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 搜索建议
module.exports = (query, request) => {
const data = {
s: query.keywords || ''
}
return request(
'POST', `http://music.163.com/weapi/search/suggest/web`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 私信歌单
module.exports = (query, request) => {
const data = {
id: query.playlist,
type: 'playlist',
msg: query.msg,
userIds: '[' + query.user_ids + ']'
}
return request(
'POST', `http://music.163.com/weapi/msg/private/send`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 私信
module.exports = (query, request) => {
const data = {
id: query.playlist,
type: 'text',
msg: query.msg,
userIds: '[' + query.user_ids + ']'
}
return request(
'POST', `http://music.163.com/weapi/msg/private/send`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 相似歌手
module.exports = (query, request) => {
const data = {
artistid: query.id
}
return request(
'POST', `http://music.163.com/weapi/discovery/simiArtist`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 相似MV
module.exports = (query, request) => {
const data = {
mvid: query.mvid
}
return request(
'POST', `http://music.163.com/weapi/discovery/simiMV`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 相似歌单
module.exports = (query, request) => {
const data = {
songid: query.id,
limit: query.limit || 50,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/discovery/simiPlaylist`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 相似歌曲
module.exports = (query, request) => {
const data = {
songid: query.id,
limit: query.limit || 50,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/v1/discovery/simiSong`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 相似用户
module.exports = (query, request) => {
const data = {
songid: query.id,
limit: query.limit || 50,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/discovery/simiUser`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 歌曲详情
module.exports = (query, request) => {
query.ids = query.ids.split(/\s*,\s*/)
const data = {
c: '[' + query.ids.map(id => ('{"id":' + id + '}')).join(',') + ']',
ids: '[' + query.ids.join(',') + ']'
}
return request(
'POST', `http://music.163.com/weapi/v3/song/detail`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 歌曲链接
const crypto = require('crypto')
module.exports = (query, request) => {
if(!('MUSIC_U' in query.cookie)) query.cookie._ntes_nuid = crypto.randomBytes(16).toString("hex")
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}
)
}
\ No newline at end of file
// 新碟上架
module.exports = (query, request) => {
const data = {
area: query.type || 'ALL', // ALL,ZH,EA,KR,JP
limit: query.limit || 50,
offset: query.offset || 0,
total: true
}
return request(
'POST', `http://music.163.com/weapi/album/new`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 热门歌手
module.exports = (query, request) => {
const data = {
limit: query.limit || 50,
offset: query.offset || 0,
total: true
}
return request(
'POST', `http://music.163.com/weapi/artist/top`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 排行榜
const topList = {
0: "3779629", //云音乐新歌榜
1: "3778678", //云音乐热歌榜
2: "2884035", ///云音乐原创榜
3: "19723756", //云音乐飙升榜
4: "10520166", //云音乐电音榜
5: "180106", //UK排行榜周榜
6: "60198", //美国Billboard周榜
7: "21845217", //KTV嗨榜
8: "11641012", //iTunes榜
9: "120001", //Hit FM Top榜
10: "60131", //日本Oricon周榜
11: "3733003", //韩国Melon排行榜周榜
12: "60255", //韩国Mnet排行榜周榜
13: "46772709", //韩国Melon原声周榜
14: "112504", //中国TOP排行榜(港台榜)
15: "64016", //中国TOP排行榜(内地榜)
16: "10169002", //香港电台中文歌曲龙虎榜
17: "4395559", //华语金曲榜
18: "1899724", //中国嘻哈榜
19: "27135204", //法国 NRJ EuroHot 30周榜
20: "112463", //台湾Hito排行榜
21: "3812895", //Beatport全球电子舞曲榜
22: "71385702", //云音乐ACG音乐榜
23: "991319590" //云音乐嘻哈榜
}
module.exports = (query, request) => {
const data = {
id: topList[query.idx],
n: 10000
}
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
// MV排行榜
module.exports = (query, request) => {
const data = {
limit: query.limit || 30,
offset: query.offset || 0,
total: true
}
return request(
'POST', `http://music.163.com/weapi/mv/toplist`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 分类歌单
module.exports = (query, request) => {
const data = {
cat: query.cat || '全部', // 全部,华语,欧美,日语,韩语,粤语,小语种,流行,摇滚,民谣,电子,舞曲,说唱,轻音乐,爵士,乡村,R&B/Soul,古典,民族,英伦,金属,朋克,蓝调,雷鬼,世界音乐,拉丁,另类/独立,New Age,古风,后摇,Bossa Nova,清晨,夜晚,学习,工作,午休,下午茶,地铁,驾车,运动,旅行,散步,酒吧,怀旧,清新,浪漫,性感,伤感,治愈,放松,孤独,感动,兴奋,快乐,安静,思念,影视原声,ACG,儿童,校园,游戏,70后,80后,90后,网络歌曲,KTV,经典,翻唱,吉他,钢琴,器乐,榜单,00后
order: query.order || 'hot', // hot,new
limit: query.limit || 50,
offset: query.offset || 0,
total: true
}
return request(
'POST', `http://music.163.com/weapi/playlist/list`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 精品歌单
module.exports = (query, request) => {
const data = {
cat: query.cat || '全部', // 全部,华语,欧美,韩语,日语,粤语,小语种,运动,ACG,影视原声,流行,摇滚,后摇,古风,民谣,轻音乐,电子,器乐,说唱,古典,爵士
limit: query.limit || 50,
lasttime: query.before || 0, // 歌单updateTime
total: true
}
return request(
'POST', `http://music.163.com/weapi/playlist/highquality/list`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 最新单曲(暂时废弃?)
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/v1/discovery/new/songs`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 所有榜单介绍
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/toplist`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 歌手榜
module.exports = (query, request) => {
const data = {
type: 1,
limit: 100,
offset: 0,
total: true
}
return request(
'POST', `http://music.163.com/weapi/toplist/artist`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 所有榜单内容摘要
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/toplist/detail`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 用户创建的电台
module.exports = (query, request) => {
const data = {
userId: query.uid
}
return request(
'POST', `http://music.163.com/weapi/djradio/get/byuser`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 云盘数据
module.exports = (query, request) => {
const data = {
limit: query.limit || 200,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/v1/cloud/get`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 云盘数据详情?(暂时不要使用)
module.exports = (query, request) => {
const data = {
byids: query.id,
id: query.id
}
return request(
'POST', `http://music.163.com/weapi/v1/cloud/get/byids`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 用户详情
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/v1/user/detail/${query.uid}`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 用户电台节目
module.exports = (query, request) => {
const data = {
limit: query.limit || 30,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/dj/program/${query.uid}`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 用户动态
module.exports = (query, request) => {
const data = {
time: -1,
getcounts: true
}
return request(
'POST', `http://music.163.com/weapi/event/get/${query.uid}`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 关注TA的人(粉丝)
module.exports = (query, request) => {
const data = {
userId: query.uid,
limit: query.limit || 30,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/user/getfolloweds`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// TA关注的人(关注)
module.exports = (query, request) => {
const data = {
offset: query.offset || 0,
limit: query.limit || 30,
order: true
}
return request(
'POST', `http://music.163.com/weapi/user/getfollows/${query.uid}`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 用户歌单
module.exports = (query, request) => {
const data = {
uid: query.uid,
limit: query.limit || 30,
offset: query.offset || 0
}
return request(
'POST', `http://music.163.com/weapi/user/playlist`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 听歌排行
module.exports = (query, request) => {
const data = {
uid: query.uid,
type: query.type || 1 // 1: 最近一周, 0: 所有时间
}
return request(
'POST', `http://music.163.com/weapi/v1/play/record`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 收藏计数
module.exports = (query, request) => {
return request(
'POST', `http://music.163.com/weapi/subcount`, {},
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
// 编辑用户信息
module.exports = (query, request) => {
const data = {
avatarImgId: "0",
birthday: query.birthday,
city: query.city,
gender: query.gender,
nickname: query.nickname,
province: query.province,
signature: query.signature
}
return request(
'POST', `http://music.163.com/weapi/user/profile/update`, data,
{crypto: 'weapi', cookie: query.cookie, proxy: query.proxy}
)
}
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册