在网页创建角色前,先用 JSON 校验名称/开场白/人设长度,并拦截「冒充真人」「提供专业建议」等危险开关。软长度限制需对照当前创作页再调。
先看清成品
- sample_ok → OK;过长名称/空开场/专业建议样例 → INVALID。
- 3 项 pytest 通过。
合规提醒:Character.AI 角色均为虚构内容,不代表真实人物,不能当作医疗/法律/金融等专业建议。平台有年龄限制与未成年人安全措施,请遵守官方规定。长时间聊天注意休息。官方 Help Center 表明目前没有面向开发者的公开 API;勿使用非官方逆向客户端(可能违反条款且不稳定)。本文不编造价格与会员权益。
运行说明:无 Character.AI API(官方亦无公开开发者 API)。三篇均为本地助手:角色定义校验、会话时长账本、导出/提示词虚构免责扫描。未登录 character.ai。2026-10-23(Asia/Shanghai)pytest 通过。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
character_def.py |
人设预检 |
| 样例 JSON | ok/bad |
test_106a.py |
测试 |
需要准备哪些环境?
| 项目 | 说明 |
|---|---|
| Python | 3.10+ |
关键事实
| 事实 | 来源 |
|---|---|
| 官方称目前没有公开 API;有需求可邮件说明用例 | Help Center 历史说明 / 定位 |
| 角色内容为 AI 虚构,非真人发言 | 产品重要说明 |
| 本校验只服务创作前自检,不代替平台审核 | 重要 |
文件结构
106-character-ai-A-src/
├── character_def.py
├── sample_ok.json
├── sample_bad.json
└── test_106a.py
第 1 步:预检脚本
#!/usr/bin/env python3
"""Validate a Character.AI-style character definition JSON before pasting into the creator UI.
Character.AI has no public developer API (Help Center). This is a local checklist only.
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
NAME_MAX = 20
GREETING_MAX = 500
PERSONALITY_MAX = 3500
# Soft tutorial limits aligned with common creator UI constraints; verify on character.ai.
def validate(cfg: dict) -> list[str]:
errs = []
name = (cfg.get("name") or "").strip()
if not name:
errs.append("name 必填")
elif len(name) > NAME_MAX:
errs.append(f"name 过长 {len(name)}>{NAME_MAX}")
greeting = cfg.get("greeting") or cfg.get("first_message") or ""
if not str(greeting).strip():
errs.append("greeting / first_message 必填")
elif len(greeting) > GREETING_MAX:
errs.append(f"greeting 过长 {len(greeting)}>{GREETING_MAX}")
personality = cfg.get("personality") or cfg.get("definition") or ""
if not str(personality).strip():
errs.append("personality / definition 必填")
elif len(personality) > PERSONALITY_MAX:
errs.append(f"personality 过长 {len(personality)}>{PERSONALITY_MAX}")
if cfg.get("claims_real_person") is True and not cfg.get("parody_disclaimer"):
errs.append("涉及真实人物形象时须加 parody_disclaimer,且遵守平台规则(虚构内容)")
if cfg.get("offers_professional_advice") is True:
errs.append("不得把角色定位成医疗/法律/金融等专业建议来源")
age = cfg.get("min_user_age")
if age is not None:
try:
if int(age) < 13:
errs.append("min_user_age 不得低于平台年龄要求(以官网为准,常见 ≥13)")
except (TypeError, ValueError):
errs.append("min_user_age 须为整数")
return errs
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("config_json")
args = ap.parse_args(argv)
cfg = json.loads(Path(args.config_json).read_text(encoding="utf-8"))
errs = validate(cfg)
if errs:
print("INVALID")
for e in errs:
print("-", e)
return 1
print("OK")
return 0
if __name__ == "__main__":
raise SystemExit(main())
第 2 步:测试
from pathlib import Path
import json, subprocess, sys
from character_def import validate
HERE = Path(__file__).resolve().parent
def test_ok():
assert validate(json.loads((HERE/"sample_ok.json").read_text())) == []
def test_bad():
assert len(validate(json.loads((HERE/"sample_bad.json").read_text()))) >= 3
def test_cli():
r = subprocess.run([sys.executable, str(HERE/"character_def.py"), str(HERE/"sample_ok.json")], capture_output=True, text=True)
assert r.returncode == 0 and "OK" in r.stdout
第 3 步:运行
$ python character_def.py sample_ok.json
OK
$ python character_def.py sample_bad.json
INVALID
- name 过长 37>20
- greeting / first_message 必填
- 涉及真实人物形象时须加 parody_disclaimer,且遵守平台规则(虚构内容)
- 不得把角色定位成医疗/法律/金融等专业建议来源
- min_user_age 不得低于平台年龄要求(以官网为准,常见 ≥13)
$ pytest -q
... [100%]
3 passed in 0.03s
怎么检查结果?
- OK 样例退出码 0。
- bad 至少指出 name/greeting/专业建议之一。
调试示例
想做「某明星本人」角色。 校验会要求 parody_disclaimer,且平台规则仍可能禁止。虚构娱乐可以,冒充与骚扰不行。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 长度和官网不一致 | UI 会变 | 改 NAME_MAX 等常量 |
| 要不要 API | 官方无公开 API | 只用网页/App |
| 未成年人 | 遵守年龄与安全设置 | 不要绕过 |
模板规则
- 不提供专业建议人设。
- 不冒充真人。
- 遵守年龄与社区规则。
项目资源
| 用途 | 地址 |
|---|---|
| About(官方) | https://character.ai/about |
| Blog(官方) | https://blog.character.ai/ |
人设过关,再点创建——别把聊天机器人写成「真医生」。