From fbddf1cfb5718a71de2c5d7f5bcb6c5b5db75029 Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Sat, 22 Aug 2026 06:26:07 -0400 Subject: [PATCH] =?UTF-8?q?fix(scope):=20=E5=90=AB=E7=82=B9=E5=8F=B7?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=9C=AC=E4=B8=8D=E5=86=8D=E8=A2=AB=E8=AF=AF?= =?UTF-8?q?=E5=88=A4=E4=B8=BA=20ICP=20=E5=A4=87=E6=A1=88=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 单文本框自动分类只要文本里出现 "icp" 或 "备案" 子串就判定为 ICP 规则。 备案号本身不含点号(京ICP备12345678号-1),而 ICP 归属走的是精确相等比较 (companies.go 的 kind='icp' 归属查询),所以掺了域名或版本号的描述性文字 一旦被判成 ICP,就会存成一条永远匹配不上任何资产的死规则,且无任何提示。 分类条件增加"不含点号",半角 . 之外一并覆盖全角 .和中文句号 。——粘贴 中文内容时容易出现这两个,真实备案号里同样不会有。 已有的 "京 ICP备 123号"、"沪网备案 9988" 仍判定为 ICP,不受影响。 Claude-Session: https://claude.ai/code/session_01Q8nhYZfS4H8fsSCBJXxbSy --- db/company_scope.go | 6 +++++- db/company_scope_test.go | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/db/company_scope.go b/db/company_scope.go index 236afa3..8fb8c08 100644 --- a/db/company_scope.go +++ b/db/company_scope.go @@ -152,8 +152,12 @@ func ParseAutoScopeLine(line string) (ParsedScope, error) { if looksLikeDomain { return ParseScopeLine(raw) } + // 备案号本身不含点号(如 京ICP备12345678号-1)。带点的文本多半掺了域名或版本号, + // 按 ICP 存下来只会得到一条永远匹配不上任何资产的死规则 —— ICP 归属走的是精确 + // 相等比较(见 companies.go 的 kind='icp' 归属查询),所以这类文本归为关键词。 lower := strings.ToLower(raw) - if strings.Contains(lower, "icp") || strings.Contains(raw, "备案") { + if !strings.ContainsAny(raw, "..。") && + (strings.Contains(lower, "icp") || strings.Contains(raw, "备案")) { return ParseScopeInput(ScopeInput{Kind: "icp", Value: raw}) } return ParseScopeInput(ScopeInput{Kind: "keyword", Value: raw}) diff --git a/db/company_scope_test.go b/db/company_scope_test.go index f1be837..713938e 100644 --- a/db/company_scope_test.go +++ b/db/company_scope_test.go @@ -60,6 +60,11 @@ func TestParseAutoScopeLine(t *testing.T) { {name: "icp chinese", input: "沪网备案 9988", kind: "icp", normalized: "沪网备案9988"}, {name: "icp domain", input: "icp.example.com", kind: "domain", normalized: "icp.example.com"}, {name: "icp url query", input: "https://example.com/path?icp=1", kind: "domain", normalized: "example.com"}, + // 备案号不含点号:掺了域名/版本号的描述性文字归关键词,否则会存成一条 + // 永远匹配不上的死 ICP 规则。 + {name: "icp with domain text", input: "备案 www.example.com", kind: "keyword", normalized: "备案 www.example.com"}, + {name: "icp with version text", input: "某公司 ICP v1.0", kind: "keyword", normalized: "某公司 icp v1.0"}, + {name: "icp fullwidth dot", input: "备案 例.com", kind: "keyword", normalized: "备案 例.com"}, {name: "keyword", input: " ACME Security ", kind: "keyword", normalized: "acme security"}, {name: "colon keyword", input: "ACME: Cloud: Security", kind: "keyword", normalized: "acme: cloud: security"}, {name: "empty", input: " ", wantErr: true},