refactor: 调整加密请求数据的代码结构;添加一些注释

This commit is contained in:
overwriter 2024-07-13 08:46:45 +08:00
parent 656a69e07e
commit 8de3e9fa66

View File

@ -85,80 +85,91 @@ const createRequest = (method, uri, data = {}, options) => {
} }
// console.log(options.cookie, headers['Cookie']) // console.log(options.cookie, headers['Cookie'])
let url = '' let url = '',
let encryptData = '' encryptData = '',
// 目前任意uri都支持三种加密方式 crypto = options.crypto
if (options.crypto === 'weapi') { // 根据加密方式加密请求数据目前任意uri都支持四种加密方式
headers['Referer'] = 'https://music.163.com' switch (crypto) {
headers['User-Agent'] = options.ua || chooseUserAgent('pc') case 'weapi':
let csrfToken = (headers['Cookie'] || '').match(/_csrf=([^(;|$)]+)/) headers['Referer'] = 'https://music.163.com'
data.csrf_token = csrfToken ? csrfToken[1] : '' headers['User-Agent'] = options.ua || chooseUserAgent('pc')
encryptData = encrypt.weapi(data) let csrfTokenList = (headers['Cookie'] || '').match(/_csrf=([^(;|$)]+)/)
url = APP_CONF.domain + '/weapi/' + uri.substr(5) data.csrf_token = csrfTokenList ? csrfTokenList[1] : ''
} else if (options.crypto === 'linuxapi') { encryptData = encrypt.weapi(data)
headers['User-Agent'] = url = APP_CONF.domain + '/weapi/' + uri.substr(5)
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36' break
encryptData = encrypt.linuxapi({
method: method,
url: APP_CONF.apiDomain + uri,
params: data,
})
url = 'https://music.163.com/api/linux/forward'
} else if (
options.crypto === 'eapi' ||
options.crypto === 'api' ||
options.crypto === ''
) {
// 两种加密方式都应生成客户端的cookie
const cookie = options.cookie || {}
const csrfToken = cookie['__csrf'] || ''
const header = {
osver: cookie.osver || '17.4.1', //系统版本
deviceId: cookie.deviceId || global.deviceId,
appver: cookie.appver || iosAppVersion, // app版本
versioncode: cookie.versioncode || '140', //版本号
mobilename: cookie.mobilename || '', //设备model
buildver: cookie.buildver || Date.now().toString().substr(0, 10),
resolution: cookie.resolution || '1920x1080', //设备分辨率
__csrf: csrfToken,
os: cookie.os || 'ios',
channel: cookie.channel || '',
requestId: `${Date.now()}_${Math.floor(Math.random() * 1000)
.toString()
.padStart(4, '0')}`,
}
if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U
if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A
headers['Cookie'] = Object.keys(header)
.map(
(key) =>
encodeURIComponent(key) + '=' + encodeURIComponent(header[key]),
)
.join('; ')
let eapiEncrypt = () => { case 'linuxapi':
data.header = header headers['User-Agent'] =
encryptData = encrypt.eapi(uri, data) 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'
url = APP_CONF.apiDomain + '/eapi/' + uri.substr(5) encryptData = encrypt.linuxapi({
data.e_r = data.e_r != undefined ? data.e_r : APP_CONF.encryptResponse // 用于加密eapi接口的返回值 method: method,
} url: APP_CONF.apiDomain + uri,
if (options.crypto === 'eapi') { params: data,
eapiEncrypt() })
} else if (options.crypto === 'api') { url = 'https://music.163.com/api/linux/forward'
url = APP_CONF.apiDomain + uri break
encryptData = data
} else if (options.crypto === '') { case 'eapi':
// 加密方式为空,以配置文件的加密方式为准 case 'api':
if (APP_CONF.encrypt) { case '':
eapiEncrypt() // 两种加密方式都应生成客户端的cookie
} else { const cookie = options.cookie || {}
const csrfToken = cookie['__csrf'] || ''
const header = {
osver: cookie.osver || '17.4.1', //系统版本
deviceId: cookie.deviceId || global.deviceId,
appver: cookie.appver || iosAppVersion, // app版本
versioncode: cookie.versioncode || '140', //版本号
mobilename: cookie.mobilename || '', //设备model
buildver: cookie.buildver || Date.now().toString().substr(0, 10),
resolution: cookie.resolution || '1920x1080', //设备分辨率
__csrf: csrfToken,
os: cookie.os || 'ios',
channel: cookie.channel || '',
requestId: `${Date.now()}_${Math.floor(Math.random() * 1000)
.toString()
.padStart(4, '0')}`,
}
if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U
if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A
headers['Cookie'] = Object.keys(header)
.map(
(key) =>
encodeURIComponent(key) + '=' + encodeURIComponent(header[key]),
)
.join('; ')
let eapi = () => {
// 使用eapi加密
data.header = header
encryptData = encrypt.eapi(uri, data)
url = APP_CONF.apiDomain + '/eapi/' + uri.substr(5)
data.e_r = data.e_r != undefined ? data.e_r : APP_CONF.encryptResponse // 用于加密接口返回值
}
let api = () => {
// 不使用任何加密
url = APP_CONF.apiDomain + uri url = APP_CONF.apiDomain + uri
encryptData = data encryptData = data
} }
} if (crypto === 'eapi') {
} else { eapi()
// 未知的加密方式 } else if (crypto === 'api') {
console.log('[ERR]', 'Unknown Crypto:', options.crypto) api()
} else if (crypto === '') {
// 加密方式为空,以配置文件的加密方式为准
if (APP_CONF.encrypt) {
eapi()
} else {
api()
}
}
break
default:
// 未知的加密方式
console.log('[ERR]', 'Unknown Crypto:', crypto)
break
} }
const answer = { status: 500, body: {}, cookie: [] } const answer = { status: 500, body: {}, cookie: [] }
// console.log(headers, 'headers') // console.log(headers, 'headers')
@ -216,7 +227,7 @@ const createRequest = (method, uri, data = {}, options) => {
) )
try { try {
if (data.e_r) { if (data.e_r) {
// eapi接口返回值被加密 // eapi接口返回值被加密,需要解密
answer.body = encrypt.eapiResDecrypt( answer.body = encrypt.eapiResDecrypt(
body.toString('hex').toUpperCase(), body.toString('hex').toUpperCase(),
) )