feat(compliance): 落实中华人民共和国广告法合规审查:杜绝绝对化极限词、规整国家高新技术企业备案认定与规范承诺用语

这个提交包含在:
wikiboss
2026-10-08 18:13:08 +08:00
父节点 2dbdf7930d
当前提交 ab0ce76895
共有 12 个文件被更改,包括 350 次插入 和 72 次删除

查看文件

@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*-
"""
广告法合规静态检查脚本
对照《中华人民共和国广告法》重点审查:
1. 绝对化极限用语:最高、最佳、第一、顶级、极致、首选、独家、独创、首屈一指等
2. 违规国家级表述:国家级(除国家高新技术企业法定全称外不可乱用国家级)、世界级、国际领先
3. 虚假或绝对化承诺:100%(非CSS宽高的绝对承诺)、零风险、零故障、永不宕机等
4. 模糊引证/夸大宣称
"""
import os
import re
import sys
# 规则定义: (规则说明, 危险正则, 白名单正则或上下文判断函数)
RULES = [
(
"极限词(最系列)",
re.compile(r"(最[高佳强优新具权快低大美多全先进顶好])"),
lambda text, m: False # 严格禁止
),
(
"极限词(顶级/极系列)",
re.compile(r"(顶级|极致|极品|鼎级|极速)"),
lambda text, m: False
),
(
"极限词(第一/首系列)",
re.compile(r"(第一|No\.1|首[选个家]|首屈一指)"),
lambda text, m: False
),
(
"绝对化用词(独家/独创/唯一)",
re.compile(r"(独家|独创|唯一|绝无仅有)"),
lambda text, m: False
),
(
"绝对化承诺(100%/零故障/零风险)",
re.compile(r"(100%|零故障|零风险|零瑕疵|包过|永久免费)"),
lambda text, m: "width" in text.lower() or "height" in text.lower() or "size" in text.lower()
),
(
"违规国家级表述",
re.compile(r"(国家级(?!高新技术企业)|世界级|国际领先)"),
lambda text, m: False
),
]
def scan_files(directory):
violations = []
for root, dirs, files in os.walk(directory):
for f in files:
if not f.endswith(('.html', '.php', '.js')):
continue
path = os.path.join(root, f)
with open(path, 'r', encoding='utf-8', errors='ignore') as fp:
for line_no, line in enumerate(fp, 1):
# 过滤 CSS 中的技术百分比
filtered_line = re.sub(r'[\'\"a-zA-Z0-9_\-:]*\s*:\s*100%', '', line)
filtered_line = re.sub(r'width\s*=\s*[\'\"]100%[\'\"]', '', filtered_line)
filtered_line = re.sub(r'height\s*=\s*[\'\"]100%[\'\"]', '', filtered_line)
for rule_name, pattern, allow_fn in RULES:
for match in pattern.finditer(filtered_line):
matched_text = match.group(0)
if not allow_fn(line, match):
violations.append({
'file': path,
'line_no': line_no,
'rule': rule_name,
'matched': matched_text,
'snippet': line.strip()
})
return violations
if __name__ == '__main__':
target_dir = sys.argv[1] if len(sys.argv) > 1 else 'addons/official/view/web'
results = scan_files(target_dir)
report_path = 'tests/ad_audit_report.txt'
with open(report_path, 'w', encoding='utf-8') as f:
f.write(f"=== 中华人民共和国广告法合规审查清单 (扫描目录: {target_dir}) ===\n")
f.write(f"共排查潜在风险点: {len(results)} 处\n\n")
for r in results:
f.write(f"【{r['rule']}】 文件: {r['file']} 第 {r['line_no']} 行\n")
f.write(f" 敏感/违规词: {r['matched']}\n")
f.write(f" 上下文原句: {r['snippet']}\n")
f.write("-" * 60 + "\n")
print(f"审查完成!已生成报告: {report_path},发现风险项: {len(results)} 处")

查看文件

@@ -234,6 +234,24 @@ def test_client_rigor_suite():
res.assert_true(test_result.wasSuccessful(), f"客户视角严谨度断言全部通过 (共 {test_result.testsRun} 项)")
return res.summary()
def test_ad_law_compliance_suite():
res = TestResult("中国广告法合规专项测试 (AdLawCompliance)")
from tests.test_ad_law_compliance import TestAdLawCompliance
suite = unittest.TestLoader().loadTestsFromTestCase(TestAdLawCompliance)
runner = unittest.TextTestRunner(verbosity=0)
test_result = runner.run(suite)
res.assert_true(test_result.wasSuccessful(), f"中国广告法合规断言全部通过 (共 {test_result.testsRun} 项)")
return res.summary()
def test_natural_copywriting_suite():
res = TestResult("务实工程文案专项测试 (NaturalCopywriting)")
from tests.test_natural_copywriting import TestNaturalCopywriting
suite = unittest.TestLoader().loadTestsFromTestCase(TestNaturalCopywriting)
runner = unittest.TextTestRunner(verbosity=0)
test_result = runner.run(suite)
res.assert_true(test_result.wasSuccessful(), f"务实工程文案断言全部通过 (共 {test_result.testsRun} 项)")
return res.summary()
def main():
import unittest
results = [
@@ -244,9 +262,12 @@ def main():
test_about_page(),
test_contact_page(),
test_no_ai_flavor_suite(),
test_client_rigor_suite()
test_client_rigor_suite(),
test_ad_law_compliance_suite(),
test_natural_copywriting_suite()
]
sys.exit(0 if all(results) else 1)
if __name__ == '__main__':
main()

