@@ -69,7 +69,7 @@ func printTableRow(result pst.SpeedTestResult) {
6969 }
7070 latency := fmt .Sprintf ("%.2f ms" , result .PingLatency .Seconds ()* 1000 )
7171 packetLoss := "N/A"
72- fmt .Print (formatString (location , 16 ))
72+ fmt .Print (formatString (location , 15 ))
7373 fmt .Print (formatString (upload , 16 ))
7474 fmt .Print (formatString (download , 16 ))
7575 fmt .Print (formatString (latency , 16 ))
@@ -78,25 +78,26 @@ func printTableRow(result pst.SpeedTestResult) {
7878}
7979
8080// privateSpeedTest 使用 privatespeedtest 进行单个运营商测速
81- // operator 参数:只支持 "cmcc"、"cu"、"ct"
82- func privateSpeedTest (num int , operator string ) error {
81+ // operator 参数:只支持 "cmcc"、"cu"、"ct"、"other"
82+ // 返回值:实际测试的节点数量和错误信息
83+ func privateSpeedTest (num int , operator string ) (int , error ) {
8384 defer func () {
8485 if r := recover (); r != nil {
8586 fmt .Fprintf (os .Stderr , "[WARN] privateSpeedTest panic: %v\n " , r )
8687 }
8788 }()
8889 * pst .NoProgress = true
89- * pst .Quiet = true
90- * pst .NoHeader = true
91- * pst .NoProjectURL = true
90+ * pst .Quiet = true
91+ * pst .NoHeader = true
92+ * pst .NoProjectURL = true
9293 // 加载服务器列表
9394 serverList , err := pst .LoadServerList ()
9495 if err != nil {
95- return fmt .Errorf ("加载自定义服务器列表失败" )
96+ return 0 , fmt .Errorf ("加载自定义服务器列表失败" )
9697 }
9798 // 使用三网测速模式(每个运营商选择指定数量的最低延迟节点)
9899 serversPerISP := num
99- if serversPerISP <= 0 || serversPerISP > 5 {
100+ if serversPerISP <= 0 || serversPerISP > 5 {
100101 serversPerISP = 2
101102 }
102103 // 单个运营商测速:先过滤服务器列表
@@ -108,8 +109,10 @@ func privateSpeedTest(num int, operator string) error {
108109 carrierType = "Unicom"
109110 case "ct" :
110111 carrierType = "Telecom"
112+ case "other" :
113+ carrierType = "Other"
111114 default :
112- return fmt .Errorf ("不支持的运营商类型: %s" , operator )
115+ return 0 , fmt .Errorf ("不支持的运营商类型: %s" , operator )
113116 }
114117 // 过滤出指定运营商的服务器
115118 filteredServers := pst .FilterServersByISP (serverList .Servers , carrierType )
@@ -121,13 +124,13 @@ func privateSpeedTest(num int, operator string) error {
121124 // 使用 FindBestServers 选择最佳服务器
122125 candidateServers , err := pst .FindBestServers (
123126 filteredServers ,
124- candidateCount , // 选择更多候选节点用于去重
125- 5 * time .Second , // ping 超时
126- true , // 显示进度条
127- true , // 静默
127+ candidateCount , // 选择更多候选节点用于去重
128+ 5 * time .Second , // ping 超时
129+ true , // 显示进度条
130+ true , // 静默
128131 )
129132 if err != nil {
130- return fmt .Errorf ("分组查找失败" )
133+ return 0 , fmt .Errorf ("分组查找失败" )
131134 }
132135 // 去重:确保同一运营商内城市不重复
133136 seenCities := make (map [string ]bool )
@@ -147,18 +150,18 @@ func privateSpeedTest(num int, operator string) error {
147150 }
148151 }
149152 if len (bestServers ) == 0 {
150- return fmt .Errorf ("去重后没有可用的服务器" )
153+ return 0 , fmt .Errorf ("去重后没有可用的服务器" )
151154 }
152155 // 执行测速并逐个打印结果(不打印表头)
153156 for i , serverInfo := range bestServers {
154157 result := pst .RunSpeedTest (
155158 serverInfo .Server ,
156- false , // 不禁用下载测试
157- false , // 不禁用上传测试
158- 6 , // 并发线程数
159- 12 * time .Second , // 超时时间
159+ false , // 不禁用下载测试
160+ false , // 不禁用上传测试
161+ 6 , // 并发线程数
162+ 12 * time .Second , // 超时时间
160163 & serverInfo ,
161- false , // 不显示进度条
164+ false , // 不显示进度条
162165 )
163166 if result .Success {
164167 printTableRow (result )
@@ -168,7 +171,31 @@ func privateSpeedTest(num int, operator string) error {
168171 time .Sleep (1 * time .Second )
169172 }
170173 }
171- return nil
174+ // 返回实际测试的节点数量
175+ return len (bestServers ), nil
176+ }
177+
178+ // privateSpeedTestWithFallback 使用私有测速,如果失败则回退到 global 节点
179+ // 主要用于 Other 类型的测速
180+ func privateSpeedTestWithFallback (num int , operator , language string ) {
181+ defer func () {
182+ if r := recover (); r != nil {
183+ fmt .Fprintf (os .Stderr , "[WARN] privateSpeedTestWithFallback panic: %v\n " , r )
184+ }
185+ }()
186+ // 先尝试私有节点测速
187+ testedCount , err := privateSpeedTest (num , operator )
188+ if err != nil || testedCount == 0 {
189+ // 私有节点失败,回退到 global 节点
190+ var url , parseType string
191+ url = model .NetGlobal
192+ parseType = "id"
193+ if runtime .GOOS == "windows" || sp .OfficialAvailableTest () != nil {
194+ sp .CustomSpeedTest (url , parseType , num , language )
195+ } else {
196+ sp .OfficialCustomSpeedTest (url , parseType , num , language )
197+ }
198+ }
172199}
173200
174201func CustomSP (platform , operator string , num int , language string ) {
@@ -177,16 +204,23 @@ func CustomSP(platform, operator string, num int, language string) {
177204 fmt .Fprintf (os .Stderr , "[WARN] CustomSP panic: %v\n " , r )
178205 }
179206 }()
180- // 对于三网测速(cmcc、cu、ct),优先使用 privatespeedtest 进行私有测速
207+ // 对于三网测速(cmcc、cu、ct)和 other ,优先使用 privatespeedtest 进行私有测速
181208 opLower := strings .ToLower (operator )
182- if opLower == "cmcc" || opLower == "cu" || opLower == "ct" {
183- err := privateSpeedTest (num , opLower )
209+ if opLower == "cmcc" || opLower == "cu" || opLower == "ct" || opLower == "other" {
210+ testedCount , err := privateSpeedTest (num , opLower )
184211 if err != nil {
185- fmt .Fprintf (os .Stderr , "[WARN] privatespeedtest failed\n " )
186- // 继续使用原有的兜底方案
187- } else {
188- // 测速成功 ,直接返回
212+ fmt .Fprintf (os .Stderr , "[WARN] privatespeedtest failed: %v \n " , err )
213+ // 全部失败,继续使用原有的公共节点兜底方案
214+ } else if testedCount >= num {
215+ // 私有节点测速成功且数量达标 ,直接返回
189216 return
217+ } else if testedCount > 0 {
218+ // 部分私有节点测速成功,但数量不足,用公共节点补充
219+ fmt .Fprintf (os .Stderr , "[INFO] 私有节点仅测试了 %d 个,补充 %d 个公共节点\n " , testedCount , num - testedCount )
220+ num = num - testedCount // 只测剩余数量的公共节点
221+ // 继续执行下面的公共节点测速逻辑
222+ } else {
223+ // testedCount == 0,继续使用公共节点
190224 }
191225 }
192226
@@ -223,7 +257,8 @@ func CustomSP(platform, operator string, num int, language string) {
223257 url = model .NetJP
224258 } else if strings .ToLower (operator ) == "sg" {
225259 url = model .NetSG
226- } else if strings .ToLower (operator ) == "global" {
260+ } else if strings .ToLower (operator ) == "global" || strings .ToLower (operator ) == "other" {
261+ // other 类型回退到 global 节点
227262 url = model .NetGlobal
228263 }
229264 parseType = "id"
0 commit comments