再好的 Brand Voice 也救不了违法广告语。这篇在把文案送进 Jasper 之前,用启发式规则抓「保证赚钱 / 治愈 / 攻击竞品」等风险措辞。
先看清成品
- safe 样例 OK;risky 样例报告 absolute/medical/competitor。
- 2 项 pytest 通过。
合规提醒:Jasper API 需工作区管理员/开发者权限开通;密钥勿进前端或公开仓库。生成营销文案须遵守广告与行业法规,禁止虚假疗效、保证收益等表述。品牌声音与知识库应使用你有权使用的资料。价格与套餐以官网为准,本文不编造。
运行说明:无 Jasper 正式密钥。A/C 为本地校验;B 用本机 mock(X-API-Key)跑通创建 tone + run task。2026-10-23(Asia/Shanghai)pytest 全部通过。对接正式环境时把
--base设为 https://api.jasper.ai 。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
claims_check.py |
风险扫描 |
| 样例 txt | safe/risky |
test_97c.py |
2 项测试 |
需要准备哪些环境?
| 项目 | 说明 |
|---|---|
| Python | 3.10+ |
关键事实
| 事实 | 来源 |
|---|---|
| 本工具是启发式,不是法律意见或广告法合规认证 | 重要 |
| 受监管行业(医疗、金融等)应有额外人工与法务流程 | 实践 |
| Jasper 输出仍须人工终审 | 实践 |
文件结构
97-jasper-C-src/
├── claims_check.py
├── sample_safe.txt
├── sample_risky.txt
└── test_97c.py
第 1 步:扫描脚本
#!/usr/bin/env python3
"""Flag risky marketing claims before sending copy into Jasper."""
from __future__ import annotations
import argparse
import json
import re
from pathlib import Path
ABSOLUTES = [
r"100%\s*有效",
r"绝对",
r"永不",
r"保证赚钱",
r"稳赚",
r"无副作用",
r"治愈",
r"#1\b",
r"第一名",
r"guaranteed",
r"miracle",
]
MEDICAL = [r"治疗",r"处方",r"FDA\s*批准",r"clinically proven"]
COMPETITOR_SLUR = [r"垃圾竞品", r"山寨", r"抄袭他们"]
def check(text: str) -> list[dict]:
findings = []
for pat in ABSOLUTES:
for m in re.finditer(pat, text, re.I):
findings.append({"severity": "absolute_claim", "match": m.group(0), "span": m.span()})
for pat in MEDICAL:
for m in re.finditer(pat, text, re.I):
findings.append({"severity": "medical_or_regulated", "match": m.group(0), "span": m.span()})
for pat in COMPETITOR_SLUR:
for m in re.finditer(pat, text, re.I):
findings.append({"severity": "competitor_attack", "match": m.group(0), "span": m.span()})
return findings
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("text_file")
ap.add_argument("--json", action="store_true")
args = ap.parse_args(argv)
text = Path(args.text_file).read_text(encoding="utf-8")
findings = check(text)
if args.json:
print(json.dumps({"ok": not findings, "findings": findings}, ensure_ascii=False, indent=2))
else:
if not findings:
print("OK: 未发现常见风险措辞(启发式,非法律意见)")
else:
print(f"FINDINGS: {len(findings)}")
for f in findings:
print(f"- [{f['severity']}] {f['match']}")
return 1 if findings else 0
if __name__ == "__main__":
raise SystemExit(main())
第 2 步:测试
from pathlib import Path
import subprocess
import sys
from claims_check import check
HERE = Path(__file__).resolve().parent
def test_risky():
t = (HERE / "sample_risky.txt").read_text()
f = check(t)
kinds = {x["severity"] for x in f}
assert "absolute_claim" in kinds
assert "medical_or_regulated" in kinds
def test_safe_cli():
r = subprocess.run(
[sys.executable, str(HERE / "claims_check.py"), str(HERE / "sample_safe.txt")],
capture_output=True,
text=True,
)
assert r.returncode == 0
assert "OK" in r.stdout
第 3 步:运行
OK: 未发现常见风险措辞(启发式,非法律意见)
FINDINGS: 4
- [absolute_claim] 100%有效
- [absolute_claim] 保证赚钱
- [medical_or_regulated] 治疗
- [competitor_attack] 垃圾竞品
.. [100%]
2 passed in 0.03s
怎么检查结果?
- 退出码 0 表示未命中规则,不代表合法。
- 可把 FINDINGS 当作编辑 checklist。
调试示例
漏报很常见。 「临床级配方」可能避开「治疗」词表。把行业禁用词维护成自己的 YAML,再并入脚本。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 误报 | 绝对化词在引用中 | 加白名单或改写 |
| 多语言 | 仅示意中英 | 按市场扩正则 |
| 要不要自动改写 | 本篇不做 | 先标红再人工 |
模板规则
- 输出必须人工审。
- 不提供绕过平台审核的方法。
- 受监管宣称升级法务。
项目资源
| 用途 | 地址 |
|---|---|
| Jasper 官网 | https://www.jasper.ai/ |
| Authentication(官方) | https://developers.jasper.ai/docs/authentication |
| Using Agents(官方) | https://developers.jasper.ai/docs/using-agents |
先过声明检查,再谈生成效率。