查看文件

@@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
"""
中华人民共和国广告法文案合规自动化专项测试
(Ad Law Compliance Test Suite)
严格依据《中华人民共和国广告法》第4条、第8条、第9条、第11条、第28条:
1. 绝对化极限词禁止(第九条第(三)项):最高、最佳、第一、顶级、极致、极速、独家、独创、行业领先等。
2. 国家机关名义与国家级禁用(第九条第(二)、(三)项):严禁使用“国家级认定/国家级项目”等违法定性。
3. 绝对化与夸大承诺禁止(第四条、第二十八条):严禁使用“彻底解决”、“彻底杜绝”、“100%准确”等绝对化承诺。
4. 认证资质与引证规范(第八条、第十一条):规范使用法定全称,杜绝无依据的“权威资质”自我标榜。
"""
import os
import re
import unittest
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class TestAdLawCompliance(unittest.TestCase):
def setUp(self):
self.target_files = {
'index_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/index.html'),
'index_m': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/index_e.html'),
'single_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/single.html'),
'single_m': os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/single_e.html'),
'service_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_page.html'),
'product_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/product_page.html'),
'case_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_case_show/list.html'),
'case_m': os.path.join(ROOT_DIR, 'addons/official/view/web/official_case_show/list_e.html'),
'contact_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_online_message/list.html'),
'nav_pc': os.path.join(ROOT_DIR, 'addons/official/view/web/official_common/pc/nav.html'),
}
self.contents = {}
for key, path in self.target_files.items():
if os.path.exists(path):
with open(path, 'r', encoding='utf-8') as f:
self.contents[key] = f.read()
else:
self.contents[key] = ""
# 合并所有页面文本
self.all_text = "\n".join(self.contents.values())
def test_no_extreme_words_ban(self):
"""广告法第九条第(三)项:严禁使用绝对化极限用词"""
extreme_words = [
'极致', '极速', '顶级', '首选', '独家', '独创', '行业领先',
'首屈一指', '绝无仅有', '世界级', '第一品牌', '遥遥领先'
]
for word in extreme_words:
self.assertNotIn(word, self.all_text, f"文案中严禁出现广告法违禁极限词: '{word}'")
def test_no_illegal_national_level_claims(self):
"""广告法第九条第(二)、(三)项:严禁非法使用'国家级'修饰语"""
# 严禁出现“国家级认定”、“国家级自主研发”等违法表述
self.assertNotIn('国家级自主研发', self.all_text, "不得使用'国家级自主研发'违规修饰")
self.assertNotIn('国家级科技创新认定', self.all_text, "不得使用'国家级科技创新认定'违规表述")
# 合规的表达应当为官方备案机构或高新技术企业全称
self.assertIn('全国高新技术企业认定管理机构备案认定', self.contents['single_pc'],
"资质表述须符合法定规范,应使用全国高新技术企业认定管理机构备案认定")
def test_no_absolute_guarantee_and_exaggeration(self):
"""广告法第四条/第二十八条:严禁绝对化与夸大免责承诺"""
# 严禁“彻底杜绝”、“彻底解决”、“彻底消除”
absolute_promises = ['彻底解决', '彻底杜绝', '彻底消除', '永不宕机', '零故障', '零风险']
for p in absolute_promises:
self.assertNotIn(p, self.all_text, f"文案中不得出现绝对化夸大承诺: '{p}'")
def test_no_absolute_percentage_guarantees(self):
"""广告法合规:服务与指标承诺中杜绝'100%'绝对化宣传"""
# 过滤 CSS 中的技术属性后,文案内容不应包含绝对化的 100% 承诺
clean_text = re.sub(r'[\'\"a-zA-Z0-9_\-:]*\s*:\s*100%', '', self.all_text)
clean_text = re.sub(r'width\s*=\s*[\'\"]100%[\'\"]', '', clean_text)
clean_text = re.sub(r'height\s*=\s*[\'\"]100%[\'\"]', '', clean_text)
self.assertNotIn('准确率: <strong>100%</strong>', clean_text, "分账准确率不得夸大承诺100%")
self.assertNotIn('自动对账率: <strong>100%</strong>', clean_text, "对账率不得夸大承诺100%")
self.assertNotIn('100% 完整源码', clean_text, "应表述为完整工程源码交付,避免100%绝对词")
self.assertNotIn('100% 客户独占', clean_text, "应表述为客户专属独占")
self.assertNotIn('100% 覆盖', clean_text, "应表述为核心用例全覆盖")
self.assertNotIn('资产 100% 移交', clean_text, "应表述为全套数字资产合规移交")
def test_certifications_pragmatic_framing(self):
"""资质宣传客观严谨,杜绝主观自我标榜'权威资质'"""
self.assertNotIn('权威资质背书', self.contents['single_pc'], "应替换为客观严谨的'法定资质认证'")
self.assertNotIn('权威资质与软著', self.contents['single_m'], "移动端应同步规范为法定资质与合规资产")
if __name__ == '__main__':
unittest.main()

