Merge pull request #243 from cXp1r/main

fix: 修正NMTID来源
This commit is contained in:
Takanashi Hoshino
2026-08-25 12:22:34 +08:00
committed by GitHub
+45 -16
View File
@@ -68,6 +68,9 @@ const WNMCID = (function () {
return `${randomString}.${now().toString()}.01.0` return `${randomString}.${now().toString()}.01.0`
})() })()
let NMTID = ''
let NMTID_RETRIES_LEFT = 3
// 预先定义osMap // 预先定义osMap
const osMap = { const osMap = {
pc: { pc: {
@@ -136,7 +139,7 @@ const chooseUserAgent = (crypto, uaType = 'pc') => {
} }
// cookie处理 // cookie处理
const processCookieObject = (cookie, uri) => { const processCookieObject = (cookie, crypto) => {
const _ntes_nuid = CryptoJS.lib.WordArray.random(32).toString() const _ntes_nuid = CryptoJS.lib.WordArray.random(32).toString()
const os = osMap[cookie.os] || osMap['pc'] const os = osMap[cookie.os] || osMap['pc']
@@ -155,8 +158,14 @@ const processCookieObject = (cookie, uri) => {
appver: cookie.appver || os.appver, appver: cookie.appver || os.appver,
} }
if (uri.indexOf('login') === -1) { // 服务端下发条件为不带NMTID请求任意eapi加密方式接口
processedCookie['NMTID'] = CryptoJS.lib.WordArray.random(16).toString() if (cookie.NMTID) {
processedCookie['NMTID'] = cookie.NMTID
} else if (NMTID) {
processedCookie['NMTID'] = NMTID
} else if (NMTID_RETRIES_LEFT <= 0 || crypto !== 'eapi') {
processedCookie['NMTID'] =
'00O' + CryptoJS.lib.WordArray.random(19).toString()
} }
if (!processedCookie.MUSIC_U) { if (!processedCookie.MUSIC_U) {
@@ -205,6 +214,12 @@ const createRequest = async (uri, data, options) => {
const headers = options.headers ? { ...options.headers } : {} const headers = options.headers ? { ...options.headers } : {}
const ip = options.realIP || options.ip || '' const ip = options.realIP || options.ip || ''
// 加密方式选择
let crypto = options.crypto
if (crypto === '') {
crypto = APP_CONF.encrypt ? 'eapi' : 'api'
}
// IP头设置 // IP头设置
if (ip) { if (ip) {
headers['X-Real-IP'] = ip headers['X-Real-IP'] = ip
@@ -217,19 +232,13 @@ const createRequest = async (uri, data, options) => {
} }
if (typeof cookie === 'object') { if (typeof cookie === 'object') {
cookie = processCookieObject(cookie, uri) cookie = processCookieObject(cookie, crypto)
headers['Cookie'] = cookieObjToString(cookie) headers['Cookie'] = cookieObjToString(cookie)
} }
let url = '' let url = ''
let encryptData = '' let encryptData = ''
let crypto = options.crypto
const csrfToken = cookie['__csrf'] || '' const csrfToken = cookie['__csrf'] || ''
// 加密方式选择
if (crypto === '') {
crypto = APP_CONF.encrypt ? 'eapi' : 'api'
}
const answer = { status: 500, body: {}, cookie: [] } const answer = { status: 500, body: {}, cookie: [] }
data.e_r = toBoolean( data.e_r = toBoolean(
@@ -332,9 +341,8 @@ const createRequest = async (uri, data, options) => {
if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U if (cookie.MUSIC_U) header['MUSIC_U'] = cookie.MUSIC_U
if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A if (cookie.MUSIC_A) header['MUSIC_A'] = cookie.MUSIC_A
if (options.checkToken) { if (options.checkToken) header['X-antiCheatToken'] = token
header['X-antiCheatToken'] = token if (crypto === 'eapi' && cookie.NMTID) header['NMTID'] = cookie.NMTID
}
headers['Cookie'] = createHeaderCookie(header) headers['Cookie'] = createHeaderCookie(header)
headers['User-Agent'] = headers['User-Agent'] =
@@ -420,9 +428,30 @@ const createRequest = async (uri, data, options) => {
axios(settings) axios(settings)
.then((res) => { .then((res) => {
const body = res.data const body = res.data
answer.cookie = (res.headers['set-cookie'] || []).map((x) => const setCookies = res.headers['set-cookie'] || []
x.replace(/\s*Domain=[^(;|$)]+;*/, ''),
) const cleanCookie = (x) => x.replace(/\s*Domain=[^(;|$)]+;*/, '')
// 仅对真正未携带 NMTID 的探测请求采集并消耗重试次数
if (
crypto === 'eapi' &&
!NMTID &&
NMTID_RETRIES_LEFT > 0 &&
!cookie.NMTID
) {
NMTID_RETRIES_LEFT--
answer.cookie = setCookies.map((x) => {
const cleaned = cleanCookie(x)
const match = x.match(/(?:^|;\s*)NMTID=([^;]+)/)
if (match) {
//不需要处理竞争, 官方客户端真实操作
NMTID = match[1]
}
return cleaned
})
} else {
answer.cookie = setCookies.map(cleanCookie)
}
// debug: 统一注释块,需要时取消注释查看请求/返回的原始密文 // debug: 统一注释块,需要时取消注释查看请求/返回的原始密文