diff --git a/lib/fetcher.js b/lib/fetcher.js index 644aa65..3846ab3 100644 --- a/lib/fetcher.js +++ b/lib/fetcher.js @@ -156,33 +156,47 @@ async function searchJavdb(id) { const session = decodeURIComponent(config.session); const cookie = `locale=zh; over18=1; _jdb_session=${session}`; + const isWindows = process.platform === 'win32'; - // 用 Node.js 原生 https 发请求,不依赖 curl,跨平台兼容 + // Linux 用 curl(OpenSSL TLS,Cloudflare 接受) + // Windows 用 Node.js https(绕过 Schannel 问题) async function fetchJavdbHtml(url) { - const { default: https } = await import('https'); - const { default: http } = await import('http'); - return new Promise((resolve, reject) => { - const client = url.startsWith('https') ? https : http; - const req = client.get(url, { - headers: { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', - 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'Accept-Language': 'zh-CN,zh;q=0.9', - 'Cookie': cookie, - }, - }, (res) => { - // 处理重定向 - if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { - resolve(fetchJavdbHtml(res.headers.location)); - return; - } - const chunks = []; - res.on('data', chunk => chunks.push(chunk)); - res.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8'))); + if (!isWindows) { + // Linux/Mac:用 curl + return execSync( + `curl -sL "${url}" \ + -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" \ + -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \ + -H "Accept-Language: zh-CN,zh;q=0.9" \ + -H "Cookie: ${cookie}"`, + { timeout: 15000, maxBuffer: 1024 * 1024 * 10 } + ).toString(); + } else { + // Windows:用 Node.js https + const { default: https } = await import('https'); + const { default: http } = await import('http'); + return new Promise((resolve, reject) => { + const client = url.startsWith('https') ? https : http; + const req = client.get(url, { + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'zh-CN,zh;q=0.9', + 'Cookie': cookie, + }, + }, (res) => { + if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { + resolve(fetchJavdbHtml(res.headers.location)); + return; + } + const chunks = []; + res.on('data', chunk => chunks.push(chunk)); + res.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8'))); + }); + req.on('error', reject); + req.setTimeout(15000, () => { req.destroy(); reject(new Error('timeout')); }); }); - req.on('error', reject); - req.setTimeout(15000, () => { req.destroy(); reject(new Error('timeout')); }); - }); + } } const searchUrl = `https://javdb.com/search?q=${encodeURIComponent(id)}&f=all`; diff --git a/package.json b/package.json index 6c9cdd5..d15d774 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "javinfo", - "version": "1.1.10", + "version": "1.1.11", "description": "AV番号命令行查询工具", "main": "./index.js", "type": "module",