对聊天/消息应用(如微信、WhatsApp、Telegram、iMessage、Slack、Discord等)截图进行像素化处理,以隐藏聊天名称、头像和/或显示名称。
ChatMask skill. 当用户发送聊天截图并请求像素化或隐藏身份时是一项面向实际任务的技能,主要用于元素, 请遵循以下步骤, 顺序 : 设置 – Workflow.;不需要外部 API 密钥。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
当用户发送聊天截图并要求对身份相关元素进行像素化或隐藏时,请按以下顺序执行步骤:环境准备 → 工作流程。
无需外部 API 密钥。 本技能复用您已有的 AI 能力来定位图像中的目标区域,仅将图像处理任务委托给本地 Python 脚本执行。
请在首次执行任务前运行以下代码块。所有步骤均已加保护机制,重复运行是安全的。
# 默认安装路径 — 可通过在调用技能前设置 CHAT_PIXELATE_PATH 环境变量覆盖
CHAT_PIXELATE_PATH="${CHAT_PIXELATE_PATH:-$HOME/.openclaw/skills/chatmask}"
# 1. 克隆仓库并检出已固定、经审计的提交版本
# 审计提交哈希:62b0d1132e8cad8455ef29f74a98da486ff102d4(frankz2020/chatmask,v1.1.0)
PINNED_SHA="62b0d1132e8cad8455ef29f74a98da486ff102d4"
if [ ! -d "$CHAT_PIXELATE_PATH/.git" ]; then
git clone https://github.com/frankz2020/chatmask.git "$CHAT_PIXELATE_PATH"
fi
# 强制检出固定提交 — 防止因远程分支更新导致静默偏移
(cd "$CHAT_PIXELATE_PATH" && git fetch --quiet origin && git checkout --quiet "$PINNED_SHA")
# 2. 若虚拟环境尚未创建,则新建
if [ ! -d "$CHAT_PIXELATE_PATH/.venv" ]; then
python3 -m venv "$CHAT_PIXELATE_PATH/.venv" \
|| { apt-get install -y python3-venv && python3 -m venv "$CHAT_PIXELATE_PATH/.venv"; }
fi
# 3. 安装/升级依赖项(Pillow、python-dotenv — 运行时无网络请求)
"$CHAT_PIXELATE_PATH/.venv/bin/pip" install -q -r "$CHAT_PIXELATE_PATH/requirements.txt"
export CHAT_PIXELATE_PATH
PYTHON="$CHAT_PIXELATE_PATH/.venv/bin/python3"
本次安装内容:Pillow(图像处理)和 python-dotenv(仅用于独立模式下的 .env 文件加载)。
requests包不会由本技能安装 — 它仅在独立模式(非技能模式)下需要,定义于requirements-standalone.txt中。脚本在运行时不做任何网络请求。
网络行为说明:环境准备阶段唯一的出站请求为
git clone(一次性)与pip install(一次性)。在工作流程阶段,当传入--bbox-json参数时,process.py将不发起任何网络请求 — 所有处理均在本地完成。
请先阅读 元素选择 和 选项配置 章节,将用户的自然语言请求准确映射为对应命令行参数,再执行后续操作。
JOB_ID="job_$(date +%s)" OUT_DIR="/tmp/chat_pixelate_out_$JOB_ID" mkdir -p "$OUT_DIR"
每张图像必须单独分析与像素化处理。 不同截图中各元素的位置不同 — 若将某张图像的边界框坐标应用于另一张图像,会导致敏感区域未被正确遮蔽。请对用户发送的每张图像重复执行以下代码块。
为何需逐图处理?
--bbox-json参数作用域限定于单张图像。process.py对此做了强制约束:当启用--bbox-json时,若输入目录中存在多于一张图像,程序将报错退出。
针对每张图像 :
# 每个文件使用一个独立的单图输入目录 IMG_FILE="" # 替换为实际文件名 IN_DIR="/tmp/chat_pixelate_in_${JOB_ID}_${IMG_FILE%.*}" mkdir -p "$IN_DIR" cp "$HOME/.openclaw/media/inbound/$IMG_FILE" "$IN_DIR/"
对 $IN_DIR/$IMG_FILE 应用下方提示词,并捕获其 JSON 输出结果。该 Schema 使用归一化坐标(0–1000),其中 (0,0) 表示左上角,(1000,1000) 表示右下角,坐标顺序为 y_min, x_min, y_max, x_max。
You are a privacy specialist analyzing a chat/messaging app screenshot.
The app could be WeChat, WhatsApp, Telegram, iMessage, Slack, Discord, LINE,
KakaoTalk, or any other messaging application. The UI may be in English,
Chinese, or any other language. Identify the requested elements by their
visual layout and position, not by app-specific labels.
YOUR TASK:
Locate ALL occurrences of the following elements and return their bounding boxes:
1. chat_names — The text title in the top navigation/header bar (conversation
name, group name, channel title, back-button contact name).
2. profile_pics — Circular or rounded avatar images next to message bubbles,
in the header, or on the participants list. Each distinct
avatar occurrence is its own region.
3. display_names — Text username/nickname labels directly next to or above
message bubbles (sender names, distinct from the header title).
RULES:
- Return ONLY the elements listed above.
- Each element occurrence must be its own region.
- Cover the full visible area with a small amount of padding.
- If an element type is not visible, return an empty list for that key.
- Use normalized coordinates (0-1000) where (0,0) is top-left and (1000,1000) is bottom-right.
- Coordinate order: y_min, x_min, y_max, x_max (top, left, bottom, right).
- All values must be integers between 0 and 1000.
Respond ONLY with a JSON object using this exact schema (no extra text outside the JSON):
{
"chat_names": [{"y_min": int, "x_min": int, "y_max": int, "x_max": int}],
"profile_pics": [{"y_min": int, "x_min": int, "y_max": int, "x_max": int}],
"display_names": [{"y_min": int, "x_min": int, "y_max": int, "x_max": int}]
}
请省略用户未请求的元素对应键(参见下方 元素选择 章节)。
将步骤 2b 得到的 JSON 内容通过 --bbox-json 参数传入。全程不读取或写入任何 API 密钥。
BBOX='' "$PYTHON" "$CHAT_PIXELATE_PATH/process.py" \ "$IN_DIR" \ "$OUT_DIR" \ --bbox-json "$BBOX" \ [OPTIONS] # 参见下方“元素选择”与“选项配置”章节
请在继续下一步前,对所有图像完整执行 2a–2c 步骤。
ls "$OUT_DIR/"*_pixelated.png
请将 $OUT_DIR/ 目录下所有处理完成的图像作为附件发送或共享给用户。
将用户意图翻译为 --elements 参数。默认值(不指定该参数)将对全部三类元素进行像素化处理。
| 用户表述(英文 / 中文) | --elements 参数 |
|---|---|
| all / default / 全部 / 默认 / 全部打码 | (省略该参数 — 默认处理全部三类) |
| chat name only / 只隐藏聊天名称 | --elements chat_name |
| profile pics only / 只隐藏头像 | --elements profile_pic |
| display names only / 只隐藏昵称 / 只隐藏用户名 | --elements display_name |
| avatars and display names / 隐藏头像和昵称 | --elements profile_pic,display_name |
| chat name and avatars / 隐藏聊天名称和头像 | --elements chat_name,profile_pic |
| chat name and display names / 隐藏聊天名称和昵称 | --elements chat_name,display_name |
当用户未请求全部三类元素时,请在步骤 2 的边界框 JSON 提示词中省略未使用的键,以降低噪声干扰。
各元素定义:
| 用户表述(英文 / 中文) | 参数 |
|---|---|
| soft blur / mist effect / 模糊效果 / 雾化(默认) | --pixel-mode A (默认) |
| block / mosaic / pixelate blocks / 马赛克 / 方块效果 | --pixel-mode B |
处理两张图像,每张图像均进行独立的、基于单图的边界框分析:
# (假设已完成环境准备,且已导出 CHAT_PIXELATE_PATH 与 PYTHON 变量)
JOB_ID="job_$(date +%s)"
OUT_DIR="/tmp/chat_pixelate_out_$JOB_ID"
mkdir -p "$OUT_DIR"
# --- 图像 1:screenshot_a.png ---
IN_A="/tmp/chat_pixelate_in_${JOB_ID}_a"
mkdir -p "$IN_A"
cp "$HOME/.openclaw/media/inbound/screenshot_a.png" "$IN_A/"
# (使用您的视觉模型分析 screenshot_a.png,捕获 JSON 并赋值给 BBOX_A)
BBOX_A='{"chat_names":[{"y_min":20,"x_min":100,"y_max":80,"x_max":900}],"profile_pics":[{"y_min":150,"x_min":10,"y_max":220,"x_max":80}],"display_names":[{"y_min":160,"x_min":90,"y_max":190,"x_max":350}]}'
"$PYTHON" "$CHAT_PIXELATE_PATH/process.py" "$IN_A" "$OUT_DIR" --bbox-json "$BBOX_A"
# --- 图像 2:screenshot_b.png --- (需单独分析;各元素位置不同)
IN_B="/tmp/chat_pixelate_in_${JOB_ID}_b"
mkdir -p "$IN_B"
cp "$HOME/.openclaw/media/inbound/screenshot_b.png" "$IN_B/"
# (使用您的视觉模型分析 screenshot_b.png,捕获 JSON 并赋值给 BBOX_B)
BBOX_B='{"chat_names":[{"y_min":10,"x_min":200,"y_max":70,"x_max":800}],"profile_pics":[],"display_names":[{"y_min":200,"x_min":60,"y_max":240,"x_max":400}]}'
"$PYTHON" "$CHAT_PIXELATE_PATH/process.py" "$IN_B" "$OUT_DIR" --bbox-json "$BBOX_B"
echo "=== 输出图像 ==="
ls "$OUT_DIR/"*_pixelated.png
# 仅对一张图像中的头像进行模糊处理 — JSON 中省略未使用的键
IN_IMG="/tmp/chat_pixelate_in_${JOB_ID}_img"
mkdir -p "$IN_IMG"
cp "$HOME/.openclaw/media/inbound/chat.png" "$IN_IMG/"
BBOX='{"profile_pics":[{"y_min":150,"x_min":10,"y_max":220,"x_max":80}]}'
"$PYTHON" "$CHAT_PIXELATE_PATH/process.py" "$IN_IMG" "$OUT_DIR" \
--elements profile_pic \
--bbox-json "$BBOX"
# 隐藏聊天名称与昵称,采用马赛克样式
BBOX='{"chat_names":[{"y_min":0,"x_min":100,"y_max":60,"x_max":900}],"display_names":[{"y_min":160,"x_min":90,"y_max":190,"x_max":350}]}'
"$PYTHON" "$CHAT_PIXELATE_PATH/process.py" "$IN_IMG" "$OUT_DIR" \
--elements chat_name,display_name \
--pixel-mode B \
--bbox-json "$BBOX"
| 现象 | 原因 | 解决方法 |
|---|---|---|
--bbox-json ... but N images were found |
启用 --bbox-json 时输入目录中存在多个图像 |
为每张图像使用独立的 $IN_DIR,并对每张图像单独运行一次 process.py |
python3 -m venv 失败 |
缺少 venv 模块 | 运行 apt-get install -y python3-venv 后重新执行环境准备 |
git clone 失败 |
未安装 git 或无网络连接 | 运行 apt-get install -y git 或检查网络连通性 |
No images found in input directory |
复制步骤失败 | 执行 ls $IN_DIR/ 检查,并确认文件名完全一致 |
图像未经修改即输出,摘要中显示 SKIPPED |
JSON 解析失败 | 检查控制台打印的警告信息;验证 bbox JSON 格式是否合法 |
| 像素化区域错误 | 边界框坐标不准确 | 重新分析图像并调整坐标;可尝试使用 --pixel-mode B |
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134万人学习
共49课时 | 82.5万人学习