这个小工具的目标很简单:在本地检查 JSON 健康导出文件,如果包含接收者未请求的字段,就拒绝通过(fail closed)。它不解析医疗数据,不上传任何内容,是一个介于「导出完成」和「文件共享」之间的窄范围预检。触发背景是 OpenAI 于 2026 年 7 月 23 日宣布的 Health in ChatGPT 产品推送,面向美国 18 岁以上已登录用户(网页与 iOS),支持连接病历和 Apple Health,可查看化验、药物、活动、睡眠等信息。OpenAI 称连接数据与相关对话不会用于基础模型训练或广告定向。
该验证器使用白名单(allowlist)而非黑名单(denylist)来规避意外泄露——黑名单只检查已知敏感键,而白名单要求每披露字段都经过审批,能捕获源设备、原始记录 ID、时区等隐藏元数据。下面是一个示例实现(Python 3 脚本,作为
validate_export.py 保存):```python
#!/usr/bin/env python3
import argparse, json, sys
from pathlib import Path
ALLOWED = {"subject", "type", "day", "value"}
FORBIDDEN = {"name", "email", "address", "phone", "notes"}
def check(path: Path):
errors = []
for number, raw in enumerate(path.read_text().splitlines(), 1):
try:
row = json.loads(raw)
except json.JSONDecodeError as exc:
errors.append(f"line {number}: invalid JSON ({exc.msg})")
continue
keys = set(row) if isinstance(row, dict) else set()
extra = keys - ALLOWED
found = keys & FORBIDDEN
if not isinstance(row, dict):
errors.append(f"line {number}: object required")
if extra:
errors.append(f"line {number}: unexpected={sorted(extra)}")
if found:
errors.append(f"line {number}: forbidden={sorted(found)}")
return errors
p = argparse.ArgumentParser()
p.add_argument("file", type=Path)
args = p.parse_args()
problems = check(args.file)
print("REJECT" if problems else "ACCEPT")
for problem in problems:
print(problem, file=sys.stderr)
raise SystemExit(bool(problems))
```
使用方法:
python3 validate_export.py export.ndjson。如果文件中出现 "notes":"call after lunch" 这样的字段,会同时报出 unexpected 和 forbidden 两种错误并退出。分享前建议增加三个低成本检查:随机浏览十行并统计总行数;通过带外方式确认目的地和删除日期;从允许字段生成新文件,而非原地修改原文件。该工具仅校验顶级键名,无法检测允许字符串内隐藏的标识值、链接攻击、畸形日期、重复行或重识别风险。OpenAI 描述的健康体验为「支持」,不替代医疗诊断或治疗;本地 schema 校验的作用更小:只能减少意外泄露,不能判断数据的准确性、必要性或临床意义。
#开发者 #工具 #CLI #Python #隐私 #OpenAI #ChatGPT #Health #数据校验
@DevToolboxHub