个人脱敏
概述
本技能用于在用户本机对常见办公文档(PDF / Word / Excel)做个人敏感信息脱敏:自动找出姓名、身份证号、手机号、固定电话、邮箱、银行卡号等,统一替换为掩码(默认 xxxx),并保存为在原文件名末尾加 -脱敏 的新文件。
隐私铁律(必须遵守):全部处理在本地用 Python 脚本完成。不要读取文件正文到对话/模型上下文中,不要调用任何云端大模型、云 API、联网搜索或上传工具,不要通过企业微信/邮件/网盘等把源文件或产物发出去。
何时使用
- 用户说"帮我把这份 PDF/Word/Excel 里的姓名和身份证打码""脱敏一下""匿名化""隐藏个人信息"。
- 用户要分享、提交、归档一份含个人隐私的文档,需要先去掉敏感字段。
- 用户要批量处理一个目录下的多份文档。
支持格式:.pdf、.docx、.xlsx、.xls。输入也可以是目录(批量处理目录下所有支持的文档)。
工作流程
第 1 步:确认输入与范围
- 询问或确认要处理的单个文件或目录路径。
- 若需要更高姓名识别准确率,可向用户索要确切姓名列表(如"张三,李四"),用于精确匹配(比启发式更准、零误伤)。
- 不需要把文件内容读进模型。直接拿到路径即可。
第 2 步:准备本地运行环境
脱敏由 scripts/desensitize.py 完成,依赖 PyMuPDF、python-docx、openpyxl(均为本地库,不涉及网络与云端)。
优先使用本机受管 Python 的虚拟环境(已预装依赖):
PY=/Users/hbw/.workbuddy/binaries/python/envs/default/bin/python
若该路径不存在或缺少依赖,按以下方式就地补齐(仅安装本地库,不传输任何用户数据):
# 创建受管虚拟环境并安装依赖
/Users/hbw/.workbuddy/binaries/python/versions/3.13.12/bin/python3 -m venv /Users/hbw/.workbuddy/binaries/python/envs/default
/Users/hbw/.workbuddy/binaries/python/envs/default/bin/python -m pip install --quiet PyMuPDF python-docx openpyxl
第 3 步:运行脱敏脚本
基本用法(单文件或目录均可):
"$PY" "$SKILL_DIR/scripts/desensitize.py" <输入文件或目录>
常用参数:
--names 张三,李四:追加精确姓名列表(逗号分隔),用于精准脱敏,避免误伤。--no-name:关闭"姓名"启发式识别(仅脱敏证件号/手机/邮箱/银行卡等结构化信息)。在姓名误伤较多时使用。--types id,phone,landline,email,bank,name:指定开启的敏感类型(默认全开)。例如只想脱敏手机和身份证:--types phone,id。--mask xxxx:自定义掩码文本,默认xxxx(例如--mask 【已隐藏】)。--output 路径:指定输出路径(仅在输入为单文件时有效)。
示例:
# 处理单个 PDF,并按精确姓名列表脱敏
"$PY" "$SKILL_DIR/scripts/desensitize.py" "/路径/简历.pdf" --names 王小明
# 批量处理整个目录
"$PY" "$SKILL_DIR/scripts/desensitize.py" "/路径/待处理文件夹"
# 只脱敏手机号和身份证,掩码用【保密】
"$PY" "$SKILL_DIR/scripts/desensitize.py" "/路径/数据.xlsx" --types phone,id --mask 【保密】
> 说明:$SKILL_DIR 为本技能目录,即 ~/.workbuddy/skills/personal-desensitize。实际执行时替换为绝对路径。
第 4 步:核对产物并汇报(不回显敏感原文)
脚本会在控制台输出每类替换条数统计与输出文件路径,不会打印任何敏感原文。向用户汇报时只说:
- 生成了哪个脱敏文件(路径)。
- 各类型分别替换了几处(来自脚本输出)。
- 提示用户抽查确认;如有遗漏或误伤,用
--names/--no-name/--types调整后再跑一次。
输出文件命名规则:在原文件名扩展名前插入 -脱敏,例如 报告.pdf → 报告-脱敏.pdf,保存在同一目录。
识别能力说明(重要,影响准确性预期)
- 高置信(正则精确匹配):身份证号(18 位严格校验出生日期结构;另含 15 位旧号)、手机号(1[3-9] 开头的 11 位)、固定电话(带区号)、邮箱、银行卡号(15–19 位)。
- 启发式(可能误伤/漏判):中文姓名。基于"百家姓+复姓"前缀 + 2–4 个中文字,并排除明显是地名/机构名的结尾(市/省/县/区/局/院/公司…)。
- 局限:纯规则无法像人/大模型那样理解语义,可能漏掉生僻姓名,也可能误伤少量以姓氏开头的人名式词组。
- 提升准确率的方法:用
--names提供确切姓名(最稳);或对纯结构化脱敏场景加--no-name。 - PDF 限制:依赖文本层。扫描件/图片型 PDF(无文本层)无法脱敏,此类文件需先做 OCR(OCR 通常需联网/云端,违反本技能离线约束,故不在范围内);脚本会正常处理有文本层的 PDF。
隐私与离线约束(再次强调)
- 脚本只做本地文件读写,不发起任何网络请求。
- 运行本技能时,不要使用 WebFetch / 联网搜索 / 云端大模型 / 上传类工具去"理解"或"处理"文档内容。
- 不要将源文件或脱敏产物通过任何渠道外发,除非用户明确要求在本地打开/预览。
资源
scripts/desensitize.py:脱敏主程序(纯本地 Python,含全部识别规则与三种格式的读写/重涂逻辑)。