From b618705bbf333c6d6df069185ce3f56cc0563202 Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 12 Nov 2025 12:30:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E4=BC=98=E9=80=89API=E7=9A=84=E5=93=8D=E5=BA=94=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=A4=84=E7=90=86=EF=BC=8C=E6=94=AF=E6=8C=81=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E8=AE=A2=E9=98=85=E7=B1=BB=E5=9E=8B=E7=9A=84=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=B1=BB=E5=9E=8B=E8=AE=BE=E7=BD=AE=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=BC=BASOCKS5=E5=8F=AF=E7=94=A8=E6=80=A7=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=9A=84=E5=93=8D=E5=BA=94=E6=97=B6=E9=97=B4=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/_worker.js b/_worker.js index 37cb69a..e8e975e 100644 --- a/_worker.js +++ b/_worker.js @@ -289,6 +289,12 @@ export default { 订阅内容 = atob(订阅内容).replace(/example.com/g, config_JSON.HOST).replace(/00000000-0000-4000-0000-000000000000/g, config_JSON.UUID); if (!ua.includes('mozilla')) 订阅内容 = btoa(订阅内容); } else 订阅内容 = 订阅内容.replace(/example.com/g, config_JSON.HOST).replace(/00000000-0000-4000-0000-000000000000/g, config_JSON.UUID); + if (订阅类型 === 'singbox') { + 订阅内容 = JSON.stringify(JSON.parse(订阅内容), null, 2); + responseHeaders["content-type"] = 'application/json; charset=utf-8'; + } else if (订阅类型 === 'clash') { + responseHeaders["content-type"] = 'application/x-yaml; charset=utf-8'; + } return new Response(订阅内容, { status: 200, headers: responseHeaders }); } return new Response('无效的订阅TOKEN', { status: 403 }); @@ -1364,13 +1370,13 @@ async function 请求优选API(urls, 默认端口 = '443', 超时时间 = 3000) const buffer = await response.arrayBuffer(); const contentType = (response.headers.get('content-type') || '').toLowerCase(); const charset = contentType.match(/charset=([^\s;]+)/i)?.[1]?.toLowerCase() || ''; - + // 根据 Content-Type 响应头判断编码优先级 let decoders = ['utf-8', 'gb2312']; // 默认优先 UTF-8 if (charset.includes('gb') || charset.includes('gbk') || charset.includes('gb2312')) { decoders = ['gb2312', 'utf-8']; // 如果明确指定 GB 系编码,优先尝试 GB2312 } - + // 尝试多种编码解码 let decodeSuccess = false; for (const decoder of decoders) { @@ -1390,12 +1396,12 @@ async function 请求优选API(urls, 默认端口 = '443', 超时时间 = 3000) continue; } } - + // 如果所有编码都失败或无效,尝试 response.text() if (!decodeSuccess) { text = await response.text(); } - + // 如果返回的是空或无效数据,返回 if (!text || text.trim().length === 0) { return; @@ -1672,12 +1678,13 @@ async function 解析地址端口(proxyIP) { } async function SOCKS5可用性验证(代理协议 = 'socks5', 代理参数) { - try { parsedSocks5Address = await 获取SOCKS5账号(代理参数); } catch (err) { return { success: false, error: err.message, proxy: 代理协议 + "://" + 代理参数 }; } + const startTime = Date.now(); + try { parsedSocks5Address = await 获取SOCKS5账号(代理参数); } catch (err) { return { success: false, error: err.message, proxy: 代理协议 + "://" + 代理参数, responseTime: Date.now() - startTime }; } const { username, password, hostname, port } = parsedSocks5Address; const 完整代理参数 = username && password ? `${username}:${password}@${hostname}:${port}` : `${hostname}:${port}`; try { const tcpSocket = 代理协议 == 'socks5' ? await socks5Connect('check.socks5.090227.xyz', 80, 3) : await httpConnect('check.socks5.090227.xyz', 80); - if (!tcpSocket) return { success: false, error: '无法连接到代理服务器', proxy: 代理协议 + "://" + 完整代理参数 }; + if (!tcpSocket) return { success: false, error: '无法连接到代理服务器', proxy: 代理协议 + "://" + 完整代理参数, responseTime: Date.now() - startTime }; try { const writer = tcpSocket.writable.getWriter(), encoder = new TextEncoder(); await writer.write(encoder.encode(`GET /cdn-cgi/trace HTTP/1.1\r\nHost: check.socks5.090227.xyz\r\nConnection: close\r\n\r\n`)); @@ -1686,12 +1693,12 @@ async function SOCKS5可用性验证(代理协议 = 'socks5', 代理参数) { let response = ''; try { while (true) { const { done, value } = await reader.read(); if (done) break; response += decoder.decode(value, { stream: true }); } } finally { reader.releaseLock(); } await tcpSocket.close(); - return { success: true, proxy: 代理协议 + "://" + 完整代理参数, ip: response.match(/ip=(.*)/)[1], loc: response.match(/loc=(.*)/)[1] }; + return { success: true, proxy: 代理协议 + "://" + 完整代理参数, ip: response.match(/ip=(.*)/)[1], loc: response.match(/loc=(.*)/)[1], responseTime: Date.now() - startTime }; } catch (error) { try { await tcpSocket.close(); } catch (e) { console.log('关闭连接时出错:', e); } - return { success: false, error: error.message, proxy: 代理协议 + "://" + 完整代理参数 }; + return { success: false, error: error.message, proxy: 代理协议 + "://" + 完整代理参数, responseTime: Date.now() - startTime }; } - } catch (error) { return { success: false, error: error.message, proxy: 代理协议 + "://" + 完整代理参数 }; } + } catch (error) { return { success: false, error: error.message, proxy: 代理协议 + "://" + 完整代理参数, responseTime: Date.now() - startTime }; } } //////////////////////////////////////////////////////HTML伪装页面/////////////////////////////////////////////// async function nginx() {