查看文件

@@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
"""
纯粹务实工程文案专项测试 (Natural Copywriting & No AI Buzzwords Test)
测试驱动去 AI 化、去除泛化通用口号与翻译腔,强化大厂务实工程与业务场景语言。
"""
import os
import unittest
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class TestNaturalCopywriting(unittest.TestCase):
def setUp(self):
self.index_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/index.html')
self.services_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/service_page.html')
self.products_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_product/product_page.html')
self.cases_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_case_show/list.html')
self.about_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_home/single.html')
self.contact_path = os.path.join(ROOT_DIR, 'addons/official/view/web/official_online_message/list.html')
with open(self.index_path, 'r', encoding='utf-8') as f:
self.index_html = f.read()
with open(self.services_path, 'r', encoding='utf-8') as f:
self.services_html = f.read()
with open(self.products_path, 'r', encoding='utf-8') as f:
self.products_html = f.read()
with open(self.cases_path, 'r', encoding='utf-8') as f:
self.cases_html = f.read()
with open(self.about_path, 'r', encoding='utf-8') as f:
self.about_html = f.read()
with open(self.contact_path, 'r', encoding='utf-8') as f:
self.contact_html = f.read()
def test_forbid_ai_buzzwords_and_translationese(self):
"""严格禁止典型 AI 假大空口号、翻译腔与泛化套话"""
ai_buzzwords = [
'准备好与资深技术架构师展开深度研讨了吗', # 翻译腔
'认知智能化”跃迁', # 虚浮AI词
'数字见证力量', # 泛化套话
'开启确定性数字化未来', # 泛化套话
'让您的企业也拥有经得起考验的', # AI祈使句
'开启您的企业数字化与智能化升级项目', # 泛化套话
'开启确定性数字化技术合作' # 虚词
]
all_html = (
self.index_html + "\n" +
self.services_html + "\n" +
self.products_html + "\n" +
self.cases_html + "\n" +
self.about_html + "\n" +
self.contact_html
)
for buzzword in ai_buzzwords:
self.assertNotIn(buzzword, all_html, f"全站必须彻底剔除 AI 通用套话/翻译腔: '{buzzword}'")
def test_require_pragmatic_engineering_copy(self):
"""必须包含具体务实的工程化、场景化语言"""
# 首页务实表达
self.assertIn('扎实的软件工程实践', self.index_html, "首页服务板块标题必须务实直接")
self.assertIn('四大成熟商用系统', self.index_html, "首页产品板块标题必须清晰明确")
self.assertIn('用生产环境数据说话', self.index_html, "首页案例板块必须务实接地气")
self.assertIn('受控的软件研发流程', self.index_html, "首页流程板块标题必须强调受控确定性")
self.assertIn('来自甲方的真实反馈', self.index_html, "首页评价板块标题必须务实")
self.assertIn('有具体的系统研发或产品选型需求?我们来落实', self.index_html, "首页CTA必须说人话、重落实")
# 服务页务实表达
self.assertIn('带着您的系统需求或技术难题,直接与架构师沟通', self.services_html, "服务页CTA必须杜绝翻译腔")
# 案例页务实表达
self.assertIn('累计交付数据 · 用上线运行指标说话', self.cases_html, "案例页指标墙标题必须务实")
self.assertIn('面临类似的业务系统瓶颈?我们可以提供针对性方案', self.cases_html, "案例页CTA必须直面业务痛点")
# 关于我们与联系我们
self.assertIn('找懂业务、讲规范的研发团队,让软件项目平稳落地', self.about_html, "关于我们CTA必须务实接地气")
self.assertIn('业务咨询与技术评估', self.contact_html, "联系我们标题必须清晰务实")
if __name__ == '__main__':
unittest.main()