diff --git a/app.js b/app.js index 4b47bf8d8a166cc7bc28f25ba4863fabdb088f8d..7bd789ac665f21b2e805df0d1880ee0a39599159 100644 --- a/app.js +++ b/app.js @@ -45,11 +45,20 @@ app.use(express.static(path.resolve(__dirname, 'public'))) app.use(function(req, res, next) { const proxy = req.query.proxy if (proxy) { - req.headers.cookie = req.headers.cookie + `__proxy__${proxy}` + req.headers.cookie += `__proxy__${proxy}` } next() }) +// 补全缺失的cookie +const { completeCookie } = require('./util/init') +app.use(function(req, res, next) { + let cookie = completeCookie(req.headers.cookie) + req.headers.cookie = cookie.map(x => x[0]).concat(req.headers.cookie || []).join('; ') + res.append('Set-Cookie', cookie.map(x => (x.concat('Path=/').join('; ')))) + next() +}) + // 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理 const UnusualRouteFileMap = { // key 为文件名, value 为对外注册的路由 diff --git a/router/login.js b/router/login.js index ac914ef90b1b092495ce6c0c45dcfee0e9289b65..3fea72ac4ceca0f70cd3a937fcf68a4373e1db28 100644 --- a/router/login.js +++ b/router/login.js @@ -21,10 +21,7 @@ module.exports = (req, res, createWebAPIRequest, request) => { cookie, (music_req, cookie) => { // console.log(music_req) - cookie = cookie && cookie.map(x => x.replace('Domain=.music.163.com', '')) - res.set({ - 'Set-Cookie': cookie - }) + res.append("Set-Cookie", cookie) res.send(music_req) }, err => res.status(502).send('fetch error') diff --git a/router/loginCellphone.js b/router/loginCellphone.js index ab6dffb4dbb149ded3fe5dac17f234349c8654ce..89729c6bef0e026a30ebcdcb7d1caa88c1aa6c5b 100644 --- a/router/loginCellphone.js +++ b/router/loginCellphone.js @@ -17,15 +17,8 @@ module.exports = (req, res, createWebAPIRequest, request) => { "POST", data, cookie, - (music_req, cookie = []) => { - const cookieStr = - "appver=1.5.9;os=osx; channel=netease;osver=%E7%89%88%E6%9C%AC%2010.13.2%EF%BC%88%E7%89%88%E5%8F%B7%2017C88%EF%BC%89"; - cookieStr.split(";").forEach(item => { - cookie.push(item + ";Path=/"); - }); - res.set({ - "Set-Cookie": cookie - }); + (music_req, cookie) => { + res.append("Set-Cookie", cookie); res.send(music_req); }, err => res.status(502).send("fetch error") diff --git a/router/login_refresh.js b/router/login_refresh.js index 3e71cfeae50d7621aab8c117925da1588e7002d2..4aac6970a959fa1f17aa55fd7ecf668a29d6974c 100644 --- a/router/login_refresh.js +++ b/router/login_refresh.js @@ -11,9 +11,7 @@ module.exports = (req, res, createWebAPIRequest, request) => { data, cookie, (music_req, cookie) => { - res.set({ - "Set-Cookie": cookie - }); + res.append("Set-Cookie", cookie); res.send(music_req); }, err => res.status(502).send("fetch error") diff --git a/util/init.js b/util/init.js index afa10f962aae22057d146d3b61e19c7d2652ad53..bf36199f418408176eaec4ac5ecb4ac4002a7229 100644 --- a/util/init.js +++ b/util/init.js @@ -1,16 +1,30 @@ function randomString(pattern, length){ - return Array.apply(null, {length: length}).map(() => (pattern[Math.floor(Math.random() * pattern.length)])).join(''); + return Array.apply(null, {length: length}).map(() => (pattern[Math.floor(Math.random() * pattern.length)])).join('') } -function generateCookie(){ - const jsessionid = randomString('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ\\/+',176) + ':' + (new Date).getTime(); - const nuid = randomString('0123456789abcdefghijklmnopqrstuvwxyz',32); - return { - 'JSESSIONID-WYYY': jsessionid, - '_iuqxldmzr_': 32, - '_ntes_nnid': nuid + ',' + (new Date).getTime(), - '_ntes_nuid': nuid +function completeCookie(cookie){ + let origin = (cookie || '').split(/;\s*/).map(element => (element.split('=')[0])), extra = [] + let now = (new Date).getTime() + + if(!origin.includes('JSESSIONID-WYYY')){ + let expire = new Date(now + 1800000) //30 minutes + let jessionid = randomString('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ\\/+',176) + ':' + expire.getTime() + extra.push(['JSESSIONID-WYYY=' + jessionid, 'Expires=' + expire.toGMTString()]) + } + if(!origin.includes('_iuqxldmzr_')){ + let expire = new Date(now + 157680000000) //5 years + extra.push(['_iuqxldmzr_=32', 'Expires=' + expire.toGMTString()]) } + if((!origin.includes('_ntes_nnid'))||(!origin.includes('_ntes_nuid'))){ + let expire = new Date(now + 3153600000000) //100 years + let nnid = randomString('0123456789abcdefghijklmnopqrstuvwxyz',32) + ',' + now + extra.push(['_ntes_nnid=' + nnid, 'Expires=' + expire.toGMTString()]) + extra.push(['_ntes_nuid=' + nnid.slice(0,32), 'Expires=' + expire.toGMTString()]) + } + + return extra } -module.exports = generateCookie \ No newline at end of file +module.exports = { + completeCookie +} \ No newline at end of file diff --git a/util/util.js b/util/util.js index 4ce6cda6f2d44a3f2828f38d8336c8566908ef38..5a37aff6ffae6f6b3a659824878943088b5e4d3e 100644 --- a/util/util.js +++ b/util/util.js @@ -1,7 +1,6 @@ const Encrypt = require("./crypto.js"); const request = require("request"); const queryString = require("querystring"); -const randomCookie = require("./init.js"); request.debug = true; @@ -48,15 +47,6 @@ function createWebAPIRequest( const proxy = cookie.split("__proxy__")[1]; cookie = cookie.split("__proxy__")[0]; - - const jsCookie = randomCookie(); - const missingCookie = []; - for (let key in jsCookie){ - if (cookie.indexOf(key) == -1){ - missingCookie.push(`${key}=${jsCookie[key]}`); - } - } - cookie = cookie.split(/;\s*/).concat(missingCookie).join("; "); const encryptedData = Encrypt(data); const options = { @@ -87,15 +77,8 @@ function createWebAPIRequest( console.error(error); errorCallback(error); } else { - //解决 网易云 cookie 添加 .music.163.com 域设置。 - //如: Domain=.music.163.com - let cookie = res.headers["set-cookie"]; - if (Array.isArray(cookie)) { - cookie = cookie - .map(x => x.replace(/.music.163.com/g, "")) - .sort((a, b) => a.length - b.length); - cookie = cookie.concat(missingCookie.map(x => x + '; Expires=' + (new Date((new Date).getTime() + 157680000000)).toGMTString())); - } + let cookie = res.headers["set-cookie"] || []; + cookie = cookie.map(x => x.replace(/\s*Domain=[^(;|$)]+;*/, "")); callback(body, cookie); } });