From 18c9ebe51ee93eaa1df9bd36515b5c86094ed7a0 Mon Sep 17 00:00:00 2001 From: overwriter <9856mmm@gmail.com> Date: Sun, 6 Oct 2024 11:48:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E7=9A=84ua?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/artist_detail.js | 2 +- module/login.js | 5 +---- module/login_cellphone.js | 9 +++++---- module/login_refresh.js | 5 +---- module/logout.js | 9 +-------- module/search_hot.js | 5 +---- util/request.js | 25 ++++++++++++++----------- 7 files changed, 24 insertions(+), 36 deletions(-) diff --git a/module/artist_detail.js b/module/artist_detail.js index 0643642..9d59a86 100644 --- a/module/artist_detail.js +++ b/module/artist_detail.js @@ -5,6 +5,6 @@ module.exports = (query, request) => { { id: query.id, }, - createOption(query, 'weapi'), + createOption(query), ) } diff --git a/module/login.js b/module/login.js index 916bc18..ed46db4 100644 --- a/module/login.js +++ b/module/login.js @@ -11,10 +11,7 @@ module.exports = async (query, request) => { password: query.md5_password || CryptoJS.MD5(query.password).toString(), rememberLogin: 'true', } - let result = await request(`/api/w/login`, data, { - ...createOption(query), - uaType: 'pc', - }) + let result = await request(`/api/w/login`, data, createOption(query)) if (result.body.code === 502) { return { status: 200, diff --git a/module/login_cellphone.js b/module/login_cellphone.js index de19fd4..7702161 100644 --- a/module/login_cellphone.js +++ b/module/login_cellphone.js @@ -15,10 +15,11 @@ module.exports = async (query, request) => { : query.md5_password || CryptoJS.MD5(query.password).toString(), rememberLogin: 'true', } - let result = await request(`/api/w/login/cellphone`, data, { - ...createOption(query), - uaType: 'pc', - }) + let result = await request( + `/api/w/login/cellphone`, + data, + createOption(query), + ) if (result.body.code === 200) { result = { diff --git a/module/login_refresh.js b/module/login_refresh.js index f549219..9c8f1f4 100644 --- a/module/login_refresh.js +++ b/module/login_refresh.js @@ -5,10 +5,7 @@ module.exports = async (query, request) => { let result = await request( `/api/login/token/refresh`, {}, - { - ...createOption(query, 'eapi'), - uaType: 'pc', - }, + createOption(query), ) if (result.body.code === 200) { result = { diff --git a/module/logout.js b/module/logout.js index a68da25..9f5b3dd 100644 --- a/module/logout.js +++ b/module/logout.js @@ -2,12 +2,5 @@ const createOption = require('../util/option.js') module.exports = (query, request) => { - return request( - `/api/logout`, - {}, - { - ...createOption(query, 'weapi'), - uaType: 'pc', - }, - ) + return request(`/api/logout`, {}, createOption(query)) } diff --git a/module/search_hot.js b/module/search_hot.js index 0b4a362..1581043 100644 --- a/module/search_hot.js +++ b/module/search_hot.js @@ -5,8 +5,5 @@ module.exports = (query, request) => { const data = { type: 1111, } - return request(`/api/search/hot`, data, { - ...createOption(query, 'weapi'), - uaType: 'mobile', - }) + return request(`/api/search/hot`, data, createOption(query)) } diff --git a/util/request.js b/util/request.js index 292f76f..b18e79a 100644 --- a/util/request.js +++ b/util/request.js @@ -18,16 +18,19 @@ const iosAppVersion = '9.0.65' const { APP_CONF } = require('../util/config.json') // request.debug = true // 开启可看到更详细信息 -const chooseUserAgent = (uaType) => { +const chooseUserAgent = (crypto, uaType = 'pc') => { const userAgentMap = { - mobile: - 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1', - pc: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', + weapi: { + pc: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0', + }, + api: { + pc: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Chrome/91.0.4472.164 NeteaseMusicDesktop/3.0.18.203152', + android: + 'NeteaseMusic/9.1.65.240927161425(9001065);Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)', + ios: 'NeteaseMusic 9.0.90/5038 (iPhone; iOS 16.2; zh_CN)', + }, } - if (uaType === 'mobile') { - return userAgentMap.mobile - } - return userAgentMap.pc + return userAgentMap[crypto][uaType] || '' } const createRequest = (uri, data, options) => { const cookie = options.cookie || {} @@ -85,7 +88,7 @@ const createRequest = (uri, data, options) => { switch (crypto) { case 'weapi': headers['Referer'] = APP_CONF.domain - headers['User-Agent'] = options.ua || chooseUserAgent('pc') + headers['User-Agent'] = options.ua || chooseUserAgent('weapi') data.csrf_token = csrfToken encryptData = encrypt.weapi(data) url = APP_CONF.domain + '/weapi/' + uri.substr(5) @@ -116,7 +119,7 @@ const createRequest = (uri, data, options) => { buildver: cookie.buildver || Date.now().toString().substr(0, 10), resolution: cookie.resolution || '1920x1080', //设备分辨率 __csrf: csrfToken, - channel: cookie.channel || '', + channel: cookie.channel || 'netease', requestId: `${Date.now()}_${Math.floor(Math.random() * 1000) .toString() .padStart(4, '0')}`, @@ -129,7 +132,7 @@ const createRequest = (uri, data, options) => { encodeURIComponent(key) + '=' + encodeURIComponent(header[key]), ) .join('; ') - headers['User-Agent'] = options.ua || chooseUserAgent(options.uaType) + headers['User-Agent'] = options.ua || chooseUserAgent('api') if (crypto === 'eapi') { // 使用eapi加密 From 9d3828b3c13f1378d9cca63911aeba0c7958bd3f Mon Sep 17 00:00:00 2001 From: overwriter <9856mmm@gmail.com> Date: Sun, 6 Oct 2024 16:12:55 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20cookie=E6=B7=BB=E5=8A=A0=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/request.js | 69 +++++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/util/request.js b/util/request.js index b18e79a..7d8268c 100644 --- a/util/request.js +++ b/util/request.js @@ -14,10 +14,27 @@ const anonymous_token = fs.readFileSync( 'utf-8', ) const { URLSearchParams, URL } = require('url') -const iosAppVersion = '9.0.65' const { APP_CONF } = require('../util/config.json') // request.debug = true // 开启可看到更详细信息 +const osMap = { + pc: { + os: 'pc', + appver: '3.0.18.203152', + osver: 'Microsoft-Windows-10-Professional-build-22631-64bit', + }, + android: { + os: 'android', + appver: '8.20.20.231215173437', + osver: '14', + }, + iphone: { + os: 'iOS', + appver: '9.0.90', + osver: '16.2', + }, +} + const chooseUserAgent = (crypto, uaType = 'pc') => { const userAgentMap = { weapi: { @@ -27,13 +44,13 @@ const chooseUserAgent = (crypto, uaType = 'pc') => { pc: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 Chrome/91.0.4472.164 NeteaseMusicDesktop/3.0.18.203152', android: 'NeteaseMusic/9.1.65.240927161425(9001065);Dalvik/2.1.0 (Linux; U; Android 14; 23013RK75C Build/UKQ1.230804.001)', - ios: 'NeteaseMusic 9.0.90/5038 (iPhone; iOS 16.2; zh_CN)', + iphone: 'NeteaseMusic 9.0.90/5038 (iPhone; iOS 16.2; zh_CN)', }, } return userAgentMap[crypto][uaType] || '' } const createRequest = (uri, data, options) => { - const cookie = options.cookie || {} + let cookie = options.cookie || {} return new Promise((resolve, reject) => { options.headers = options.headers || {} let headers = options.headers @@ -44,31 +61,34 @@ const createRequest = (uri, data, options) => { headers['X-Forwarded-For'] = ip } // headers['X-Real-IP'] = '118.88.88.88' - if (typeof options.cookie === 'object') { - options.cookie = { - ...options.cookie, - __remember_me: true, + if (typeof cookie === 'object') { + let _ntes_nuid = CryptoJS.lib.WordArray.random(32).toString() + let os = osMap[cookie.os] || osMap['pc'] + cookie = { + ...cookie, + __remember_me: 'true', // NMTID: CryptoJS.lib.WordArray.random(16).toString(), - _ntes_nuid: CryptoJS.lib.WordArray.random(16).toString(), + ntes_kaola_ad: '1', + _ntes_nuid: _ntes_nuid, + _ntes_nnid: `${_ntes_nuid},${Date.now().toString()}`, + + osver: cookie.osver || os.osver, + deviceId: cookie.deviceId || global.deviceId, + os: cookie.os || os.os, + channel: cookie.channel || 'netease', + appver: cookie.appver || os.appver, } if (uri.indexOf('login') === -1) { - options.cookie['NMTID'] = CryptoJS.lib.WordArray.random(16).toString() + cookie['NMTID'] = CryptoJS.lib.WordArray.random(16).toString() } - if (!options.cookie.MUSIC_U) { + if (!cookie.MUSIC_U) { // 游客 - if (!options.cookie.MUSIC_A) { - options.cookie.MUSIC_A = anonymous_token + if (!cookie.MUSIC_A) { + cookie.MUSIC_A = anonymous_token } } - headers['Cookie'] = cookieObjToString(options.cookie) - } else if (options.cookie) { - // cookie string - headers['Cookie'] = options.cookie - } else { - const cookie = cookieToJson('__remember_me=true; NMTID=xxx') headers['Cookie'] = cookieObjToString(cookie) } - // console.log(options.cookie, headers['Cookie']) let url = '', encryptData = '', @@ -108,18 +128,17 @@ const createRequest = (uri, data, options) => { case 'eapi': case 'api': // 两种加密方式,都应生成客户端的cookie - const cookie = options.cookie || {} const header = { - osver: cookie.osver || '17.4.1', //系统版本 - deviceId: cookie.deviceId || global.deviceId, - os: cookie.os || 'ios', - appver: cookie.appver || (cookie.os != 'pc' ? iosAppVersion : ''), // app版本 + osver: cookie.osver, //系统版本 + deviceId: cookie.deviceId, + os: cookie.os, + appver: cookie.appver, // app版本 versioncode: cookie.versioncode || '140', //版本号 mobilename: cookie.mobilename || '', //设备model buildver: cookie.buildver || Date.now().toString().substr(0, 10), resolution: cookie.resolution || '1920x1080', //设备分辨率 __csrf: csrfToken, - channel: cookie.channel || 'netease', + channel: cookie.channel, requestId: `${Date.now()}_${Math.floor(Math.random() * 1000) .toString() .padStart(4, '0')}`, From 7e2683c6601ddd4eab651dc4a828b5dce402bd52 Mon Sep 17 00:00:00 2001 From: overwriter <9856mmm@gmail.com> Date: Sun, 6 Oct 2024 16:29:09 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20os=E4=BD=BF=E7=94=A8iphone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/request.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/request.js b/util/request.js index 7d8268c..bb32bf2 100644 --- a/util/request.js +++ b/util/request.js @@ -63,7 +63,7 @@ const createRequest = (uri, data, options) => { // headers['X-Real-IP'] = '118.88.88.88' if (typeof cookie === 'object') { let _ntes_nuid = CryptoJS.lib.WordArray.random(32).toString() - let os = osMap[cookie.os] || osMap['pc'] + let os = osMap[cookie.os] || osMap['iphone'] cookie = { ...cookie, __remember_me: 'true', @@ -122,7 +122,7 @@ const createRequest = (uri, data, options) => { url: APP_CONF.apiDomain + uri, params: data, }) - url = 'https://music.163.com/api/linux/forward' + url = APP_CONF.apiDomain + '/api/linux/forward' break case 'eapi':