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() {