数据截至 (上游 commit 2689884a6257)
隐私脱敏
这一章讲什么: 一旦你开始录屏,你就在录别人的病历号、银行卡号和聊天记录。这一章讲 legacy 里那套脱敏子系统:抽象怎么分层、一个很容易忽略的「传染」规则、以及为什么它选择先复制整份录制。
1. 它要解决的小问题
一次桌面录制会同时产生四种载体的敏感信息:
| 载体 | 例子 | 怎么擦 |
|---|---|---|
| 文本 | 键入的密码、病历号 | 命名实体识别后替换 |
| 图像 | 截图上显示的身份证 | 图像 OCR + 涂黑 |
| 视频 | 整段录屏 | 逐帧处理 |
| 无 障碍树 | 控件的 AXValue 里躺着完整地址 | 递归遍历字典 |
最后一行最容易被忘掉:无障碍树里的文本量常常比截图上看到的还多。
2. 抽象分三层
Modality ← 能力标签:TEXT / PIL_IMAGE / PDF / MP4
│
ScrubbingProvider (pydantic) ← 契约:scrub_text / scrub_image / scrub_mp4
│ capabilities: List[str]
│
├── TextScrubbingMixin ← 复用逻辑:递归 dict/list 打码
│
└── 具体提供方
PresidioScrubbingProvider (本地 spaCy + Presidio)
PrivateAIScrubbingProvider (外部 API)
ComprehendScrubbingProvider (AWS,已被从选项里注释掉)
- 能力标签
Modality是一个纯常量类,四个成员:TEXT/PIL_IMAGE/PDF/MP4(legacy/openadapt/privacy/base.py:11-17)。 - 契约在
legacy/openadapt/privacy/base.py:20(ScrubbingProvider),未实现的方法一律raise NotImplementedError。 - 基类上的
capabilities类型是List[str](privacy/base.py:24),收窄成List[Modality]的是各个子类——例如 Presidio 声明支持TEXT和PIL_IMAGE(privacy/providers/presidio.py:32)。 - 工厂在
privacy/providers/__init__.py:7(ScrubProvider),get_scrubber按名字惰性 import 具体实现(:30-51)——因为 Presidio 会拖进 spaCy 和 transformers。
AWS Comprehend 被从可选项里注释掉了,理由写在旁边:「Comprehend 不支持 scrub_image 方法」(privacy/providers/__init__.py:19-21)。能力声明和实际可选项不一致时,选择了直接摘掉而不是在运行时报错。