diff --git a/README.md b/README.md index df06f6d..ce1244b 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,8 @@ https://raw.githubusercontent.com/E-R-Butch/ACL4SSR-Redux/master/Config/ACL4SSR_ `ProxyGFWlist.list`、`ChinaIp.list`、`ChinaIpV6.list`、`BanEasy*.list` 由每日同步生成,其中的条目被更早的规则覆盖属于预期(自动同步会把它们写回来),不要手工删除;`scripts/audit_rules.py` 的基线负责把这些已知条目与新增冲突区分开。 +2026-11-04 复核 [GFWList 新增的 `bilibili.tv`](https://github.com/gfwlist/gfwlist/commit/e1ff22048acbf77bd7b21906355c47e44d3ecda5):保留其生成条目,同时保留现有 `ChinaMedia.list` 的优先级,首个命中仍为「🌏 国内媒体」(默认 DIRECT,可手动选择代理)。此处只把这一条已复核的重叠加入基线,并用分流回归测试固定原有行为,不代表验证了国际站的地区可用性;其它新增冲突仍需单独复核。 + ## 📦 Provider 生成与再平衡 `scripts/split_providers.py` 把广告与隐私这面单独抽出来做全局去重和多文件再平衡,产物由客户端以 `rule-provider` + `RULE-SET` 引用: diff --git a/Rules/Core/ProxyGFWlist.list b/Rules/Core/ProxyGFWlist.list index f300fdd..a215c68 100644 --- a/Rules/Core/ProxyGFWlist.list +++ b/Rules/Core/ProxyGFWlist.list @@ -805,6 +805,7 @@ DOMAIN-SUFFIX,bigjapanesesex.com DOMAIN-SUFFIX,bignews.org DOMAIN-SUFFIX,bigone.com DOMAIN-SUFFIX,bild.de +DOMAIN-SUFFIX,bilibili.tv DOMAIN-SUFFIX,bilinovel.com DOMAIN-SUFFIX,binance.com DOMAIN-SUFFIX,binance.org diff --git a/audit-baseline.json b/audit-baseline.json index 09003d4..438dacf 100644 --- a/audit-baseline.json +++ b/audit-baseline.json @@ -1,9 +1,10 @@ { "note": "Reviewed rule conflicts that the ini order intentionally accepts. See README '规则优先级与已知取舍'. Refresh with: python3 scripts/audit_rules.py --update-baseline", - "count": 72, + "count": 73, "accepted": [ "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,admob.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,admob.com|🛑 广告拦截", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,ads-twitter.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,ads-twitter.com|🛑 广告拦截", + "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,bilibili.tv|Rules/Ruleset/Active/ChinaMedia.list|DOMAIN-SUFFIX,bilibili.tv|🌏 国内媒体", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,crashlytics.com|Rules/Ruleset/Active/AppleReject.list|DOMAIN-SUFFIX,crashlytics.com|🔒 隐私保护", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,googlecommerce.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,googlecommerce.com|🛑 广告拦截", "duplicate|Rules/Core/ProxyGFWlist.list|DOMAIN-SUFFIX,incloak.com|Rules/Outputs/MergedADBan.list|DOMAIN-SUFFIX,incloak.com|🛑 广告拦截", diff --git a/tests/test_routing_semantics.py b/tests/test_routing_semantics.py index 908f7c0..00e1a17 100644 --- a/tests/test_routing_semantics.py +++ b/tests/test_routing_semantics.py @@ -4,7 +4,7 @@ import tempfile import unittest -from scripts import validate_rules +from scripts import audit_rules, validate_rules ROOT = pathlib.Path(__file__).resolve().parents[1] @@ -33,6 +33,24 @@ def check_mutation(self, text): path.write_text(text, encoding="utf-8") return validate_rules.validate_ini(path) + def test_bilibili_keeps_explicit_media_policy_before_gfwlist(self): + # An upstream GFWList addition must not silently change the existing + # service policy. Its exact overlap is reviewed in audit-baseline.json. + ordered = audit_rules.collect_ranked_rules(self.text.splitlines()) + for host in ("bilibili.tv", "www.bilibili.tv", "bilibili.com", "www.bilibili.com"): + with self.subTest(host=host): + winner = next(rule for rule in ordered if ( + rule["type"] == "DOMAIN" and host == rule["value"] or + rule["type"] == "DOMAIN-SUFFIX" and + (host == rule["value"] or host.endswith("." + rule["value"])) or + rule["type"] == "DOMAIN-KEYWORD" and rule["value"] in host + )) + self.assertEqual(winner["target"], "🌏 国内媒体") + self.assertEqual(audit_rules.source_name(winner), "Rules/Ruleset/Active/ChinaMedia.list") + self.assertEqual( + validate_rules.group_selectors(self.definitions["🌏 国内媒体"])[0], "[]DIRECT" + ) + def test_original_claude_indirect_direct_route_is_rejected(self): text = self.text.replace("🎭 Claude`select`[]🎭 Claude 自动", "🎭 Claude`select`[]🚀 节点选择") self.assertTrue(any("reaches DIRECT" in error for error in self.check_mutation(text)))