fix: 修复 cookie 解析器并也尝试从请求头读 cookie

This commit is contained in:
70CentsApple
2026-10-19 14:23:57 +08:00
parent 896a62ec96
commit 29c48e2ef9
8 changed files with 84 additions and 29 deletions
+1
View File
@@ -1,5 +1,6 @@
export interface RequestBaseConfig { export interface RequestBaseConfig {
cookie?: string cookie?: string
headers?: Record<string, string | string[]>
realIP?: string // IPv4/IPv6 filled in X-Real-IP realIP?: string // IPv4/IPv6 filled in X-Real-IP
proxy?: string // HTTP proxy proxy?: string // HTTP proxy
randomCNIP?: boolean // Whether to use a random Chinese IP address filled in X-Real-IP randomCNIP?: boolean // Whether to use a random Chinese IP address filled in X-Real-IP
+11 -2
View File
@@ -1,10 +1,19 @@
const QRCode = require('qrcode') const QRCode = require('qrcode')
const { generateChainId, hasCookie } = require('../util/index') const {
generateChainId,
getCookieHeader,
hasCookie,
} = require('../util/index')
module.exports = (query) => { module.exports = (query) => {
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
const platform = query.platform || 'pc' const platform = query.platform || 'pc'
const cookie = hasCookie(query.cookie) ? query.cookie : '' const headerCookie = getCookieHeader(query.headers)
const cookie = hasCookie(query.cookie)
? query.cookie
: hasCookie(headerCookie)
? headerCookie
: ''
// 构建基础URL // 构建基础URL
let url = `https://music.163.com/login?codekey=${query.key}` let url = `https://music.163.com/login?codekey=${query.key}`
+5 -2
View File
@@ -1,14 +1,17 @@
// 听歌打卡 // 听歌打卡
const createOption = require('../util/option.js') const createOption = require('../util/option.js')
const { hasCookie } = require('../util/index') const { getCookieHeader, hasCookie } = require('../util/index')
const { APP_CONF } = require('../util/config.json') const { APP_CONF } = require('../util/config.json')
const DOMAIN = APP_CONF.clDomian const DOMAIN = APP_CONF.clDomian
module.exports = async (query, request) => { module.exports = async (query, request) => {
// 注入 os=osx 的 cookie // 注入 os=osx 的 cookie
const headerCookie = getCookieHeader(query.headers)
let cookie = hasCookie(query.cookie) let cookie = hasCookie(query.cookie)
? query.cookie ? query.cookie
: process.env.NETEASE_COOKIE || '' : hasCookie(headerCookie)
? headerCookie
: process.env.NETEASE_COOKIE || ''
if (typeof cookie === 'object') { if (typeof cookie === 'object') {
cookie = Object.assign({ os: 'osx' }, cookie) cookie = Object.assign({ os: 'osx' }, cookie)
} else if (typeof cookie === 'string') { } else if (typeof cookie === 'string') {
+5 -2
View File
@@ -13,7 +13,7 @@ const {
buildMetaJson, buildMetaJson,
doUpload, doUpload,
} = require('../util/ncbl') } = require('../util/ncbl')
const { hasCookie } = require('../util/index') const { getCookieHeader, hasCookie } = require('../util/index')
module.exports = async (query, request) => { module.exports = async (query, request) => {
// --- 参数校验 --- // --- 参数校验 ---
@@ -33,9 +33,12 @@ module.exports = async (query, request) => {
const sourceName = query.source || 'list' const sourceName = query.source || 'list'
// --- 解析认证上下文 --- // --- 解析认证上下文 ---
const headerCookie = getCookieHeader(query.headers)
const rawCookie = hasCookie(query.cookie) const rawCookie = hasCookie(query.cookie)
? query.cookie ? query.cookie
: process.env.NETEASE_COOKIE || '' : hasCookie(headerCookie)
? headerCookie
: process.env.NETEASE_COOKIE || ''
const cookieObj = parseCookie(rawCookie) const cookieObj = parseCookie(rawCookie)
cookieObj.os = 'pc' cookieObj.os = 'pc'
const ctx = extractContext(cookieObj) const ctx = extractContext(cookieObj)
+23 -16
View File
@@ -6,7 +6,7 @@ const request = require('./util/request')
const packageJSON = require('./package.json') const packageJSON = require('./package.json')
const exec = require('child_process').exec const exec = require('child_process').exec
const cache = require('./util/apicache').middleware const cache = require('./util/apicache').middleware
const { cookieToJson } = require('./util/index') const { cookieToJson, getCookieHeader, hasCookie } = require('./util/index')
const fileUpload = require('express-fileupload') const fileUpload = require('express-fileupload')
const decode = require('safe-decode-uri-component') const decode = require('safe-decode-uri-component')
const logger = require('./util/logger.js') const logger = require('./util/logger.js')
@@ -225,14 +225,15 @@ async function constructServer(moduleDefs) {
*/ */
app.use((req, _, next) => { app.use((req, _, next) => {
req.cookies = {} req.cookies = {}
//;(req.headers.cookie || '').split(/\s*;\s*/).forEach((pair) => { // Polynomial regular expression // getCookieHeader(req.headers)
;(req.headers.cookie || '').split(/;\s+|(?<!\s)\s+$/g).forEach((pair) => { .split(';')
let crack = pair.indexOf('=') .forEach((pair) => {
if (crack < 1 || crack == pair.length - 1) return let crack = pair.indexOf('=')
req.cookies[decode(pair.slice(0, crack)).trim()] = decode( if (crack < 1 || crack == pair.length - 1) return
pair.slice(crack + 1), req.cookies[decode(pair.slice(0, crack)).trim()] = decode(
).trim() pair.slice(crack + 1),
}) ).trim()
})
next() next()
}) })
@@ -291,13 +292,19 @@ async function constructServer(moduleDefs) {
} }
}) })
let query = Object.assign( const queryCookie = req.query && req.query.cookie
{}, const bodyCookie = req.body && req.body.cookie
{ cookie: req.cookies }, const fileCookie = req.files && req.files.cookie
req.query, const cookie = hasCookie(fileCookie)
req.body, ? fileCookie
req.files, : hasCookie(bodyCookie)
) ? bodyCookie
: hasCookie(queryCookie)
? queryCookie
: req.cookies
const query = Object.assign({}, req.query, req.body, req.files, {
cookie,
})
try { try {
let usedCrypto = '' let usedCrypto = ''
+24 -4
View File
@@ -94,10 +94,12 @@ module.exports = {
// 优化:使用for循环替代forEach,性能更好 // 优化:使用for循环替代forEach,性能更好
for (let i = 0, len = cookieArr.length; i < len; i++) { for (let i = 0, len = cookieArr.length; i < len; i++) {
let item = cookieArr[i] let item = cookieArr[i]
let arr = item.split('=') let separator = item.indexOf('=')
// 优化:使用严格等于 // 只按第一个等号拆分,保留 Cookie 值中的等号
if (arr.length === 2) { if (separator > 0) {
obj[arr[0].trim()] = arr[1].trim() obj[item.slice(0, separator).trim()] = item
.slice(separator + 1)
.trim()
} }
} }
return obj return obj
@@ -112,6 +114,24 @@ module.exports = {
) )
}, },
getCookieHeader(headers) {
if (!headers || typeof headers !== 'object') return ''
if (typeof headers.get === 'function') {
const cookie = headers.get('cookie')
if (typeof cookie === 'string') return cookie
}
const headerName = Object.keys(headers).find(
(name) => name.toLowerCase() === 'cookie',
)
if (!headerName) return ''
const cookie = headers[headerName]
if (Array.isArray(cookie)) return cookie.join('; ')
return typeof cookie === 'string' ? cookie : ''
},
cookieObjToString(cookie) { cookieObjToString(cookie) {
// 优化:使用预绑定的keys函数和for循环 // 优化:使用预绑定的keys函数和for循环
const cookieKeys = keys(cookie) const cookieKeys = keys(cookie)
+6 -2
View File
@@ -1,11 +1,15 @@
const { hasCookie } = require('./index') const { getCookieHeader, hasCookie } = require('./index')
const createOption = (query, crypto = '', checkToken = false) => { const createOption = (query, crypto = '', checkToken = false) => {
const headerCookie = getCookieHeader(query.headers)
return { return {
crypto: query.crypto || crypto || '', crypto: query.crypto || crypto || '',
cookie: hasCookie(query.cookie) cookie: hasCookie(query.cookie)
? query.cookie ? query.cookie
: process.env.NETEASE_COOKIE, : hasCookie(headerCookie)
? headerCookie
: process.env.NETEASE_COOKIE,
ua: query.ua || '', ua: query.ua || '',
proxy: query.proxy, proxy: query.proxy,
realIP: query.realIP, realIP: query.realIP,
+9 -1
View File
@@ -13,6 +13,8 @@ const tmpPath = require('os').tmpdir()
const { const {
cookieToJson, cookieToJson,
cookieObjToString, cookieObjToString,
getCookieHeader,
hasCookie,
toBoolean, toBoolean,
generateRandomChineseIP, generateRandomChineseIP,
} = require('./index') } = require('./index')
@@ -243,13 +245,19 @@ const createRequest = async (uri, data, options) => {
headers['X-Forwarded-For'] = ip headers['X-Forwarded-For'] = ip
} }
let cookie = options.cookie || {} let cookie = hasCookie(options.cookie)
? options.cookie
: getCookieHeader(options.headers)
if (!hasCookie(cookie)) cookie = {}
if (typeof cookie === 'string') { if (typeof cookie === 'string') {
cookie = cookieToJson(cookie) cookie = cookieToJson(cookie)
} }
if (typeof cookie === 'object') { if (typeof cookie === 'object') {
cookie = processCookieObject(cookie, crypto) cookie = processCookieObject(cookie, crypto)
Object.keys(headers).forEach((name) => {
if (name.toLowerCase() === 'cookie') delete headers[name]
})
headers['Cookie'] = cookieObjToString(cookie) headers['Cookie'] = cookieObjToString(cookie)
} }
let url = '' let url = ''