PrintRealityTargets 打印符合Reality要求的目标
(filename string)
| 279 | |
| 280 | // PrintRealityTargets 打印符合Reality要求的目标 |
| 281 | func PrintRealityTargets(filename string) error { |
| 282 | file, err := os.Open(filename) |
| 283 | if err != nil { |
| 284 | return fmt.Errorf("打开文件失败: %v", err) |
| 285 | } |
| 286 | defer file.Close() |
| 287 | |
| 288 | reader := csv.NewReader(file) |
| 289 | records, err := reader.ReadAll() |
| 290 | if err != nil { |
| 291 | return fmt.Errorf("读取CSV文件失败: %v", err) |
| 292 | } |
| 293 | |
| 294 | if len(records) < 2 { |
| 295 | printInfo("没有找到扫描结果") |
| 296 | return nil |
| 297 | } |
| 298 | |
| 299 | // 查找符合条件的记录 |
| 300 | var feasibleTargets [][]string |
| 301 | for i, record := range records { |
| 302 | if i == 0 { // 跳过头部 |
| 303 | continue |
| 304 | } |
| 305 | |
| 306 | if len(record) >= 10 && record[9] == "true" { // FEASIBLE字段 |
| 307 | feasibleTargets = append(feasibleTargets, record) |
| 308 | } |
| 309 | } |
| 310 | |
| 311 | if len(feasibleTargets) == 0 { |
| 312 | printInfo("没有找到符合Reality要求的目标") |
| 313 | return nil |
| 314 | } |
| 315 | |
| 316 | // 打印结果 |
| 317 | fmt.Println() |
| 318 | printBox([]string{ |
| 319 | "", |
| 320 | " ═══ Reality目标列表 ═══", |
| 321 | "", |
| 322 | fmt.Sprintf(" 找到 %d 个符合条件的目标:", len(feasibleTargets)), |
| 323 | "", |
| 324 | }) |
| 325 | |
| 326 | fmt.Printf("%-15s %-25s %-10s %-20s %-15s\n", |
| 327 | "IP地址", "证书域名", "地理位置", "证书颁发者", "响应时间(ms)") |
| 328 | fmt.Println(strings.Repeat("-", 85)) |
| 329 | |
| 330 | for _, record := range feasibleTargets { |
| 331 | fmt.Printf("%-15s %-25s %-10s %-20s %-15s\n", |
| 332 | record[0], // IP |
| 333 | truncateString(record[3], 25), // CERT_DOMAIN |
| 334 | record[8], // GEO_CODE |
| 335 | truncateString(record[4], 20), // CERT_ISSUER |
| 336 | record[10], // RESPONSE_TIME_MS |
| 337 | ) |
| 338 | } |
nothing calls this directly
no test coverage detected