# -*- 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)} 处")