Help
RSS
API
Feed
Maltego
Contact
Domain > check-proxyip.ssss.nyc.mn
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2026-02-17
104.21.26.206
(
ClassC
)
Port 80
HTTP/1.1 200 OKDate: Tue, 17 Feb 2026 05:57:25 GMTContent-Type: text/html;charsetUTF-8Content-Length: 43917Connection: keep-aliveReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sa9MAGPw1U9k0%2FCzpTpJIeH5fQWUliLYRZ6aY4GvadZPPNXkkGECaEFJxwX%2FeNcx4RT9WTGzRoFQE3hZbSAaNSz8t7GyCHMs4vCsfRXh72Yf0RD2ElLFQPII%3D}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 9cf30c12eceead66-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langzh-CN>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>Check ProxyIP - 代理IP检测服务/title> link relicon hrefhttps://img.icons8.com/color/48/ip-address.png typeimage/x-icon> link relpreconnect hrefhttps://fonts.googleapis.com> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@300;400;500;600;700&displayswap relstylesheet> style> :root { --primary-color: #3498db; --primary-dark: #2980b9; --secondary-color: #1abc9c; --success-color: #2ecc71; --warning-color: #f39c12; --error-color: #e74c3c; --bg-primary: #ffffff; --bg-secondary: #f8f9fa; --bg-tertiary: #e9ecef; --text-primary: #2c3e50; --text-secondary: #6c757d; --text-light: #adb5bd; --border-color: #dee2e6; --shadow-sm: 0 2px 4px rgba(0,0,0,0.1); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 25px rgba(0,0,0,0.15); --border-radius: 12px; --border-radius-sm: 8px; --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; line-height: 1.6; color: var(--text-primary); background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; position: relative; overflow-x: hidden; } .container { max-width: 1000px; margin: 0 auto; padding: 20px; } .header { text-align: center; margin-bottom: 50px; animation: fadeInDown 0.8s ease-out; } .main-title { font-size: clamp(2.5rem, 5vw, 4rem); font-weight: 700; background: linear-gradient(135deg, #ffffff 0%, #f0f0f0 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 16px; text-shadow: 0 4px 8px rgba(0,0,0,0.1); } .subtitle { font-size: 1.2rem; color: rgba(255,255,255,0.9); font-weight: 400; margin-bottom: 8px; } .badge { display: inline-block; background: rgba(255,255,255,0.2); backdrop-filter: blur(10px); padding: 8px 16px; border-radius: 50px; color: white; font-size: 0.9rem; font-weight: 500; border: 1px solid rgba(255,255,255,0.3); } .card { background: var(--bg-primary); border-radius: var(--border-radius); padding: 32px; box-shadow: var(--shadow-lg); margin-bottom: 32px; border: 1px solid var(--border-color); transition: var(--transition); animation: fadeInUp 0.8s ease-out; backdrop-filter: blur(20px); position: relative; overflow: hidden; } .card::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); } .card:hover { transform: translateY(-4px); box-shadow: 0 20px 40px rgba(0,0,0,0.15); } .form-section { margin-bottom: 32px; } .form-label { display: block; font-weight: 600; font-size: 1.1rem; margin-bottom: 12px; color: var(--text-primary); } .input-group { display: flex; gap: 16px; align-items: flex-end; flex-wrap: wrap; } .input-wrapper { flex: 1; min-width: 300px; position: relative; } .form-input { width: 100%; padding: 16px 20px; border: 2px solid var(--border-color); border-radius: var(--border-radius-sm); font-size: 16px; font-family: inherit; transition: var(--transition); background: var(--bg-primary); color: var(--text-primary); } .form-input:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 4px rgba(52, 152, 219, 0.1); transform: translateY(-1px); } .form-input::placeholder { color: var(--text-light); } .btn { padding: 16px 32px; border: none; border-radius: var(--border-radius-sm); font-size: 16px; font-weight: 600; font-family: inherit; cursor: pointer; transition: var(--transition); text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-width: 120px; position: relative; overflow: hidden; } .btn::before { content: ; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); transition: left 0.6s; } .btn:hover::before { left: 100%; } .btn-primary { background: linear-gradient(135deg, var(--primary-color), var(--primary-dark)); color: white; box-shadow: var(--shadow-md); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(52, 152, 219, 0.3); } .btn-primary:active { transform: translateY(0); } .btn-primary:disabled { background: var(--text-light); cursor: not-allowed; transform: none; box-shadow: var(--shadow-sm); } .btn-loading { pointer-events: none; } .loading-spinner { width: 20px; height: 20px; border: 2px solid rgba(255,255,255,0.3); border-top: 2px solid white; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .result-section { margin-top: 32px; opacity: 0; transform: translateY(20px); transition: var(--transition); } .result-section.show { opacity: 1; transform: translateY(0); } .result-card { border-radius: var(--border-radius-sm); padding: 24px; margin-bottom: 16px; border-left: 4px solid; position: relative; overflow: hidden; } .result-success { background: linear-gradient(135deg, #d4edda, #c3e6cb); border-color: var(--success-color); color: #155724; } .result-error { background: linear-gradient(135deg, #f8d7da, #f5c6cb); border-color: var(--error-color); color: #721c24; } .result-warning { background: linear-gradient(135deg, #fff3cd, #ffeaa7); border-color: var(--warning-color); color: #856404; } .ip-grid { display: grid; gap: 16px; margin-top: 20px; } .ip-item { background: rgba(255,255,255,0.9); border: 1px solid var(--border-color); border-radius: var(--border-radius-sm); padding: 20px; transition: var(--transition); position: relative; } .ip-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } .ip-status-line { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .status-icon { font-size: 18px; margin-left: auto; } .copy-btn { background: var(--bg-secondary); border: 1px solid var(--border-color); padding: 6px 12px; border-radius: 6px; font-size: 14px; cursor: pointer; transition: var(--transition); display: inline-flex; align-items: center; gap: 4px; margin: 4px 0; } .copy-btn:hover { background: var(--primary-color); color: white; border-color: var(--primary-color); } .copy-btn.copied { background: var(--success-color); color: white; border-color: var(--success-color); } .info-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; } .tag { padding: 4px 8px; border-radius: 16px; font-size: 12px; font-weight: 500; } .tag-country { background: #e3f2fd; color: #1976d2; } .tag-as { background: #f3e5f5; color: #7b1fa2; } .api-docs { background: var(--bg-primary); border-radius: var(--border-radius); padding: 32px; box-shadow: var(--shadow-lg); animation: fadeInUp 0.8s ease-out 0.2s both; } .section-title { font-size: 1.8rem; font-weight: 700; color: var(--text-primary); margin-bottom: 24px; position: relative; padding-bottom: 12px; } .section-title::after { content: ; position: absolute; bottom: 0; left: 0; width: 60px; height: 3px; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 2px; } .code-block { background: #2d3748; color: #e2e8f0; padding: 20px; border-radius: var(--border-radius-sm); font-family: Monaco, Menlo, Ubuntu Mono, monospace; font-size: 14px; overflow-x: auto; margin: 16px 0; border: 1px solid #4a5568; position: relative; } .code-block::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, #48bb78, #38b2ac); } .highlight { color: #f56565; font-weight: 600; } .footer { text-align: center; padding: 20px 20px 20px; color: rgba(255,255,255,0.8); font-size: 14px; margin-top: 40px; border-top: 1px solid rgba(255,255,255,0.1); } .github-corner { position: fixed; top: 0; right: 0; z-index: 1000; transition: var(--transition); } .github-corner:hover { transform: scale(1.1); } .github-corner svg { fill: rgba(255,255,255,0.9); color: var(--primary-color); width: 80px; height: 80px; filter: drop-shadow(0 4px 8px rgba(0,0,0,0.1)); } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes octocat-wave { 0%, 100% { transform: rotate(0); } 20%, 60% { transform: rotate(-25deg); } 40%, 80% { transform: rotate(10deg); } } .github-corner:hover .octo-arm { animation: octocat-wave 560ms ease-in-out; } @media (max-width: 768px) { .container { padding: 16px; } .card { padding: 24px; margin-bottom: 24px; } .input-group { flex-direction: column; align-items: stretch; } .input-wrapper { min-width: auto; } .btn { width: 100%; } .github-corner svg { width: 60px; height: 60px; } .github-corner:hover .octo-arm { animation: none; } .github-corner .octo-arm { animation: octocat-wave 560ms ease-in-out; } .main-title { font-size: 2.5rem; } } .toast { position: fixed; bottom: 20px; right: 20px; background: var(--text-primary); color: white; padding: 12px 20px; border-radius: var(--border-radius-sm); box-shadow: var(--shadow-lg); transform: translateY(100px); opacity: 0; transition: var(--transition); z-index: 1000; } .toast.show { transform: translateY(0); opacity: 1; } .tooltip { position: relative; display: inline-block; cursor: help; } .tooltip .tooltiptext { visibility: hidden; /* 气泡宽度 - 可调整以适应内容长度 */ width: 420px; /* 气泡背景色 */ background-color: #2c3e50; /* 气泡文字颜色 */ color: #fff; /* 文字对齐方式 */ text-align: left; /* 气泡圆角大小 */ border-radius: 8px; /* 气泡内边距 - 上下 左右 */ padding: 12px 16px; /* 定位方式 - fixed相对于浏览器窗口定位 */ position: fixed; /* 层级 - 确保在最上层显示 */ z-index: 9999; /* 垂直位置 - 50%表示距离顶部50% */ top: 50%; /* 水平位置 - 50%表示距离左边50% */ left: 50%; /* 居中对齐 - 向左偏移自身宽度的50%,向上偏移自身高度的50% */ transform: translate(-50%, -50%); /* 初始透明度 */ opacity: 0; /* 过渡动画时间 */ transition: opacity 0.3s; /* 阴影效果 - 水平偏移 垂直偏移 模糊半径 颜色 */ box-shadow: 0 4px 20px rgba(0,0,0,0.3); /* 字体大小 */ font-size: 14px; /* 行高 */ line-height: 1.4; /* 字体粗细 */ font-weight: 400; /* 边框 */ border: 1px solid rgba(255,255,255,0.1); /* 背景模糊效果 */ backdrop-filter: blur(10px); /* 最大宽度 - 防止在小屏幕上超出边界 */ max-width: 90vw; /* 最大高度 - 防止内容过多时超出屏幕 */ max-height: 80vh; /* 内容溢出时显示滚动条 */ overflow-y: auto; } .tooltip .tooltiptext::after { /* 移除箭头 - 由于居中显示,箭头不再需要 */ display: none; } .tooltip:hover .tooltiptext { visibility: visible; opacity: 1; } @media (max-width: 768px) { .tooltip .tooltiptext { /* 移动端气泡宽度 */ width: 90vw; /* 移动端最大宽度 */ max-width: 90vw; /* 移动端字体大小 */ font-size: 13px; /* 移动端内边距调整 */ padding: 10px 12px; } } /style>/head>body> a hrefhttps://github.com/cmliu/CF-Workers-CheckProxyIP target_blank classgithub-corner aria-labelView source on Github> svg viewBox0 0 250 250 aria-hiddentrue> path dM0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z>/path> path dM128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2 fillcurrentColor styletransform-origin: 130px 106px; classocto-arm>/path> path dM115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z fillcurrentColor classocto-body>/path> /svg> /a> div classcontainer> header classheader> h1 classmain-title>Check ProxyIP/h1> /header> div classcard> div classform-section> label forproxyip classform-label>🔍 输入 ProxyIP 地址/label> div classinput-group> div classinput-wrapper> input typetext idproxyip classform-input placeholder例如: 1.2.3.4:443 或 example.com autocompleteoff> /div> button idcheckBtn classbtn btn-primary onclickcheckProxyIP()> span classbtn-text>检测/span> div classloading-spinner styledisplay: none;>/div> /button> /div> /div> div idresult classresult-section>/div> /div> div classapi-docs> h2 classsection-title>🤔 什么是 ProxyIP ?/h2> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>📖 ProxyIP 概念/h3> p stylemargin-bottom: 16px; line-height: 1.8; color: var(--text-secondary);> 在 Cloudflare Workers 环境中,ProxyIP 特指那些能够成功代理连接到 Cloudflare 服务的第三方 IP 地址。 /p> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🔧 技术原理/h3> p stylemargin-bottom: 16px; line-height: 1.8; color: var(--text-secondary);> 根据 Cloudflare Workers 的 a hrefhttps://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/ target_blank stylecolor: var(--primary-color); text-decoration: none;>TCP Sockets 官方文档/a> 说明,存在以下技术限制: /p> div classcode-block stylebackground: #fff3cd; color: #856404; border-left: 4px solid var(--warning-color);> ⚠️ Outbound TCP sockets to a hrefhttps://www.cloudflare.com/ips/ target_blank >Cloudflare IP ranges ↗/a> are temporarily blocked, but will be re-enabled shortly. /div> p stylemargin: 16px 0; line-height: 1.8; color: var(--text-secondary);> 这意味着 Cloudflare Workers 无法直接连接到 Cloudflare 自有的 IP 地址段。为了解决这个限制,需要借助第三方云服务商的服务器作为跳板: /p> div stylebackground: var(--bg-secondary); padding: 20px; border-radius: var(--border-radius-sm); margin: 20px 0;> div styledisplay: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; flex-wrap: wrap; gap: 16px;> div stylebackground: #e3f2fd; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #1976d2;>Cloudflare Workers/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>发起请求/div> /div> div stylecolor: var(--primary-color); font-size: 1.5rem;>→/div> div stylebackground: #f3e5f5; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #7b1fa2;>ProxyIP 服务器/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>第三方代理/div> /div> div stylecolor: var(--primary-color); font-size: 1.5rem;>→/div> div stylebackground: #e8f5e8; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #388e3c;>Cloudflare 服务/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>目标服务/div> /div> /div> p styletext-align: center; color: var(--text-secondary); font-size: 0.95rem; margin: 0;> 通过第三方服务器反向代理 Cloudflare 的 443 端口,实现 Workers 对 Cloudflare 服务的访问 /p> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🎯 实际应用场景/h3> div stylebackground: linear-gradient(135deg, #fff3cd, #ffeaa7); padding: 20px; border-radius: var(--border-radius-sm); border-left: 4px solid var(--warning-color); margin: 20px 0;> p stylemargin-bottom: 16px; line-height: 1.8; color: #856404;> strong stylefont-size: 1.1rem;>由于上述限制/strong>,strong>a hrefhttps://github.com/cmliu/edgetunnel target_blank stylecolor: #d63384; text-decoration: none;>edgetunnel/a>/strong>、strong>a hrefhttps://github.com/cmliu/epeius target_blank stylecolor: #d63384; text-decoration: none;>epeius/a>/strong> 等项目,在尝试访问使用 Cloudflare CDN 服务的网站时,会因为无法建立到 Cloudflare IP 段的连接而导致访问失败。 /p> p stylemargin: 0; line-height: 1.8; color: #856404;> strong>解决方案:/strong>通过配置有效的 ProxyIP,这些项目可以绕过限制,成功访问托管在 Cloudflare 上的目标网站,确保服务的正常运行。 /p> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>✅ 有效 ProxyIP 特征/h3> div stylebackground: linear-gradient(135deg, #d4edda, #c3e6cb); padding: 20px; border-radius: var(--border-radius-sm); border-left: 4px solid var(--success-color);> ul stylemargin: 0; color: #155724; line-height: 1.8; padding-left: 20px;> li>strong>网络连通性:/strong>能够成功建立到指定端口(通常为 443)的 TCP 连接/li> li>strong>代理功能:/strong>具备反向代理 Cloudflare IP 段的 HTTPS 服务能力/li> /ul> /div> div stylebackground: var(--bg-tertiary); padding: 16px; border-radius: var(--border-radius-sm); margin-top: 20px; border-left: 4px solid var(--primary-color);> p stylemargin: 0; color: var(--text-primary); font-weight: 500;> 💡 strong>提示:/strong>本检测服务通过模拟真实的网络连接来验证 ProxyIP 的可用性,帮助您快速识别和筛选出稳定可靠的代理服务器。 /p> /div> /div> div classapi-docs stylemargin-top: 50px;> h2 classsection-title>📚 API 文档/h2> p stylemargin-bottom: 24px; color: var(--text-secondary); font-size: 1.1rem;> 提供简单易用的 RESTful API 接口,支持批量检测和域名解析 /p> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>📍 检查ProxyIP/h3> div classcode-block> strong stylecolor: #68d391;>GET/strong> /check?proxyipspan classhighlight>YOUR_PROXY_IP/span> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>💡 使用示例/h3> div classcode-block>curl https://check-proxyip.ssss.nyc.mn/check?proxyip1.2.3.4:443 /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🔗 响应Json格式/h3> div classcode-block>{br> success: true|false, // 代理 IP 是否有效br> proxyIP: 1.2.3.4, // 如果有效,返回代理 IP,否则为 -1br> portRemote: 443, // 如果有效,返回端口,否则为 -1br> colo: HKG, // 执行此次请求的Cloudflare机房br> responseTime: 166, // 如果有效,返回响应毫秒时间,否则为 -1br> message: 第1次验证有效ProxyIP, // 返回验证信息br> timestamp: 2025-06-03T17:27:52.946Z // 检查时间br>}br> /div> /div> div classfooter> p stylemargin-top: 8px; opacity: 0.8;>© 2025 Check ProxyIP - 基于 Cloudflare Workers 构建的高性能 ProxyIP 验证服务 | 由 strong>cmliu/strong> 开发/p> /div> /div> div idtoast classtoast>/div> script> // 全局变量 let isChecking false; const ipCheckResults new Map(); // 缓存IP检查结果 let pageLoadTimestamp; // 页面加载时的时间戳 // 计算时间戳的函数 function calculateTimestamp() { const currentDate new Date(); return Math.ceil(currentDate.getTime() / (1000 * 60 * 13)); // 每13分钟一个时间戳 } // 添加前端的代理IP格式验证函数 function isValidProxyIPFormat(input) { // 检查是否为域名格式 const domainRegex /^a-zA-Z0-9(a-zA-Z0-9\-{0,61}a-zA-Z0-9)?(\.a-zA-Z0-9(a-zA-Z0-9\-{0,61}a-zA-Z0-9)?)*$/; // 检查是否为IP格式 const ipv4Regex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?)$/; const ipv6Regex /^\?(0-9a-fA-F{0,4}:){1,7}0-9a-fA-F{0,4}\?$/; // 允许带端口的格式 const withPortRegex /^.+:\d+$/; const tpPortRegex /^.+\.tp\d+\./; return domainRegex.test(input) || ipv4Regex.test(input) || ipv6Regex.test(input) || withPortRegex.test(input) || tpPortRegex.test(input); } // 初始化 document.addEventListener(DOMContentLoaded, function() { // 记录页面加载时的时间戳 pageLoadTimestamp calculateTimestamp(); console.log(页面加载完成,时间戳:, pageLoadTimestamp); const input document.getElementById(proxyip); input.focus(); // 直接解析当前URL路径 const currentPath window.location.pathname; let autoCheckValue null; // 检查URL参数中的autocheck(保持兼容性) const urlParams new URLSearchParams(window.location.search); autoCheckValue urlParams.get(autocheck); // 如果没有autocheck参数,检查路径 if (!autoCheckValue && currentPath.length > 1) { const pathContent currentPath.substring(1); // 移除开头的 / // 检查路径是否为有效的代理IP格式 if (isValidProxyIPFormat(pathContent)) { autoCheckValue pathContent; // 清理URL,移除路径部分 const newUrl new URL(window.location); newUrl.pathname /; window.history.replaceState({}, , newUrl); } } // 如果没有从URL获取到值,尝试从localStorage获取上次搜索的地址 if (!autoCheckValue) { try { const lastSearch localStorage.getItem(lastProxyIP); if (lastSearch && isValidProxyIPFormat(lastSearch)) { input.value lastSearch; // 不自动执行检测,只是填充输入框 } } catch (error) { console.log(读取历史记录失败:, error); } } if (autoCheckValue) { input.value autoCheckValue; // 如果来自URL参数,清除参数 if (urlParams.has(autocheck)) { const newUrl new URL(window.location); newUrl.searchParams.delete(autocheck); window.history.replaceState({}, , newUrl); } // 延迟执行搜索,确保页面完全加载 setTimeout(() > { if (!isChecking) { checkProxyIP(); } }, 500); } // 输入框回车事件 input.addEventListener(keypress, function(event) { if (event.key Enter && !isChecking) { checkProxyIP(); } }); // 添加事件委托处理复制按钮点击 document.addEventListener(click, function(event) { if (event.target.classList.contains(copy-btn)) { const text event.target.getAttribute(data-copy); if (text) { copyToClipboard(text, event.target); } } }); }); // 显示toast消息 function showToast(message, duration 3000) { const toast document.getElementById(toast); toast.textContent message; toast.classList.add(show); setTimeout(() > { toast.classList.remove(show); }, duration); } // 复制到剪贴板 function copyToClipboard(text, element) { navigator.clipboard.writeText(text).then(() > { const originalText element.textContent; element.classList.add(copied); element.textContent 已复制 ✓; showToast(复制成功!); setTimeout(() > { element.classList.remove(copied); element.textContent originalText; }, 2000); }).catch(err > { console.error(复制失败:, err); showToast(复制失败,请手动复制); }); } // 创建复制按钮 function createCopyButton(text) { return `span classcopy-btn data-copy${text}>${text}/span>`; } // 检查是否为IP地址 function isIPAddress(input) { const ipv4Regex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?)$/; const ipv6Regex /^\?(0-9a-fA-F{0,4}:){1,7}0-9a-fA-F{0,4}\?$/; const ipv6WithPortRegex /^\0-9a-fA-F:+\:\d+$/; const ipv4WithPortRegex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?):\d+$/; return ipv4Regex.test(input) || ipv6Regex.test(input) || ipv6WithPortRegex.test(input) || ipv4WithPortRegex.test(input); } // 添加输入预处理函数 function preprocessInput(input) { if (!input) return input; // 去除首尾空格 let processed input.trim(); // 检查是否还有空格 if (processed.includes( )) { // 只保留第一个空格前的内容 processed processed.split( )0; } return processed; } // 主检测函数 async function checkProxyIP() { if (isChecking) return; const proxyipInput document.getElementById(proxyip); const resultDiv document.getElementById(result); const checkBtn document.getElementById(checkBtn); const btnText checkBtn.querySelector(.btn-text); const spinner checkBtn.querySelector(.loading-spinner); const rawInput proxyipInput.value; const proxyip preprocessInput(rawInput); // 如果预处理后的值与原值不同,更新输入框 if (proxyip ! rawInput) { proxyipInput.value proxyip; showToast(已自动清理输入内容); } if (!proxyip) { showToast(请输入代理IP地址); proxyipInput.focus(); return; } // 检查时间戳是否过期 const currentTimestamp calculateTimestamp(); console.log(点击检测时的时间戳:, currentTimestamp); console.log(页面加载时的时间戳:, pageLoadTimestamp); console.log(时间戳是否一致:, currentTimestamp pageLoadTimestamp); if (currentTimestamp ! pageLoadTimestamp) { // 时间戳已过期,需要重新加载页面获取最新TOKEN const currentHost window.location.host; const currentProtocol window.location.protocol; const redirectUrl `${currentProtocol}//${currentHost}/${encodeURIComponent(proxyip)}`; console.log(时间戳过期,即将跳转到:, redirectUrl); showToast(TOKEN已过期,正在刷新页面...); // 延迟跳转,让用户看到提示 setTimeout(() > { window.location.href redirectUrl; }, 1000); return; } console.log(时间戳验证通过,继续执行检测逻辑); // 保存到localStorage try { localStorage.setItem(lastProxyIP, proxyip); } catch (error) { console.log(保存历史记录失败:, error); } // 设置加载状态 isChecking true; checkBtn.classList.add(btn-loading); checkBtn.disabled true; btnText.style.display none; spinner.style.display block; resultDiv.classList.remove(show); try { if (isIPAddress(proxyip)) { await checkSingleIP(proxyip, resultDiv); } else { await checkDomain(proxyip, resultDiv); } } catch (err) { resultDiv.innerHTML ` div classresult-card result-error> h3>❌ 检测失败/h3> p>strong>错误信息:/strong> ${err.message}/p> p>strong>检测时间:/strong> ${new Date().toLocaleString()}/p> /div> `; resultDiv.classList.add(show); } finally { isChecking false; checkBtn.classList.remove(btn-loading); checkBtn.disabled false; btnText.style.display block; spinner.style.display none; } } // 检查单个IP async function checkSingleIP(proxyip, resultDiv) { const response await fetch(`./check?proxyip${encodeURIComponent(proxyip)}`); const data await response.json(); if (data.success) { const ipInfo await getIPInfo(data.proxyIP); const ipInfoHTML formatIPInfo(ipInfo); const responseTimeHTML data.responseTime && data.responseTime > 0 ? `div classtooltip> span stylebackground: var(--success-color); color: white; padding: 4px 8px; border-radius: 6px; font-weight: 600; font-size: 14px;>${data.responseTime}ms/span> span classtooltiptext>该延迟并非 strong>您当前网络/strong> 到 ProxyIP 的实际延迟,br>而是 strong>Cloudflare.${data.colo || CF} 机房/strong> 到 ProxyIP 的响应时间。/span> /div>` : span stylecolor: var(--text-light);>延迟未知/span>; resultDiv.innerHTML ` div classresult-card result-success> h3>✅ ProxyIP 有效/h3> div stylemargin-top: 20px;> div styledisplay: flex; align-items: center; gap: 12px; margin-bottom: 12px; flex-wrap: wrap;> strong>🌐 ProxyIP 地址:/strong> ${createCopyButton(data.proxyIP)} ${ipInfoHTML} ${responseTimeHTML} /div> p>strong>🔌 端口:/strong> ${createCopyButton(data.portRemote.toString())}/p> p>strong>🏢 机房信息:/strong> ${data.colo || CF}/p> p>strong>🕒 检测时间:/strong> ${new Date(data.timestamp).toLocaleString()}/p> /div> /div> `; } else { resultDiv.innerHTML ` div classresult-card result-error> h3>❌ ProxyIP 失效/h3> div stylemargin-top: 20px;> div styledisplay: flex; align-items: center; gap: 12px; margin-bottom: 12px; flex-wrap: wrap;> strong>🌐 IP地址:/strong> ${createCopyButton(proxyip)} span stylecolor: var(--error-color); font-weight: 600; font-size: 18px;>❌/span> /div> p>strong>🔌 端口:/strong> ${data.portRemote && data.portRemote ! -1 ? createCopyButton(data.portRemote.toString()) : 未知}/p> p>strong>🏢 机房信息:/strong> ${data.colo || CF}/p> ${data.message ? `p>strong>错误信息:/strong> ${data.message}/p>` : } p>strong>🕒 检测时间:/strong> ${new Date(data.timestamp).toLocaleString()}/p> /div> /div> `; } resultDiv.classList.add(show); } // 检查域名 async function checkDomain(domain, resultDiv) { let portRemote 443; let cleanDomain domain; // 解析端口 if (domain.includes(.tp)) { portRemote domain.split(.tp)1.split(.)0 || 443; } else if (domain.includes() && domain.includes(:)) { portRemote parseInt(domain.split(:)1) || 443; cleanDomain domain.split(:)0 + ; } else if (domain.includes(:)) { portRemote parseInt(domain.split(:)1) || 443; cleanDomain domain.split(:)0; } // 解析域名 const resolveResponse await fetch(`./resolve?domain${encodeURIComponent(cleanDomain)}&token4f6c05591a005dd6bb336fd0d1f41527`); const resolveData await resolveResponse.json(); if (!resolveData.success) { throw new Error(resolveData.error || 域名解析失败); } const ips resolveData.ips; if (!ips || ips.length 0) { throw new Error(未找到域名对应的IP地址); } // 清空缓存 ipCheckResults.clear(); // 显示初始结果 resultDiv.innerHTML ` div classresult-card result-warning> h3>🔍 域名解析结果/h3> div stylemargin-top: 20px;> p>strong>🌐 ProxyIP 域名:/strong> ${createCopyButton(cleanDomain)}/p> p>strong>🔌 端口:/strong> ${createCopyButton(portRemote.toString())}/p> p>strong>🏢 机房信息:/strong> span iddomain-colo>检测中.../span>/p> p>strong>📋 发现IP:/strong> ${ips.length} 个/p> p>strong>🕒 解析时间:/strong> ${new Date().toLocaleString()}/p> /div> div classip-grid idip-grid> ${ips.map((ip, index) > ` div classip-item idip-item-${index}> div classip-status-line idip-status-line-${index}> strong>IP:/strong> ${createCopyButton(ip)} span idip-info-${index} stylecolor: var(--text-secondary);>获取信息中.../span> span classstatus-icon idstatus-icon-${index}>🔄/span> /div> /div> `).join()} /div> /div> `; resultDiv.classList.add(show); // 并发检查所有IP和获取IP信息 const checkPromises ips.map((ip, index) > checkIPWithIndex(ip, portRemote, index)); const ipInfoPromises ips.map((ip, index) > getIPInfoWithIndex(ip, index)); await Promise.all(...checkPromises, ...ipInfoPromises); // 使用缓存的结果更新整体状态和机房信息 const validCount Array.from(ipCheckResults.values()).filter(r > r.success).length; const totalCount ips.length; const resultCard resultDiv.querySelector(.result-card); // 获取第一个有效结果的colo信息 const firstValidResult Array.from(ipCheckResults.values()).find(r > r.success && r.colo); const coloInfo firstValidResult?.colo || CF; // 更新机房信息 const coloElement document.getElementById(domain-colo); if (coloElement) { coloElement.textContent coloInfo; } if (validCount totalCount) { resultCard.className result-card result-success; resultCard.querySelector(h3).innerHTML ✅ 所有IP均有效; } else if (validCount 0) { resultCard.className result-card result-error; resultCard.querySelector(h3).innerHTML ❌ 所有IP均失效; } else { resultCard.className result-card result-warning; resultCard.querySelector(h3).innerHTML `⚠️ 部分IP有效 (${validCount}/${totalCount})`; } } // 检查单个IP(带索引) async function checkIPWithIndex(ip, port, index) { try { const cacheKey `${ip}:${port}`; let result; // 检查是否已有缓存结果 if (ipCheckResults.has(cacheKey)) { result ipCheckResults.get(cacheKey); } else { // 调用API检查IP状态 result await checkIPStatus(cacheKey); // 缓存结果 ipCheckResults.set(cacheKey, result); } const itemElement document.getElementById(`ip-item-${index}`); const statusIcon document.getElementById(`status-icon-${index}`); if (result.success) { itemElement.style.background linear-gradient(135deg, #d4edda, #c3e6cb); itemElement.style.borderColor var(--success-color); const responseTimeHTML result.responseTime && result.responseTime > 0 ? `div classtooltip> span stylebackground: var(--success-color); color: white; padding: 2px 6px; border-radius: 4px; font-size: 12px; font-weight: 600;>${result.responseTime}ms/span> span classtooltiptext>该延迟并非 strong>您当前网络/strong> 到 ProxyIP 的实际延迟,br>而是 strong>Cloudflare.${result.colo || CF} 机房/strong> 到 ProxyIP 的响应时间。/span> /div>` : span stylecolor: var(--text-light); font-size: 12px;>延迟未知/span>; statusIcon.innerHTML responseTimeHTML; statusIcon.className status-icon status-success; } else { itemElement.style.background linear-gradient(135deg, #f8d7da, #f5c6cb); itemElement.style.borderColor var(--error-color); statusIcon.textContent ❌; statusIcon.className status-icon status-error; statusIcon.style.color var(--error-color); statusIcon.style.fontSize 18px; } } catch (error) { console.error(检查IP失败:, error); const statusIcon document.getElementById(`status-icon-${index}`); if (statusIcon) { statusIcon.textContent ❌; statusIcon.className status-icon status-error; statusIcon.style.color var(--error-color); statusIcon.style.fontSize 18px; } // 将失败结果也缓存起来 const cacheKey `${ip}:${port}`; ipCheckResults.set(cacheKey, { success: false, error: error.message, colo: CF }); } } // 获取IP信息(带索引) async function getIPInfoWithIndex(ip, index) { try { const ipInfo await getIPInfo(ip); const infoElement document.getElementById(`ip-info-${index}`); if (infoElement) { infoElement.innerHTML formatIPInfo(ipInfo); } } catch (error) { console.error(获取IP信息失败:, error); const infoElement document.getElementById(`ip-info-${index}`); if (infoElement) { infoElement.innerHTML span stylecolor: var(--text-light);>信息获取失败/span>; } } } // 获取IP信息 async function getIPInfo(ip) { try { const cleanIP ip.replace(/\\/g, ); const response await fetch(`./ip-info?ip${encodeURIComponent(cleanIP)}&token4f6c05591a005dd6bb336fd0d1f41527`); const data await response.json(); return data; } catch (error) { return null; } } // 格式化IP信息 function formatIPInfo(ipInfo) { if (!ipInfo || ipInfo.status ! success) { return span stylecolor: var(--text-light);>信息获取失败/span>; } const country ipInfo.country || 未知; const as ipInfo.as || 未知; return ` span classtag tag-country>${country}/span> span classtag tag-as>${as}/span> `; } // 检查IP状态 async function checkIPStatus(ip) { try { const response await fetch(`./check?proxyip${encodeURIComponent(ip)}`); const data await response.json(); return data; } catch (error) { return { success: false, error: error.message }; } } /script>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Tue, 17 Feb 2026 05:57:25 GMTContent-Type: text/html;charsetUTF-8Content-Length: 43917Connection: keep-aliveReport-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sGA2YQAc22DGx1Aw4UXAd2P6LI4o3KNutCaCosKUbhRrlsp4sMl2BakoyhOrPjmE9yTDtVsifgMQzzGMZOFHadufYa1orf8fcpzRd6s7y1aL2olZbKZHf3GA%3D}}Nel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Server: cloudflareCF-RAY: 9cf30c138b305913-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html langzh-CN>head> meta charsetUTF-8> meta nameviewport contentwidthdevice-width, initial-scale1.0> title>Check ProxyIP - 代理IP检测服务/title> link relicon hrefhttps://img.icons8.com/color/48/ip-address.png typeimage/x-icon> link relpreconnect hrefhttps://fonts.googleapis.com> link relpreconnect hrefhttps://fonts.gstatic.com crossorigin> link hrefhttps://fonts.googleapis.com/css2?familyInter:wght@300;400;500;600;700&displayswap relstylesheet> style> :root { --primary-color: #3498db; --primary-dark: #2980b9; --secondary-color: #1abc9c; --success-color: #2ecc71; --warning-color: #f39c12; --error-color: #e74c3c; --bg-primary: #ffffff; --bg-secondary: #f8f9fa; --bg-tertiary: #e9ecef; --text-primary: #2c3e50; --text-secondary: #6c757d; --text-light: #adb5bd; --border-color: #dee2e6; --shadow-sm: 0 2px 4px rgba(0,0,0,0.1); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 25px rgba(0,0,0,0.15); --border-radius: 12px; --border-radius-sm: 8px; --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; line-height: 1.6; color: var(--text-primary); background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; position: relative; overflow-x: hidden; } .container { max-width: 1000px; margin: 0 auto; padding: 20px; } .header { text-align: center; margin-bottom: 50px; animation: fadeInDown 0.8s ease-out; } .main-title { font-size: clamp(2.5rem, 5vw, 4rem); font-weight: 700; background: linear-gradient(135deg, #ffffff 0%, #f0f0f0 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 16px; text-shadow: 0 4px 8px rgba(0,0,0,0.1); } .subtitle { font-size: 1.2rem; color: rgba(255,255,255,0.9); font-weight: 400; margin-bottom: 8px; } .badge { display: inline-block; background: rgba(255,255,255,0.2); backdrop-filter: blur(10px); padding: 8px 16px; border-radius: 50px; color: white; font-size: 0.9rem; font-weight: 500; border: 1px solid rgba(255,255,255,0.3); } .card { background: var(--bg-primary); border-radius: var(--border-radius); padding: 32px; box-shadow: var(--shadow-lg); margin-bottom: 32px; border: 1px solid var(--border-color); transition: var(--transition); animation: fadeInUp 0.8s ease-out; backdrop-filter: blur(20px); position: relative; overflow: hidden; } .card::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); } .card:hover { transform: translateY(-4px); box-shadow: 0 20px 40px rgba(0,0,0,0.15); } .form-section { margin-bottom: 32px; } .form-label { display: block; font-weight: 600; font-size: 1.1rem; margin-bottom: 12px; color: var(--text-primary); } .input-group { display: flex; gap: 16px; align-items: flex-end; flex-wrap: wrap; } .input-wrapper { flex: 1; min-width: 300px; position: relative; } .form-input { width: 100%; padding: 16px 20px; border: 2px solid var(--border-color); border-radius: var(--border-radius-sm); font-size: 16px; font-family: inherit; transition: var(--transition); background: var(--bg-primary); color: var(--text-primary); } .form-input:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 4px rgba(52, 152, 219, 0.1); transform: translateY(-1px); } .form-input::placeholder { color: var(--text-light); } .btn { padding: 16px 32px; border: none; border-radius: var(--border-radius-sm); font-size: 16px; font-weight: 600; font-family: inherit; cursor: pointer; transition: var(--transition); text-decoration: none; display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-width: 120px; position: relative; overflow: hidden; } .btn::before { content: ; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent); transition: left 0.6s; } .btn:hover::before { left: 100%; } .btn-primary { background: linear-gradient(135deg, var(--primary-color), var(--primary-dark)); color: white; box-shadow: var(--shadow-md); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(52, 152, 219, 0.3); } .btn-primary:active { transform: translateY(0); } .btn-primary:disabled { background: var(--text-light); cursor: not-allowed; transform: none; box-shadow: var(--shadow-sm); } .btn-loading { pointer-events: none; } .loading-spinner { width: 20px; height: 20px; border: 2px solid rgba(255,255,255,0.3); border-top: 2px solid white; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .result-section { margin-top: 32px; opacity: 0; transform: translateY(20px); transition: var(--transition); } .result-section.show { opacity: 1; transform: translateY(0); } .result-card { border-radius: var(--border-radius-sm); padding: 24px; margin-bottom: 16px; border-left: 4px solid; position: relative; overflow: hidden; } .result-success { background: linear-gradient(135deg, #d4edda, #c3e6cb); border-color: var(--success-color); color: #155724; } .result-error { background: linear-gradient(135deg, #f8d7da, #f5c6cb); border-color: var(--error-color); color: #721c24; } .result-warning { background: linear-gradient(135deg, #fff3cd, #ffeaa7); border-color: var(--warning-color); color: #856404; } .ip-grid { display: grid; gap: 16px; margin-top: 20px; } .ip-item { background: rgba(255,255,255,0.9); border: 1px solid var(--border-color); border-radius: var(--border-radius-sm); padding: 20px; transition: var(--transition); position: relative; } .ip-item:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); } .ip-status-line { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; } .status-icon { font-size: 18px; margin-left: auto; } .copy-btn { background: var(--bg-secondary); border: 1px solid var(--border-color); padding: 6px 12px; border-radius: 6px; font-size: 14px; cursor: pointer; transition: var(--transition); display: inline-flex; align-items: center; gap: 4px; margin: 4px 0; } .copy-btn:hover { background: var(--primary-color); color: white; border-color: var(--primary-color); } .copy-btn.copied { background: var(--success-color); color: white; border-color: var(--success-color); } .info-tags { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; } .tag { padding: 4px 8px; border-radius: 16px; font-size: 12px; font-weight: 500; } .tag-country { background: #e3f2fd; color: #1976d2; } .tag-as { background: #f3e5f5; color: #7b1fa2; } .api-docs { background: var(--bg-primary); border-radius: var(--border-radius); padding: 32px; box-shadow: var(--shadow-lg); animation: fadeInUp 0.8s ease-out 0.2s both; } .section-title { font-size: 1.8rem; font-weight: 700; color: var(--text-primary); margin-bottom: 24px; position: relative; padding-bottom: 12px; } .section-title::after { content: ; position: absolute; bottom: 0; left: 0; width: 60px; height: 3px; background: linear-gradient(90deg, var(--primary-color), var(--secondary-color)); border-radius: 2px; } .code-block { background: #2d3748; color: #e2e8f0; padding: 20px; border-radius: var(--border-radius-sm); font-family: Monaco, Menlo, Ubuntu Mono, monospace; font-size: 14px; overflow-x: auto; margin: 16px 0; border: 1px solid #4a5568; position: relative; } .code-block::before { content: ; position: absolute; top: 0; left: 0; right: 0; height: 2px; background: linear-gradient(90deg, #48bb78, #38b2ac); } .highlight { color: #f56565; font-weight: 600; } .footer { text-align: center; padding: 20px 20px 20px; color: rgba(255,255,255,0.8); font-size: 14px; margin-top: 40px; border-top: 1px solid rgba(255,255,255,0.1); } .github-corner { position: fixed; top: 0; right: 0; z-index: 1000; transition: var(--transition); } .github-corner:hover { transform: scale(1.1); } .github-corner svg { fill: rgba(255,255,255,0.9); color: var(--primary-color); width: 80px; height: 80px; filter: drop-shadow(0 4px 8px rgba(0,0,0,0.1)); } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes octocat-wave { 0%, 100% { transform: rotate(0); } 20%, 60% { transform: rotate(-25deg); } 40%, 80% { transform: rotate(10deg); } } .github-corner:hover .octo-arm { animation: octocat-wave 560ms ease-in-out; } @media (max-width: 768px) { .container { padding: 16px; } .card { padding: 24px; margin-bottom: 24px; } .input-group { flex-direction: column; align-items: stretch; } .input-wrapper { min-width: auto; } .btn { width: 100%; } .github-corner svg { width: 60px; height: 60px; } .github-corner:hover .octo-arm { animation: none; } .github-corner .octo-arm { animation: octocat-wave 560ms ease-in-out; } .main-title { font-size: 2.5rem; } } .toast { position: fixed; bottom: 20px; right: 20px; background: var(--text-primary); color: white; padding: 12px 20px; border-radius: var(--border-radius-sm); box-shadow: var(--shadow-lg); transform: translateY(100px); opacity: 0; transition: var(--transition); z-index: 1000; } .toast.show { transform: translateY(0); opacity: 1; } .tooltip { position: relative; display: inline-block; cursor: help; } .tooltip .tooltiptext { visibility: hidden; /* 气泡宽度 - 可调整以适应内容长度 */ width: 420px; /* 气泡背景色 */ background-color: #2c3e50; /* 气泡文字颜色 */ color: #fff; /* 文字对齐方式 */ text-align: left; /* 气泡圆角大小 */ border-radius: 8px; /* 气泡内边距 - 上下 左右 */ padding: 12px 16px; /* 定位方式 - fixed相对于浏览器窗口定位 */ position: fixed; /* 层级 - 确保在最上层显示 */ z-index: 9999; /* 垂直位置 - 50%表示距离顶部50% */ top: 50%; /* 水平位置 - 50%表示距离左边50% */ left: 50%; /* 居中对齐 - 向左偏移自身宽度的50%,向上偏移自身高度的50% */ transform: translate(-50%, -50%); /* 初始透明度 */ opacity: 0; /* 过渡动画时间 */ transition: opacity 0.3s; /* 阴影效果 - 水平偏移 垂直偏移 模糊半径 颜色 */ box-shadow: 0 4px 20px rgba(0,0,0,0.3); /* 字体大小 */ font-size: 14px; /* 行高 */ line-height: 1.4; /* 字体粗细 */ font-weight: 400; /* 边框 */ border: 1px solid rgba(255,255,255,0.1); /* 背景模糊效果 */ backdrop-filter: blur(10px); /* 最大宽度 - 防止在小屏幕上超出边界 */ max-width: 90vw; /* 最大高度 - 防止内容过多时超出屏幕 */ max-height: 80vh; /* 内容溢出时显示滚动条 */ overflow-y: auto; } .tooltip .tooltiptext::after { /* 移除箭头 - 由于居中显示,箭头不再需要 */ display: none; } .tooltip:hover .tooltiptext { visibility: visible; opacity: 1; } @media (max-width: 768px) { .tooltip .tooltiptext { /* 移动端气泡宽度 */ width: 90vw; /* 移动端最大宽度 */ max-width: 90vw; /* 移动端字体大小 */ font-size: 13px; /* 移动端内边距调整 */ padding: 10px 12px; } } /style>/head>body> a hrefhttps://github.com/cmliu/CF-Workers-CheckProxyIP target_blank classgithub-corner aria-labelView source on Github> svg viewBox0 0 250 250 aria-hiddentrue> path dM0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z>/path> path dM128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2 fillcurrentColor styletransform-origin: 130px 106px; classocto-arm>/path> path dM115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z fillcurrentColor classocto-body>/path> /svg> /a> div classcontainer> header classheader> h1 classmain-title>Check ProxyIP/h1> /header> div classcard> div classform-section> label forproxyip classform-label>🔍 输入 ProxyIP 地址/label> div classinput-group> div classinput-wrapper> input typetext idproxyip classform-input placeholder例如: 1.2.3.4:443 或 example.com autocompleteoff> /div> button idcheckBtn classbtn btn-primary onclickcheckProxyIP()> span classbtn-text>检测/span> div classloading-spinner styledisplay: none;>/div> /button> /div> /div> div idresult classresult-section>/div> /div> div classapi-docs> h2 classsection-title>🤔 什么是 ProxyIP ?/h2> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>📖 ProxyIP 概念/h3> p stylemargin-bottom: 16px; line-height: 1.8; color: var(--text-secondary);> 在 Cloudflare Workers 环境中,ProxyIP 特指那些能够成功代理连接到 Cloudflare 服务的第三方 IP 地址。 /p> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🔧 技术原理/h3> p stylemargin-bottom: 16px; line-height: 1.8; color: var(--text-secondary);> 根据 Cloudflare Workers 的 a hrefhttps://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/ target_blank stylecolor: var(--primary-color); text-decoration: none;>TCP Sockets 官方文档/a> 说明,存在以下技术限制: /p> div classcode-block stylebackground: #fff3cd; color: #856404; border-left: 4px solid var(--warning-color);> ⚠️ Outbound TCP sockets to a hrefhttps://www.cloudflare.com/ips/ target_blank >Cloudflare IP ranges ↗/a> are temporarily blocked, but will be re-enabled shortly. /div> p stylemargin: 16px 0; line-height: 1.8; color: var(--text-secondary);> 这意味着 Cloudflare Workers 无法直接连接到 Cloudflare 自有的 IP 地址段。为了解决这个限制,需要借助第三方云服务商的服务器作为跳板: /p> div stylebackground: var(--bg-secondary); padding: 20px; border-radius: var(--border-radius-sm); margin: 20px 0;> div styledisplay: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; flex-wrap: wrap; gap: 16px;> div stylebackground: #e3f2fd; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #1976d2;>Cloudflare Workers/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>发起请求/div> /div> div stylecolor: var(--primary-color); font-size: 1.5rem;>→/div> div stylebackground: #f3e5f5; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #7b1fa2;>ProxyIP 服务器/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>第三方代理/div> /div> div stylecolor: var(--primary-color); font-size: 1.5rem;>→/div> div stylebackground: #e8f5e8; padding: 12px; border-radius: 8px; text-align: center; flex: 1; min-width: 120px;> div stylefont-weight: 600; color: #388e3c;>Cloudflare 服务/div> div stylefont-size: 0.9rem; color: var(--text-secondary);>目标服务/div> /div> /div> p styletext-align: center; color: var(--text-secondary); font-size: 0.95rem; margin: 0;> 通过第三方服务器反向代理 Cloudflare 的 443 端口,实现 Workers 对 Cloudflare 服务的访问 /p> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🎯 实际应用场景/h3> div stylebackground: linear-gradient(135deg, #fff3cd, #ffeaa7); padding: 20px; border-radius: var(--border-radius-sm); border-left: 4px solid var(--warning-color); margin: 20px 0;> p stylemargin-bottom: 16px; line-height: 1.8; color: #856404;> strong stylefont-size: 1.1rem;>由于上述限制/strong>,strong>a hrefhttps://github.com/cmliu/edgetunnel target_blank stylecolor: #d63384; text-decoration: none;>edgetunnel/a>/strong>、strong>a hrefhttps://github.com/cmliu/epeius target_blank stylecolor: #d63384; text-decoration: none;>epeius/a>/strong> 等项目,在尝试访问使用 Cloudflare CDN 服务的网站时,会因为无法建立到 Cloudflare IP 段的连接而导致访问失败。 /p> p stylemargin: 0; line-height: 1.8; color: #856404;> strong>解决方案:/strong>通过配置有效的 ProxyIP,这些项目可以绕过限制,成功访问托管在 Cloudflare 上的目标网站,确保服务的正常运行。 /p> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>✅ 有效 ProxyIP 特征/h3> div stylebackground: linear-gradient(135deg, #d4edda, #c3e6cb); padding: 20px; border-radius: var(--border-radius-sm); border-left: 4px solid var(--success-color);> ul stylemargin: 0; color: #155724; line-height: 1.8; padding-left: 20px;> li>strong>网络连通性:/strong>能够成功建立到指定端口(通常为 443)的 TCP 连接/li> li>strong>代理功能:/strong>具备反向代理 Cloudflare IP 段的 HTTPS 服务能力/li> /ul> /div> div stylebackground: var(--bg-tertiary); padding: 16px; border-radius: var(--border-radius-sm); margin-top: 20px; border-left: 4px solid var(--primary-color);> p stylemargin: 0; color: var(--text-primary); font-weight: 500;> 💡 strong>提示:/strong>本检测服务通过模拟真实的网络连接来验证 ProxyIP 的可用性,帮助您快速识别和筛选出稳定可靠的代理服务器。 /p> /div> /div> div classapi-docs stylemargin-top: 50px;> h2 classsection-title>📚 API 文档/h2> p stylemargin-bottom: 24px; color: var(--text-secondary); font-size: 1.1rem;> 提供简单易用的 RESTful API 接口,支持批量检测和域名解析 /p> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>📍 检查ProxyIP/h3> div classcode-block> strong stylecolor: #68d391;>GET/strong> /check?proxyipspan classhighlight>YOUR_PROXY_IP/span> /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>💡 使用示例/h3> div classcode-block>curl https://check-proxyip.ssss.nyc.mn/check?proxyip1.2.3.4:443 /div> h3 stylecolor: var(--text-primary); margin: 24px 0 16px;>🔗 响应Json格式/h3> div classcode-block>{br> success: true|false, // 代理 IP 是否有效br> proxyIP: 1.2.3.4, // 如果有效,返回代理 IP,否则为 -1br> portRemote: 443, // 如果有效,返回端口,否则为 -1br> colo: HKG, // 执行此次请求的Cloudflare机房br> responseTime: 166, // 如果有效,返回响应毫秒时间,否则为 -1br> message: 第1次验证有效ProxyIP, // 返回验证信息br> timestamp: 2025-06-03T17:27:52.946Z // 检查时间br>}br> /div> /div> div classfooter> p stylemargin-top: 8px; opacity: 0.8;>© 2025 Check ProxyIP - 基于 Cloudflare Workers 构建的高性能 ProxyIP 验证服务 | 由 strong>cmliu/strong> 开发/p> /div> /div> div idtoast classtoast>/div> script> // 全局变量 let isChecking false; const ipCheckResults new Map(); // 缓存IP检查结果 let pageLoadTimestamp; // 页面加载时的时间戳 // 计算时间戳的函数 function calculateTimestamp() { const currentDate new Date(); return Math.ceil(currentDate.getTime() / (1000 * 60 * 13)); // 每13分钟一个时间戳 } // 添加前端的代理IP格式验证函数 function isValidProxyIPFormat(input) { // 检查是否为域名格式 const domainRegex /^a-zA-Z0-9(a-zA-Z0-9\-{0,61}a-zA-Z0-9)?(\.a-zA-Z0-9(a-zA-Z0-9\-{0,61}a-zA-Z0-9)?)*$/; // 检查是否为IP格式 const ipv4Regex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?)$/; const ipv6Regex /^\?(0-9a-fA-F{0,4}:){1,7}0-9a-fA-F{0,4}\?$/; // 允许带端口的格式 const withPortRegex /^.+:\d+$/; const tpPortRegex /^.+\.tp\d+\./; return domainRegex.test(input) || ipv4Regex.test(input) || ipv6Regex.test(input) || withPortRegex.test(input) || tpPortRegex.test(input); } // 初始化 document.addEventListener(DOMContentLoaded, function() { // 记录页面加载时的时间戳 pageLoadTimestamp calculateTimestamp(); console.log(页面加载完成,时间戳:, pageLoadTimestamp); const input document.getElementById(proxyip); input.focus(); // 直接解析当前URL路径 const currentPath window.location.pathname; let autoCheckValue null; // 检查URL参数中的autocheck(保持兼容性) const urlParams new URLSearchParams(window.location.search); autoCheckValue urlParams.get(autocheck); // 如果没有autocheck参数,检查路径 if (!autoCheckValue && currentPath.length > 1) { const pathContent currentPath.substring(1); // 移除开头的 / // 检查路径是否为有效的代理IP格式 if (isValidProxyIPFormat(pathContent)) { autoCheckValue pathContent; // 清理URL,移除路径部分 const newUrl new URL(window.location); newUrl.pathname /; window.history.replaceState({}, , newUrl); } } // 如果没有从URL获取到值,尝试从localStorage获取上次搜索的地址 if (!autoCheckValue) { try { const lastSearch localStorage.getItem(lastProxyIP); if (lastSearch && isValidProxyIPFormat(lastSearch)) { input.value lastSearch; // 不自动执行检测,只是填充输入框 } } catch (error) { console.log(读取历史记录失败:, error); } } if (autoCheckValue) { input.value autoCheckValue; // 如果来自URL参数,清除参数 if (urlParams.has(autocheck)) { const newUrl new URL(window.location); newUrl.searchParams.delete(autocheck); window.history.replaceState({}, , newUrl); } // 延迟执行搜索,确保页面完全加载 setTimeout(() > { if (!isChecking) { checkProxyIP(); } }, 500); } // 输入框回车事件 input.addEventListener(keypress, function(event) { if (event.key Enter && !isChecking) { checkProxyIP(); } }); // 添加事件委托处理复制按钮点击 document.addEventListener(click, function(event) { if (event.target.classList.contains(copy-btn)) { const text event.target.getAttribute(data-copy); if (text) { copyToClipboard(text, event.target); } } }); }); // 显示toast消息 function showToast(message, duration 3000) { const toast document.getElementById(toast); toast.textContent message; toast.classList.add(show); setTimeout(() > { toast.classList.remove(show); }, duration); } // 复制到剪贴板 function copyToClipboard(text, element) { navigator.clipboard.writeText(text).then(() > { const originalText element.textContent; element.classList.add(copied); element.textContent 已复制 ✓; showToast(复制成功!); setTimeout(() > { element.classList.remove(copied); element.textContent originalText; }, 2000); }).catch(err > { console.error(复制失败:, err); showToast(复制失败,请手动复制); }); } // 创建复制按钮 function createCopyButton(text) { return `span classcopy-btn data-copy${text}>${text}/span>`; } // 检查是否为IP地址 function isIPAddress(input) { const ipv4Regex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?)$/; const ipv6Regex /^\?(0-9a-fA-F{0,4}:){1,7}0-9a-fA-F{0,4}\?$/; const ipv6WithPortRegex /^\0-9a-fA-F:+\:\d+$/; const ipv4WithPortRegex /^(?:(?:250-5|20-40-9|01?0-90-9?)\.){3}(?:250-5|20-40-9|01?0-90-9?):\d+$/; return ipv4Regex.test(input) || ipv6Regex.test(input) || ipv6WithPortRegex.test(input) || ipv4WithPortRegex.test(input); } // 添加输入预处理函数 function preprocessInput(input) { if (!input) return input; // 去除首尾空格 let processed input.trim(); // 检查是否还有空格 if (processed.includes( )) { // 只保留第一个空格前的内容 processed processed.split( )0; } return processed; } // 主检测函数 async function checkProxyIP() { if (isChecking) return; const proxyipInput document.getElementById(proxyip); const resultDiv document.getElementById(result); const checkBtn document.getElementById(checkBtn); const btnText checkBtn.querySelector(.btn-text); const spinner checkBtn.querySelector(.loading-spinner); const rawInput proxyipInput.value; const proxyip preprocessInput(rawInput); // 如果预处理后的值与原值不同,更新输入框 if (proxyip ! rawInput) { proxyipInput.value proxyip; showToast(已自动清理输入内容); } if (!proxyip) { showToast(请输入代理IP地址); proxyipInput.focus(); return; } // 检查时间戳是否过期 const currentTimestamp calculateTimestamp(); console.log(点击检测时的时间戳:, currentTimestamp); console.log(页面加载时的时间戳:, pageLoadTimestamp); console.log(时间戳是否一致:, currentTimestamp pageLoadTimestamp); if (currentTimestamp ! pageLoadTimestamp) { // 时间戳已过期,需要重新加载页面获取最新TOKEN const currentHost window.location.host; const currentProtocol window.location.protocol; const redirectUrl `${currentProtocol}//${currentHost}/${encodeURIComponent(proxyip)}`; console.log(时间戳过期,即将跳转到:, redirectUrl); showToast(TOKEN已过期,正在刷新页面...); // 延迟跳转,让用户看到提示 setTimeout(() > { window.location.href redirectUrl; }, 1000); return; } console.log(时间戳验证通过,继续执行检测逻辑); // 保存到localStorage try { localStorage.setItem(lastProxyIP, proxyip); } catch (error) { console.log(保存历史记录失败:, error); } // 设置加载状态 isChecking true; checkBtn.classList.add(btn-loading); checkBtn.disabled true; btnText.style.display none; spinner.style.display block; resultDiv.classList.remove(show); try { if (isIPAddress(proxyip)) { await checkSingleIP(proxyip, resultDiv); } else { await checkDomain(proxyip, resultDiv); } } catch (err) { resultDiv.innerHTML ` div classresult-card result-error> h3>❌ 检测失败/h3> p>strong>错误信息:/strong> ${err.message}/p> p>strong>检测时间:/strong> ${new Date().toLocaleString()}/p> /div> `; resultDiv.classList.add(show); } finally { isChecking false; checkBtn.classList.remove(btn-loading); checkBtn.disabled false; btnText.style.display block; spinner.style.display none; } } // 检查单个IP async function checkSingleIP(proxyip, resultDiv) { const response await fetch(`./check?proxyip${encodeURIComponent(proxyip)}`); const data await response.json(); if (data.success) { const ipInfo await getIPInfo(data.proxyIP); const ipInfoHTML formatIPInfo(ipInfo); const responseTimeHTML data.responseTime && data.responseTime > 0 ? `div classtooltip> span stylebackground: var(--success-color); color: white; padding: 4px 8px; border-radius: 6px; font-weight: 600; font-size: 14px;>${data.responseTime}ms/span> span classtooltiptext>该延迟并非 strong>您当前网络/strong> 到 ProxyIP 的实际延迟,br>而是 strong>Cloudflare.${data.colo || CF} 机房/strong> 到 ProxyIP 的响应时间。/span> /div>` : span stylecolor: var(--text-light);>延迟未知/span>; resultDiv.innerHTML ` div classresult-card result-success> h3>✅ ProxyIP 有效/h3> div stylemargin-top: 20px;> div styledisplay: flex; align-items: center; gap: 12px; margin-bottom: 12px; flex-wrap: wrap;> strong>🌐 ProxyIP 地址:/strong> ${createCopyButton(data.proxyIP)} ${ipInfoHTML} ${responseTimeHTML} /div> p>strong>🔌 端口:/strong> ${createCopyButton(data.portRemote.toString())}/p> p>strong>🏢 机房信息:/strong> ${data.colo || CF}/p> p>strong>🕒 检测时间:/strong> ${new Date(data.timestamp).toLocaleString()}/p> /div> /div> `; } else { resultDiv.innerHTML ` div classresult-card result-error> h3>❌ ProxyIP 失效/h3> div stylemargin-top: 20px;> div styledisplay: flex; align-items: center; gap: 12px; margin-bottom: 12px; flex-wrap: wrap;> strong>🌐 IP地址:/strong> ${createCopyButton(proxyip)} span stylecolor: var(--error-color); font-weight: 600; font-size: 18px;>❌/span> /div> p>strong>🔌 端口:/strong> ${data.portRemote && data.portRemote ! -1 ? createCopyButton(data.portRemote.toString()) : 未知}/p> p>strong>🏢 机房信息:/strong> ${data.colo || CF}/p> ${data.message ? `p>strong>错误信息:/strong> ${data.message}/p>` : } p>strong>🕒 检测时间:/strong> ${new Date(data.timestamp).toLocaleString()}/p> /div> /div> `; } resultDiv.classList.add(show); } // 检查域名 async function checkDomain(domain, resultDiv) { let portRemote 443; let cleanDomain domain; // 解析端口 if (domain.includes(.tp)) { portRemote domain.split(.tp)1.split(.)0 || 443; } else if (domain.includes() && domain.includes(:)) { portRemote parseInt(domain.split(:)1) || 443; cleanDomain domain.split(:)0 + ; } else if (domain.includes(:)) { portRemote parseInt(domain.split(:)1) || 443; cleanDomain domain.split(:)0; } // 解析域名 const resolveResponse await fetch(`./resolve?domain${encodeURIComponent(cleanDomain)}&token4f6c05591a005dd6bb336fd0d1f41527`); const resolveData await resolveResponse.json(); if (!resolveData.success) { throw new Error(resolveData.error || 域名解析失败); } const ips resolveData.ips; if (!ips || ips.length 0) { throw new Error(未找到域名对应的IP地址); } // 清空缓存 ipCheckResults.clear(); // 显示初始结果 resultDiv.innerHTML ` div classresult-card result-warning> h3>🔍 域名解析结果/h3> div stylemargin-top: 20px;> p>strong>🌐 ProxyIP 域名:/strong> ${createCopyButton(cleanDomain)}/p> p>strong>🔌 端口:/strong> ${createCopyButton(portRemote.toString())}/p> p>strong>🏢 机房信息:/strong> span iddomain-colo>检测中.../span>/p> p>strong>📋 发现IP:/strong> ${ips.length} 个/p> p>strong>🕒 解析时间:/strong> ${new Date().toLocaleString()}/p> /div> div classip-grid idip-grid> ${ips.map((ip, index) > ` div classip-item idip-item-${index}> div classip-status-line idip-status-line-${index}> strong>IP:/strong> ${createCopyButton(ip)} span idip-info-${index} stylecolor: var(--text-secondary);>获取信息中.../span> span classstatus-icon idstatus-icon-${index}>🔄/span> /div> /div> `).join()} /div> /div> `; resultDiv.classList.add(show); // 并发检查所有IP和获取IP信息 const checkPromises ips.map((ip, index) > checkIPWithIndex(ip, portRemote, index)); const ipInfoPromises ips.map((ip, index) > getIPInfoWithIndex(ip, index)); await Promise.all(...checkPromises, ...ipInfoPromises); // 使用缓存的结果更新整体状态和机房信息 const validCount Array.from(ipCheckResults.values()).filter(r > r.success).length; const totalCount ips.length; const resultCard resultDiv.querySelector(.result-card); // 获取第一个有效结果的colo信息 const firstValidResult Array.from(ipCheckResults.values()).find(r > r.success && r.colo); const coloInfo firstValidResult?.colo || CF; // 更新机房信息 const coloElement document.getElementById(domain-colo); if (coloElement) { coloElement.textContent coloInfo; } if (validCount totalCount) { resultCard.className result-card result-success; resultCard.querySelector(h3).innerHTML ✅ 所有IP均有效; } else if (validCount 0) { resultCard.className result-card result-error; resultCard.querySelector(h3).innerHTML ❌ 所有IP均失效; } else { resultCard.className result-card result-warning; resultCard.querySelector(h3).innerHTML `⚠️ 部分IP有效 (${validCount}/${totalCount})`; } } // 检查单个IP(带索引) async function checkIPWithIndex(ip, port, index) { try { const cacheKey `${ip}:${port}`; let result; // 检查是否已有缓存结果 if (ipCheckResults.has(cacheKey)) { result ipCheckResults.get(cacheKey); } else { // 调用API检查IP状态 result await checkIPStatus(cacheKey); // 缓存结果 ipCheckResults.set(cacheKey, result); } const itemElement document.getElementById(`ip-item-${index}`); const statusIcon document.getElementById(`status-icon-${index}`); if (result.success) { itemElement.style.background linear-gradient(135deg, #d4edda, #c3e6cb); itemElement.style.borderColor var(--success-color); const responseTimeHTML result.responseTime && result.responseTime > 0 ? `div classtooltip> span stylebackground: var(--success-color); color: white; padding: 2px 6px; border-radius: 4px; font-size: 12px; font-weight: 600;>${result.responseTime}ms/span> span classtooltiptext>该延迟并非 strong>您当前网络/strong> 到 ProxyIP 的实际延迟,br>而是 strong>Cloudflare.${result.colo || CF} 机房/strong> 到 ProxyIP 的响应时间。/span> /div>` : span stylecolor: var(--text-light); font-size: 12px;>延迟未知/span>; statusIcon.innerHTML responseTimeHTML; statusIcon.className status-icon status-success; } else { itemElement.style.background linear-gradient(135deg, #f8d7da, #f5c6cb); itemElement.style.borderColor var(--error-color); statusIcon.textContent ❌; statusIcon.className status-icon status-error; statusIcon.style.color var(--error-color); statusIcon.style.fontSize 18px; } } catch (error) { console.error(检查IP失败:, error); const statusIcon document.getElementById(`status-icon-${index}`); if (statusIcon) { statusIcon.textContent ❌; statusIcon.className status-icon status-error; statusIcon.style.color var(--error-color); statusIcon.style.fontSize 18px; } // 将失败结果也缓存起来 const cacheKey `${ip}:${port}`; ipCheckResults.set(cacheKey, { success: false, error: error.message, colo: CF }); } } // 获取IP信息(带索引) async function getIPInfoWithIndex(ip, index) { try { const ipInfo await getIPInfo(ip); const infoElement document.getElementById(`ip-info-${index}`); if (infoElement) { infoElement.innerHTML formatIPInfo(ipInfo); } } catch (error) { console.error(获取IP信息失败:, error); const infoElement document.getElementById(`ip-info-${index}`); if (infoElement) { infoElement.innerHTML span stylecolor: var(--text-light);>信息获取失败/span>; } } } // 获取IP信息 async function getIPInfo(ip) { try { const cleanIP ip.replace(/\\/g, ); const response await fetch(`./ip-info?ip${encodeURIComponent(cleanIP)}&token4f6c05591a005dd6bb336fd0d1f41527`); const data await response.json(); return data; } catch (error) { return null; } } // 格式化IP信息 function formatIPInfo(ipInfo) { if (!ipInfo || ipInfo.status ! success) { return span stylecolor: var(--text-light);>信息获取失败/span>; } const country ipInfo.country || 未知; const as ipInfo.as || 未知; return ` span classtag tag-country>${country}/span> span classtag tag-as>${as}/span> `; } // 检查IP状态 async function checkIPStatus(ip) { try { const response await fetch(`./check?proxyip${encodeURIComponent(ip)}`); const data await response.json(); return data; } catch (error) { return { success: false, error: error.message }; } } /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]