PageSourceSearch

https://xfastapi.ai/assets/NetCheckView-Dxa9auft.js

js xfastapi.ai collected 2026-10-05 13:20:34 UTC 24,106 bytes, 2 lines download raw bytes

1import{d as et,r as g,q as st,c as x,o as at,y as d,z as e,Y as h,A as r,E as f,F as P,C as U,H as b,B as T,D as l}from"./vendor-vue-Du3XgG1t.js";const rt={class:"min-h-screen bg-gray-50 px-4 py-8 text-gray-800 dark:bg-dark-900 dark:text-dark-100"},ot={class:"mx-auto max-w-3xl space-y-6"},nt={class:"rounded-xl border-2 border-red-400 bg-white p-5 shadow-md dark:border-red-500/70 dark:bg-dark-800"},dt={class:"mb-3 flex items-center justify-between"},lt=["disabled"],it={class:"font-semibold"},ct={class:"ml-1"},ut={class:"overflow-hidden rounded-lg border border-gray-200 dark:border-dark-600"},xt={class:"w-full text-sm"},bt={class:"px-3 py-2 font-medium text-gray-700 dark:text-gray-200"},mt={class:"px-3 py-2 text-right tabular-nums text-gray-600 dark:text-gray-300"},gt={class:"px-3 py-2 text-right"},pt={key:0,class:"text-xs text-gray-400"},kt={key:1,class:"text-xs text-green-600 dark:text-green-400"},yt={key:2,class:"text-xs text-red-600 dark:text-red-400"},ft={key:3,class:"text-xs text-gray-400"},vt={class:"rounded-xl border border-gray-200 bg-white p-5 shadow-sm dark:border-dark-700 dark:bg-dark-800"},ht={class:"mb-1 flex items-center justify-between"},$t=["disabled"],_t={class:"font-semibold"},wt={class:"ml-1"},Ct={class:"grid grid-cols-2 gap-3 sm:grid-cols-4"},Tt={class:"rounded-lg bg-gray-50 p-3 dark:bg-dark-700/50"},Mt={class:"rounded-lg bg-gray-50 p-3 dark:bg-dark-700/50"},St={class:"mt-0.5 text-sm font-medium tabular-nums text-gray-700 dark:text-gray-300"},Nt={class:"rounded-lg bg-gray-50 p-3 dark:bg-dark-700/50"},Lt={key:0,class:"text-xs font-normal text-gray-400"},It={class:"rounded-lg bg-gray-50 p-3 dark:bg-dark-700/50"},Bt={class:"mt-0.5 text-sm font-medium text-gray-700 dark:text-gray-300"},Pt={class:"mt-3 rounded-lg border border-dashed border-gray-300 p-3 text-sm dark:border-dark-600"},Ut={class:"flex flex-wrap items-center gap-x-4 gap-y-1"},Ft={class:"text-gray-500 dark:text-dark-400"},Wt={class:"font-mono text-gray-800 dark:text-gray-200"},jt={class:"text-gray-500 dark:text-dark-400"},At={key:0,class:"mt-2 text-xs leading-relaxed text-red-600 dark:text-red-400"},Dt={key:1,class:"mt-2 text-xs text-green-600 dark:text-green-400"},Ot={class:"rounded-xl border border-gray-200 bg-white p-5 shadow-sm dark:border-dark-700 dark:bg-dark-800"},Ht={class:"mt-4 inline-flex rounded-lg bg-gray-100 p-1 dark:bg-dark-700"},Et=["onClick"],Kt={class:"mt-4 space-y-4"},Rt={class:"mb-1.5 flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-200"},Vt={key:0,class:"rounded-full bg-primary-50 px-2 py-0.5 text-xs font-medium text-primary-600 dark:bg-primary-900/30 dark:text-primary-300"},qt={class:"mb-2 text-xs text-gray-500 dark:text-dark-400"},zt={class:"overflow-hidden rounded-lg border border-gray-700/50 shadow-sm"},Yt={class:"flex items-center justify-between border-b border-gray-700/50 bg-gray-800 px-3 py-2"},Gt={class:"flex items-center gap-1.5"},Qt={class:"ml-2 text-xs text-gray-400"},Jt=["onClick"],Xt={class:"overflow-x-auto bg-gray-900 p-3.5 text-xs leading-relaxed text-gray-100"},Zt={key:0,class:"mt-4 rounded-lg border-l-4 border-amber-500 bg-amber-50 p-3 text-xs leading-relaxed text-amber-900 dark:bg-amber-900/20 dark:text-amber-200"},te="/api/net-check",D="https://xfastapi.ai/api/net-check",O=10,ee=8e3,se="/api/net-check/payload",ae=2e4,re=`U="https://xfastapi.ai/api/net-check"; N=10; ok=0; ts=""; for i in $(seq 1 $N); do r=$(curl -o /dev/null -s -w "%{http_code} %{time_total}" "$U?t=$i"); c=\${r%% *}; t=\${r##* }; if [ "$c" = "200" ]; then ok=$((ok+1)); ts="$ts $t"; echo "第 $i/$N 次: \${t}s"; else echo "第 $i/$N 次: 失败($c)"; fi; done; echo "----"; j=$(curl -s "$U"); ip=$(printf "%s" "$j" | tr ',' '\\n' | grep your_ip | cut -d'"' -f4); cc=$(printf "%s" "$j" | tr ',' '\\n' | grep country | cut -d'"' -f4); echo "$ts" | awk -v n=$N -v ok=$ok -v ip="$ip" -v cc="$cc" '{min=1e9;max=0;s=0;for(i=1;i<=NF;i++){v=$i*1000;s+=v;if(v<min)min=v;if(v>max)max=v} if(ok>0)printf "平均延迟: %.0fms  最快: %.0fms  最慢: %.0fms  抖动: %.0fms\\n",s/ok,min,max,max-min; printf "丢包率: %d%%  成功: %d/%d\\n",(n-ok)*100/n,ok,n; printf "出口IP: %s  国家: %s\\n",(ip=="")?"-":ip,(cc=="")?"-":cc}'`,oe='[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; $u="https://xfastapi.ai/api/net-check"; $n=10; $t=@(); for($i=1;$i -le $n;$i++){ $ms=(Measure-Command { curl.exe -s -o NUL ($u + "?t=$i") }).TotalMilliseconds; if($LASTEXITCODE -eq 0){ $r=[math]::Round($ms); $t+=$r; Write-Host "第 $i/$n 次: $($r)ms" } else { Write-Host "第 $i/$n 次: 失败" } }; Write-Host "----"; $j=curl.exe -s $u | ConvertFrom-Json; if($t.Count){ $avg=[int](($t|measure -Average).Average); $mn=($t|measure -Minimum).Minimum; $mx=($t|measure -Maximum).Maximum; "平均延迟: $($avg)ms  最快: $($mn)ms  最慢: $($mx)ms  抖动: $($mx-$mn)ms" }; "丢包率: $([int]((($n-$t.Count)/$n)*100))%  成功: $($t.Count)/$n"; "出口IP: $($j.your_ip)  国家: $($j.country)"',ne=`U="https://xfastapi.ai/api/net-check/payload"; for s in 65536 262144 1048576 4194304; do curl -o /dev/null -s -w "$((s/1024)) %{time_total} %{speed_download}\\n" "$U?bytes=$s&t=$s"; done | awk '{printf "包体:%6sKB  耗时:%6.2fs  速度:%7.2f Mbps\\n",$1,$2,$3*8/1000000}'`,de='[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; $u="https://xfastapi.ai/api/net-check/payload"; foreach($s in 65536,262144,1048576,4194304){ $sec=(Measure-Command { curl.exe -s -o NUL ($u+"?bytes=$s&t=$s") }).TotalSeconds; $mbps=if($sec -gt 0){[math]::Round($s*8/1000000/$sec,2)}else{0}; Write-Host ("包体:{0,6}KB  耗时:{1,6:F2}s  速度:{2,7} Mbps" -f [int]($s/1024),$sec,$mbps) }',ce=et({__name:"NetCheckView",setup(le){const v=g(!1),M=g([]),$=g(0),S=g(0),n=st({your_ip:"",country:"",cf_colo:""}),o=x(()=>{const s=M.value,t=s.length+$.value;if(s.length===0)return{total:t,success:0,avg:null,min:null,max:null,jitter:null};const a=Math.min(...s),u=Math.max(...s),i=Math.round(s.reduce((p,m)=>p+m,0)/s.length);return{total:t,success:s.length,avg:i,min:Math.round(a),max:Math.round(u),jitter:Math.round(u-
1a)}}),F=x(()=>o.value.total?o.value.success/o.value.total:0),N=x(()=>o.value.total?Math.round((1-F.value)*100):0),L=x(()=>v.value&&o.value.total===0?{title:"检测中…",detail:"正在测试浏览器到本站的连通性。",boxClass:"bg-gray-100 text-gray-600 dark:bg-dark-700 dark:text-dark-300"}:o.value.success===0?{title:"✗ 浏览器无法连通本站",detail:"你的浏览器都连不上,请先确认梯子/网络,再重试。",boxClass:"bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-300"}:F.value<1||(o.value.avg??0)>1200?{title:"△ 浏览器可连通,但不稳定",detail:"存在丢包或高延迟,网络质量较差;客户端更易超时。",boxClass:"bg-amber-50 text-amber-800 dark:bg-amber-900/20 dark:text-amber-300"}:{title:"✓ 浏览器可连通",detail:"浏览器这条路正常。若客户端仍失败,请看下方终端自检。",boxClass:"bg-green-50 text-green-700 dark:bg-green-900/20 dark:text-green-300"}),H=x(()=>{const s=o.value.avg;return s==null?"text-gray-400":s<=300?"text-green-600 dark:text-green-400":s<=800?"text-amber-600 dark:text-amber-400":"text-red-600 dark:text-red-400"}),E=x(()=>N.value===0?"text-green-600 dark:text-green-400":N.value<100?"text-amber-600 dark:text-amber-400":"text-red-600 dark:text-red-400"),K=x(()=>n.country?n.country==="CN"?"中国大陆 (CN)":n.country:"未知"),R=x(()=>n.country==="CN"?"text-red-600 dark:text-red-400":n.country?"text-green-600 dark:text-green-400":"text-gray-500"),_=[{label:"64 KB",bytes:64*1024},{label:"256 KB",bytes:256*1024},{label:"1 MB",bytes:1024*1024},{label:"4 MB",bytes:4*1024*1024}],k=g(!1),I=g(0),y=g([]);function V(s){return s==null?"text-gray-400":s>=8?"text-green-600 dark:text-green-400":s>=2?"text-amber-600 dark:text-amber-400":"text-red-600 dark:text-red-400"}const q=x(()=>_.map(s=>{const t=y.value.find(u=>u.bytes===s.bytes),a=k.value&&!t;return{label:s.label,bytes:s.bytes,ms:t?t.ms:null,mbpsText:t&&t.mbps!=null?t.mbps.toFixed(2)+" Mbps":a?"…":"—",speedColor:V(t?t.mbps:null),ok:!!t&&t.ok,failed:!!t&&t.failed,err:t?t.err:"",pending:a}})),B=x(()=>{if(k.value&&y.value.length===0)return{title:"测速中…",detail:"正在从小到大测试下载带宽。",boxClass:"bg-gray-100 text-gray-600 dark:bg-dark-700 dark:text-dark-300"};const s=y.value;if(s.length===0)return{title:"待测速",detail:"点击右上角开始带宽测速。",boxClass:"bg-gray-100 text-gray-600 dark:bg-dark-700 dark:text-dark-300"};const t=s.filter(c=>c.ok&&c.mbps!=null),a=t.some(c=>c.bytes<=256*1024),u=s.some(c=>c.failed&&c.bytes>=1024*1024);if(a&&u)return{title:"✗ 疑似被限速(大流量被拖垮)",detail:"小包能下载,但大包超时/中断——这正是大陆被限速的典型表现,真实对话(长回复流式)会频繁卡断。请优先给终端配全局/TUN 代理。",boxClass:"bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-300"};if(t.length<2)return{title:"△ 带宽数据不足",detail:"成功样本太少,无法判断限速,请重试或改善网络。",boxClass:"bg-amber-50 text-amber-800 dark:bg-amber-900/20 dark:text-amber-300"};const i=Math.max(...t.map(c=>c.mbps)),p=t.reduce((c,A)=>c.bytes>=A.bytes?c:A);return p.mbps/i<.4?{title:"△ 大包速度骤降,疑似被限速",detail:`峰值 ${i.toFixed(1)} Mbps,但大包只剩 ${p.mbps.toFixed(1)} Mbps(不到峰值 40%)。大流量下被明显限速,真实对话体验会差很多。`,boxClass:"bg-amber-50 text-amber-800 dark:bg-amber-900/20 dark:text-amber-300"}:i<2?{title:"△ 整体带宽偏低",detail:`峰值仅 ${i.toFixed(1)} Mbps,虽未见明显阶梯式限速,但绝对带宽较低,长回复可能偏慢。`,boxClass:"bg-amber-50 text-amber-800 dark:bg-amber-900/20 dark:text-amber-300"}:{title:"✓ 带宽稳定,未见明显限速",detail:`峰值 ${i.toFixed(1)} Mbps,大包速度保持良好。浏览器这条路带宽正常;若客户端仍慢,见下方终端自检。`,boxClass:"bg-green-50 text-green-700 dark:bg-green-900/20 dark:text-green-300"}});async function z(s){const t=new AbortController,a=setTimeout(()=>t.abort(),ae),u=performance.now();try{const i=await fetch(`${se}?bytes=${s.bytes}&t=${Date.now()}`,{cache:"no-store",signal:t.signal});if(!i.ok){y.value.push({bytes:s.bytes,ms:null,mbps:null,ok:!1,failed:!0,err:"HTTP "+i.status});return}const p=await i.arrayBuffer(),m=performance.now()-u,c=p.byteLength*8/(m/1e3)/1e6;y.value.push({bytes:s.bytes,ms:Math.round(m),mbps:c,ok:!0,failed:!1,err:""})}catch{y.value.push({bytes:s.bytes,ms:null,mbps:null,ok:!1,failed:!0,err:"超时/中断"})}finally{clearTimeout(a)}}async function W(){if(!k.value){k.value=!0,y.value=[],I.value=0;try{for(let s=0;s<_.length;s++)await z(_[s]),I.value=s+1}finally{k.value=!1}}}const Y=`curl -o /dev/null -s -w "DNS:%{time_namelookup}s  Connect:%{time_connect}s  TLS:%{time_appconnect}s  TTFB:%{time_starttransfer}s  Total:%{time_total}s  HTTP:%{http_code}\\n" ${D}`,G=`curl.exe -o NUL -s -w "DNS:%{time_namelookup}s  Connect:%{time_connect}s  TLS:%{time_appconnect}s  TTFB:%{time_starttransfer}s  Total:%{time_total}s  HTTP:%{http_code}\\n" ${D}`,Q=[{k:"win",l:"Windows"},{k:"unix",l:"macOS / Linux"}],J=/Windows|Win32|Win64/i.test(typeof navigator<"u"&&(navigator.userAgent||navigator.platform)||""),w=g(J?"win":"unix"),X=x(()=>w.value==="win"?[{key:"win-bw",title:"带宽 / 限速自检",badge:"最关键 · 先跑这个",term:"PowerShell",desc:"从小到大下载 64KB→4MB,看速度是否随包体骤降(=被限速,真实对话会卡)。",text:de},{key:"win-full",title:"完整自检",badge:"推荐",term:"PowerShell",desc:"连测 10 次,输出中文的平均延迟 / 丢包率 / 抖动 / 出口IP(与本页一致)。",text:oe},{key:"win-quick",title:"快速单次",badge:"",term:"CMD / PowerShell",desc:"看单次请求的 DNS / 连接 / TLS / 首字节分段耗时。",text:G}]:[{key:"unix-bw",title:"带宽 / 限速自检",badge:"最关键 · 先跑这个",term:"bash / zsh",desc:"从小到大下载 64KB→4MB,看速度是否随包体骤降(=被限速,真实对话会卡)。",text:ne},{key:"unix-full",title:"完整自检",badge:"推荐",term:"bash / zsh",desc:"连测 10 次,输出中文的平均延迟 / 丢包率 / 抖动 / 出口IP(与本页一致)。",text:re},{key:"unix-quick",title:"快速单次",badge:"",term:"bash / zsh",desc:"看单次请求的 DNS / 连接 / TLS / 首字节分段耗时。",text:Y}]),C=g("");async function Z(s,t){try{await navigator.clipboard.writeText(s),C.value=t,setTimeout(()=>{C.value===t&&(C.value="")},1500)}catch{}}async function tt(s){const t=new AbortController,a=setTimeout(()=>t.abort(),ee),u=performance.now();try{const i=await fetch(`${te}?t=${Date.now()}_${s}`,{cache:"no-store",signal:t.signal}),p=performance.now()-u;if(!i.ok){$.value++;return}if(M.value.push(p),!n.your_ip)try{const m=await i.json();n.your_ip=m.your_ip||"",n.country=m.country||"",n.cf_colo=m.cf_colo||""}catch{}}catch{$.value++}finally{clearTimeout(a)}}async function j(){if(!v.value){v.value=!0,M.value=[],$.value=0,S.value=0,n.your_ip="",n.country="",n.cf_colo="";try{for(let s=0;s<O;s++)await tt(s),S.value=s+1}finally{v.value=!1}}}return at(async()=>{await W(),await j()}),(s,t)=>
1(l(),d("div",rt,[e("div",ot,[t[23]||(t[23]=h('<div class="flex items-center justify-between"><div class="flex items-baseline gap-2"><span class="text-xl font-bold text-primary-600 dark:text-primary-400">xfastapi</span><span class="text-sm text-gray-400">网络自检 · Network Self-Check</span></div><a href="https://xfastapi.ai" class="text-xs text-gray-400 hover:text-primary-500">xfastapi.ai</a></div><div class="rounded-lg border-l-4 border-amber-500 bg-amber-50 p-4 dark:bg-amber-900/20"><div class="flex items-start gap-2"><span class="text-lg">⚠️</span><div class="text-sm leading-relaxed text-amber-900 dark:text-amber-200"><p class="font-semibold">本页在「浏览器」中运行,只代表你的浏览器网络。</p><p class="mt-1"> 浏览器能连通 <b>≠</b> 你的 <b>CLI / 客户端 / 终端</b> 能连通——梯子(代理)经常只覆盖浏览器, 而不覆盖终端。若网页正常但客户端仍超时,请务必看下方的 <b>「终端自检」</b>。 </p><p class="mt-1 text-xs text-amber-700 dark:text-amber-300/80"> This page tests your <b>browser</b> only. A working browser does not mean your CLI / terminal can connect. </p></div></div></div>',2)),e("div",nt,[e("div",dt,[t[2]||(t[2]=e("h2",{class:"flex items-center gap-2 text-base font-semibold"},[e("span",null,"① 带宽 / 限速自检"),e("span",{class:"rounded-full bg-red-500 px-2 py-0.5 text-xs font-semibold text-white"},"最关键 · 优先看这里")],-1)),e("button",{class:"rounded-md bg-primary-600 px-3 py-1.5 text-sm font-medium text-white transition hover:bg-primary-700 disabled:opacity-50",disabled:k.value,onClick:t[0]||(t[0]=a=>W())},r(k.value?"测速中 "+I.value+"/"+_.length+"…":"重新测速"),9,lt)]),t[4]||(t[4]=h('<div class="mb-3 rounded-lg border-l-4 border-red-400 bg-red-50 p-3 text-xs leading-relaxed text-red-800 dark:bg-red-900/20 dark:text-red-200"><b>为什么这个最重要:</b>「能连通」<b>≠</b>「不被限速」。大陆的防火墙/CF 干扰主力是<b>限速</b>而非阻断—— 小包能秒回,可一旦<b>持续拉大流量</b>(真实对话=长回复流式吐字、大 prompt 上传)就会被拖到龟速甚至卡死。 下面从小到大递增测<b>有效带宽</b>:<b>小包快、大包骤降 = 典型被限速</b>。 <span class="mt-1 block"><b>⚠️ 网页测的只是浏览器这条网络,结果仅供参考——实际请以下方 ③ 终端自检为准</b>(你的 CLI / 客户端走的是终端网络)。</span></div>',1)),e("div",{class:f(["mb-3 rounded-lg p-3 text-sm",B.value.boxClass])},[e("span",it,r(B.value.title),1),e("span",ct,r(B.value.detail),1)],2),e("div",ut,[e("table",xt,[t[3]||(t[3]=e("thead",null,[e("tr",{class:"bg-gray-50 text-xs text-gray-500 dark:bg-dark-700/50 dark:text-dark-400"},[e("th",{class:"px-3 py-2 text-left font-medium"},"包体大小"),e("th",{class:"px-3 py-2 text-right font-medium"},"耗时"),e("th",{class:"px-3 py-2 text-right font-medium"},"速度"),e("th",{class:"px-3 py-2 text-right font-medium"},"状态")])],-1)),e("tbody",null,[(l(!0),d(P,null,U(q.value,a=>(l(),d("tr",{key:a.bytes,class:"border-t border-gray-100 dark:border-dark-700"},[e("td",bt,r(a.label),1),e("td",mt,r(a.ms!=null?a.ms+" ms":"—"),1),e("td",{class:f(["px-3 py-2 text-right tabular-nums font-semibold",a.speedColor])},r(a.mbpsText),3),e("td",gt,[a.pending?(l(),d("span",pt,"测速中…")):a.ok?(l(),d("span",kt,"✓")):a.failed?(l(),d("span",yt,"✗ "+r(a.err),1)):(l(),d("span",ft,"—"))])]))),128))])])]),t[5]||(t[5]=e("p",{class:"mt-2 text-xs leading-relaxed text-gray-500 dark:text-dark-400"},[b(" 速度为浏览器实测下载带宽(Mbps)。同样地,这仍是"),e("b",null,"浏览器"),b("这条网络;你的 CLI/终端若没走同一条代理,实际会更差——请再看下方 ③ 终端自检。 ")],-1))]),e("div",vt,[e("div",ht,[t[6]||(t[6]=e("h2",{class:"text-base font-semibold"},"② 浏览器到本站的连通性",-1)),e("button",{class:"rounded-md bg-primary-600 px-3 py-1.5 text-sm font-medium text-white transition hover:bg-primary-700 disabled:opacity-50",disabled:v.value,onClick:t[1]||(t[1]=a=>j())},r(v.value?"检测中 "+S.value+"/"+O+"…":"重新检测"),9,$t)]),t[16]||(t[16]=e("p",{class:"mb-3 text-xs font-medium text-amber-600 dar
1k:text-amber-400"}," ⚠️ 网页结果仅供参考——实际请以下方 ③ 终端自检为准(CLI / 客户端走的是终端网络,不是浏览器)。 ",-1)),e("div",{class:f(["mb-4 rounded-lg p-3 text-sm",L.value.boxClass])},[e("span",_t,r(L.value.title),1),e("span",wt,r(L.value.detail),1)],2),e("div",Ct,[e("div",Tt,[t[7]||(t[7]=e("div",{class:"text-xs text-gray-500 dark:text-dark-400"},"平均延迟",-1)),e("div",{class:f(["mt-0.5 text-lg font-semibold tabular-nums",H.value])},r(o.value.avg!=null?o.value.avg+" ms":"—"),3)]),e("div",Mt,[t[8]||(t[8]=e("div",{class:"text-xs text-gray-500 dark:text-dark-400"},"抖动 / 最快 / 最慢",-1)),e("div",St,r(o.value.jitter!=null?`±${o.value.jitter} / ${o.value.min} / ${o.value.max}`:"—"),1)]),e("div",Nt,[t[9]||(t[9]=e("div",{class:"text-xs text-gray-500 dark:text-dark-400"},"丢包率",-1)),e("div",{class:f(["mt-0.5 text-lg font-semibold tabular-nums",E.value])},[b(r(o.value.total?`${N.value}%`:"—")+" ",1),o.value.total?(l(),d("span",Lt,"(成功 "+r(o.value.success)+"/"+r(o.value.total)+")",1)):T("",!0)],2)]),e("div",It,[t[10]||(t[10]=e("div",{class:"text-xs text-gray-500 dark:text-dark-400"},"CF 接入节点",-1)),e("div",Bt,r(n.cf_colo||"—"),1)])]),e("div",Pt,[e("div",Ut,[e("span",Ft,[t[11]||(t[11]=b("你的出口 IP:",-1)),e("b",Wt,r(n.your_ip||"—"),1)]),e("span",jt,[t[12]||(t[12]=b("归属国家:",-1)),e("b",{class:f(R.value)},r(K.value),3)])]),n.country==="CN"?(l(),d("p",At,[...t[13]||(t[13]=[b(" 检测到你正从",-1),e("b",null,"中国大陆",-1),b("直连。若你在用梯子/代理,说明它",-1),e("b",null,"没有对本页生效",-1),b("; 你的 CLI/终端大概率也走的是直连,会更容易超时。请确认代理为「全局 / TUN」模式,或给终端单独配置代理。 ",-1)])])):n.country?(l(),d("p",Dt,[t[14]||(t[14]=b(" 你当前从",-1)),e("b",null,"境外("+r(n.country)+")",1),t[15]||(t[15]=b("访问,浏览器这条网络是通的。若客户端仍失败,问题多半在终端未走代理——见下方终端自检。 ",-1))])):T("",!0)])]),e("div",Ot,[t[21]||(t[21]=h('<h2 class="flex items-center gap-2 text-base font-semibold"><span>③ 终端 / 客户端自检</span><span class="rounded-full bg-red-500 px-2 py-0.5 text-xs font-semibold text-white">实际以此为准</span></h2><p class="mt-1 text-sm leading-relaxed text-gray-600 dark:text-dark-300"> 把下面命令复制到<b>你 CLI 实际使用的那个终端</b>里运行(同一个窗口、同一套代理设置)。 <b class="text-red-600 dark:text-red-400">若上面浏览器检测正常、但这条命令超时或失败,就说明你的终端没有走代理</b>——这正是最常见的原因。 </p><div class="mt-3 rounded-lg border-l-4 border-sky-400 bg-sky-50 p-3 text-xs leading-relaxed text-sky-900 dark:bg-sky-900/20 dark:text-sky-200"><b>ℹ️ 关于延迟:终端测出的延迟通常比网页高,这是正常现象。</b> 终端每次都会新建连接(含 DNS 解析、TLS 握手),更贴近你 CLI / 客户端<b>真实对话调用</b>时的体感; 网页复用同一条连接,所以数值更低。请重点看<b>能否连通、丢包率、是否稳定</b>,绝对数值仅供参考。 </div>',3)),e("div",Ht,[(l(),d(P,null,U(Q,a=>e("button",{key:a.k,class:f(["rounded-md px-4 py-1.5 text-sm font-medium transition-colors",w.value===a.k?"bg-white text-gray-900 shadow-sm dark:bg-dark-600 dark:text-white":"text-gray-500 hover:text-gray-700 dark:text-dark-400 dark:hover:text-dark-200"]),onClick:u=>w.value=a.k},r(a.l),11,Et)),64))]),e("div",Kt,[(l(!0),d(P,null,U(X.value,a=>(l(),d("div",{key:a.key},[e("div",Rt,[e("span",null,r(a.title),1),a.badge?(l(),d("span",Vt,r(a.badge),1)):T("",!0)]),e("p",qt,r(a.desc),1),e("div",zt,[e("div",Yt,[e("div",Gt,[t[17]||(t[17]=e("span",{class:"h-2.5 w-2.5 rounded-full bg-red-400/80"},null,-1)),t[18]||(t[18]=e("span",{class:"h-2.5 w-2.5 rounded-full bg-amber-400/80"},null,-1)),t[19]||(t[19]=e("span",{class:"h-2.5 w-2.5 rounded-full bg-green-400/80"},null,-1)),e("span",Qt,r(a.term),1)]),e("button",{class:"rounded px-2 py-0.5 text-xs text-gray-300 transition hover:bg-gray-700 hover:text-white",onClick:u=>Z(a.text,a.key)},r(C.value===a.key?"已复制 ✓":"复制"),9,Jt)]),e("pre",Xt,[e("code",null,r(a.text),1)])])]))),128))]),w.value==="win"?(l(),d("div",Zt,[...t[20]||(t[20]=[h('<b>Windows 用户务必注意:</b>命令里是 <code class="rounded bg-amber-100 px-1 dark:bg-amber-900/40">curl.exe</code>(带 <b>.exe</b>),不能只写 <code>curl</code>。 在 PowerShell 里 <code>curl</code> 是 <code>Invoke-WebRequest</code> 的别名,直接写会报「缺少参数 SessionVariable」之类的错。Windows 10/11 已自带 <code>curl.exe</code>。 ',14)])])):T("",!0),t[22]||(t[22]=h('<div class="mt-4 rounded-lg bg-gray-50 p-4 text-xs leading-relaxed text-gray-600 dark:bg-dark-700/50 dark:text-dark-300"><p class="font-medium text-gray-700 dark:text-gray-200">怎么看结果:</p><ul class="mt-1.5 list-disc space-y-1 pl-4"><li>能打印出 <code>平均延迟 / 丢包率 / 出口IP</code>(或 <code>HTTP:200</code>)→ 终端网络通,问题不在网络。</li><li><code>丢包率 100%</code> / <code>Could not resolve host</code> → DNS 被污染、代理未生效。</li><li>卡住不动 / <code>timed out</code> / <code>connection reset</code> → 被墙,或终端没走代理。</li></ul></div>',1))]),t[24]||(t[24]=h(`<div class="rounded-xl border border-gray-200 bg-white p-5 shadow-sm dark:border-dark-700 dark:bg-dark-800"><h2 class="mb-2 text-base font-semibold">④ 终端连不上怎么办</h2><ul class="list-disc space-y-2 pl-5 text-sm leading-relaxed text-gray-600 dark:text-dark-300"><li>把梯子/代理软件切到 <b>全局模式</b> 或 <b>TUN / 虚拟网卡模式</b>(这样终端流量也会走代理)。</li><li>或给终端单独设代理环境变量(把 <code>7890</code> 换成你代理的实际端口): <pre class="mt-1.5 overflow-x-auto rounded-lg bg-gray-900 p-3 text-xs text-gray-100"><code>export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890   # macOS / Linux
2set https_proxy=http://127.0.0.1:7890                                       &amp; :: Windows CMD</code></pre></li><li>设好后,先重跑上面第③步的命令确认通了,再启动你的 CLI / 客户端。</li></ul></div><p class="pb-4 text-center text-xs text-gray-400"> 本页仅检测「你的设备 → xfastapi」的网络连通性,不涉及账号,可放心公开使用。 · 技术支持 [email protected] </p>`,2))])]))}});
2export{ce as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.