Skip to content

Commit 31d27f1

Browse files
author
V2RaySSR综合网
committed
feat: 优化CSV文件检测输出格式
- 添加时间戳到域名提取提示 - 简化域名列表显示,移除详细列表 - 提升用户体验,输出更简洁
1 parent a26652f commit 31d27f1

File tree

3 files changed

+40
-53
lines changed

3 files changed

+40
-53
lines changed

internal/cmd/batch.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func (r *RootCmd) executeBatch(domainsStr string) {
1212
// 解析域名列表
1313
domains, invalidDomains, duplicateDomains := parseDomains(domainsStr)
14-
14+
1515
if len(domains) == 0 {
1616
ui.PrintErrorWithDetails(
1717
"错误:没有有效的域名可以检测",
@@ -23,49 +23,49 @@ func (r *RootCmd) executeBatch(domainsStr string) {
2323
// 显示重复域名警告
2424
if len(duplicateDomains) > 0 {
2525
ui.PrintTimestampedMessage("警告:发现 %d 个重复域名,已去重:", len(duplicateDomains))
26-
26+
2727
// 只显示前5个重复域名,避免显示过多
2828
displayCount := 5
2929
if len(duplicateDomains) < displayCount {
3030
displayCount = len(duplicateDomains)
3131
}
32-
32+
3333
for i := 0; i < displayCount; i++ {
3434
fmt.Printf(" - %s\n", duplicateDomains[i])
3535
}
36-
36+
3737
// 如果还有更多重复域名,显示省略提示
3838
if len(duplicateDomains) > displayCount {
3939
fmt.Printf(" ... 还有 %d 个重复域名\n", len(duplicateDomains)-displayCount)
4040
}
41-
41+
4242
fmt.Println()
4343
}
44-
44+
4545
// 显示无效域名警告
4646
if len(invalidDomains) > 0 {
4747
ui.PrintTimestampedMessage("警告:发现 %d 个无效域名,已跳过:", len(invalidDomains))
48-
48+
4949
// 只显示前5个无效域名,避免显示过多
5050
displayCount := 5
5151
if len(invalidDomains) < displayCount {
5252
displayCount = len(invalidDomains)
5353
}
54-
54+
5555
for i := 0; i < displayCount; i++ {
5656
fmt.Printf(" - %s\n", invalidDomains[i])
5757
}
58-
58+
5959
// 如果还有更多无效域名,显示省略提示
6060
if len(invalidDomains) > displayCount {
6161
fmt.Printf(" ... 还有 %d 个无效域名\n", len(invalidDomains)-displayCount)
6262
}
63-
63+
6464
fmt.Println()
6565
}
66-
66+
6767
ui.PrintTimestampedMessage("开始批量检测 %d 个域名...", len(domains))
68-
68+
6969
_, err := r.batchManager.CheckDomains(r.ctx, domains)
7070
if err != nil {
7171
fmt.Printf("批量检测失败: %v\n", err)
@@ -80,17 +80,17 @@ func parseDomains(domainsStr string) ([]string, []string, []string) {
8080
var validDomains []string
8181
var invalidDomains []string
8282
var duplicateDomains []string
83-
domainSet := make(map[string]bool) // 用于去重
83+
domainSet := make(map[string]bool) // 用于去重
8484
duplicateSet := make(map[string]bool) // 用于记录重复域名
85-
85+
8686
// 支持空格分隔的域名列表
8787
fields := strings.Fields(domainsStr)
8888
for _, domain := range fields {
8989
domain = strings.TrimSpace(domain)
9090
if domain == "" {
9191
continue
9292
}
93-
93+
9494
if isValidDomain(domain) {
9595
// 检查是否已存在,避免重复
9696
if !domainSet[domain] {
@@ -119,4 +119,3 @@ func parseDomains(domainsStr string) ([]string, []string, []string) {
119119
}
120120
return validDomains, invalidDomains, duplicateDomains
121121
}
122-

internal/cmd/check.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ func (r *RootCmd) executeCheck(domain string) {
2727
)
2828
return
2929
}
30-
30+
3131
ui.PrintTimestampedMessage("开始检测域名: %s", domain)
32-
32+
3333
result, err := r.engine.CheckDomain(r.ctx, domain)
3434
if err != nil {
3535
fmt.Printf("检测失败: %v\n", err)
@@ -48,36 +48,35 @@ func isValidDomain(domain string) bool {
4848
if len(domain) == 0 || len(domain) > 253 {
4949
return false
5050
}
51-
51+
5252
// 检查是否包含非法字符
5353
if strings.ContainsAny(domain, " \t\n\r") {
5454
return false
5555
}
56-
56+
5757
// 检查是否以点开头或结尾
5858
if strings.HasPrefix(domain, ".") || strings.HasSuffix(domain, ".") {
5959
return false
6060
}
61-
61+
6262
// 检查是否包含连续的点
6363
if strings.Contains(domain, "..") {
6464
return false
6565
}
66-
66+
6767
// 使用正则表达式验证域名格式
6868
domainRegex := regexp.MustCompile(`^[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])?)*$`)
6969
if !domainRegex.MatchString(domain) {
7070
return false
7171
}
72-
72+
7373
// 尝试解析域名(不进行实际DNS查询)
7474
_, err := net.LookupHost(domain)
7575
if err != nil {
7676
// 即使DNS解析失败,只要格式正确就认为是有效的
7777
// 因为可能是网络问题或域名确实不存在
7878
return true
7979
}
80-
80+
8181
return true
8282
}
83-

internal/cmd/csv.go

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"strings"
8+
"time"
89

910
"RealityChecker/internal/ui"
1011
)
@@ -21,7 +22,7 @@ func (r *RootCmd) executeCSV(csvFile string) {
2122
)
2223
return
2324
}
24-
25+
2526
// 读取CSV文件
2627
file, err := os.Open(csvFile)
2728
if err != nil {
@@ -62,21 +63,9 @@ func (r *RootCmd) executeCSV(csvFile string) {
6263
return
6364
}
6465

65-
fmt.Printf("从CSV文件提取到 %d 个域名:\n", len(domains))
66-
// 显示前10个域名作为预览
67-
previewCount := 10
68-
if len(domains) < previewCount {
69-
previewCount = len(domains)
70-
}
71-
for i := 0; i < previewCount; i++ {
72-
fmt.Printf(" %d. %s\n", i+1, domains[i])
73-
}
74-
if len(domains) > previewCount {
75-
fmt.Printf(" ... 还有 %d 个域名\n", len(domains)-previewCount)
76-
}
77-
fmt.Println("")
66+
fmt.Printf("[%s] 从CSV文件提取到 %d 个域名\n", time.Now().Format("15:04:05"), len(domains))
7867
ui.PrintTimestampedMessage("开始批量检测...")
79-
68+
8069
_, err = r.batchManager.CheckDomains(r.ctx, domains)
8170
if err != nil {
8271
fmt.Printf("批量检测失败: %v\n", err)
@@ -88,33 +77,33 @@ func (r *RootCmd) executeCSV(csvFile string) {
8877
func extractDomainsFromCSV(records [][]string) []string {
8978
var domains []string
9079
domainSet := make(map[string]bool) // 用于去重
91-
80+
9281
// 跳过标题行,从第二行开始处理
9382
for i := 1; i < len(records); i++ {
9483
if len(records[i]) < 3 {
9584
continue
9685
}
97-
86+
9887
certDomain := strings.TrimSpace(records[i][2]) // CERT_DOMAIN列
9988
if certDomain == "" {
10089
continue
10190
}
102-
91+
10392
// 清理域名(移除引号等)
10493
certDomain = strings.Trim(certDomain, "\"")
105-
94+
10695
// 排除一些不需要的域名
10796
if shouldExcludeDomain(certDomain) {
10897
continue
10998
}
110-
99+
111100
// 去重
112101
if !domainSet[certDomain] {
113102
domains = append(domains, certDomain)
114103
domainSet[certDomain] = true
115104
}
116105
}
117-
106+
118107
return domains
119108
}
120109

@@ -124,7 +113,7 @@ func shouldExcludeDomain(domain string) bool {
124113
if strings.Contains(domain, "*") {
125114
return true
126115
}
127-
116+
128117
// 2. 排除列表
129118
excludePatterns := []string{
130119
"localhost",
@@ -135,15 +124,15 @@ func shouldExcludeDomain(domain string) bool {
135124
"FortiGate",
136125
"Unspecified",
137126
}
138-
127+
139128
domainLower := strings.ToLower(domain)
140-
129+
141130
for _, pattern := range excludePatterns {
142131
if strings.Contains(domainLower, strings.ToLower(pattern)) {
143132
return true
144133
}
145134
}
146-
135+
147136
// 3. 排除IP地址格式
148137
if strings.Contains(domain, ".") && !strings.Contains(domain, "..") {
149138
parts := strings.Split(domain, ".")
@@ -161,16 +150,16 @@ func shouldExcludeDomain(domain string) bool {
161150
}
162151
}
163152
}
164-
153+
165154
// 4. 排除无效域名(太短或包含特殊字符)
166155
if len(domain) < 3 {
167156
return true
168157
}
169-
158+
170159
// 5. 排除包含多个连续点的域名
171160
if strings.Contains(domain, "..") {
172161
return true
173162
}
174-
163+
175164
return false
176165
}

0 commit comments

Comments
 (0)