WeChat Sticker Maker - 微信表情包制作 Skill
概述
用户上传一张参考图(人物/动物/角色照片),提出风格要求(如 Q 版卡通、超写实、水墨风、像素风等),先输出定妆照供用户确认,确认后批量生成表情包,最终输出符合腾讯微信表情开放平台规范的图片/专辑文件。
核心能力
- 参考图 → 定妆照:基于参考图生成角色定妆照(保持人脸/角色特征一致性)
- 用户确认后批量生成:一次生成一张或多张表情
- 表情类型:静态表情(PNG)+ 动态贴图(GIF)
- 腾讯合规:所有输出自动适配微信表情开放平台规范
- 配套素材一次到位:主图 / 缩略图 / 详情页横幅 / 封面图 / 聊天面板图标,
以及赞赏引导图(750×560)+ 赞赏致谢图(750×750)全部由脚本自动产出(含文案),
不需要再手工做图
前置条件
✅ 用户必须自备
| 项目 | 说明 |
|---|---|
| 大模型 API Key | 用于生图(通义万相或 OpenAI),见下方配置指引 |
| 参考图 | 你想做成表情的人/动物/角色的照片(支持 jpg/png) |
⚠️ 无内置 Key
本 Skill 不内置任何默认 API Key。使用者必须自行配置才能运行。所有 API 调用费用由使用者自行承担。
配置指引
方式一:通义万相(推荐 ✅)
支持参考图保持角色一致性,最适合做角色表情包。
# 1. 注册获取 Key(免费额度够用)
# 访问 https://bailian.console.aliyun.com/
# 开通「通义万相」服务 → 获取 API Key
# 2. 配置环境变量
export DASHSCOPE_API_KEY="sk-xxxxxxxxxxxxxxxxxxxx"
方式二:OpenAI DALL-E 3
# 1. 获取 Key
# 访问 https://platform.openai.com/api-keys
# 2. 配置环境变量
export STICKER_API_KEY="sk-xxx"
export STICKER_PROVIDER="openai"
🏠 OpenClaw 智能体配置
如果你在 OpenClaw 智能体中使用本 Skill,只需在智能体配置中添加环境变量即可:
方式 A — 通过 OpenClaw 配置文件(auth-profiles.json):
{
"authProfiles": {
"dashscope": {
"env": {
"DASHSCOPE_API_KEY": "sk-xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
方式 B — 在 OpenClaw 环境变量面板中直接添加 DASHSCOPE_API_KEY。
配置一次后永久生效,智能体会自动读取 Key 完成生图。用户无需了解具体技术细节。
验证配置是否成功
# 终端验证
echo $DASHSCOPE_API_KEY # 应该输出你的 Key,不为空即配置成功
脚本运行方式
# 1. 安装依赖
pip install requests pillow # 用 OpenAI 的话再加: pip install openai
# 2. 设置环境变量(如果还没配)
export DASHSCOPE_API_KEY="sk-xxx"
# 3. 写表情清单(推荐 stickers.json,不必改 Python)
# 也可编辑 scripts/generate-stickers-v2.py 里的 stickers 列表
cat > stickers.json <<'JSON'
{
"stickers": [
{"key": "happy", "text": "开心", "prompt": "..."},
{"key": "send", "text": "收到", "prompt": "..."}
],
"cover": {"prompt": "角色正面半身像,纯白背景(会自动抠成透明底)"},
"banner": {"prompt": "宽幅横构图;注意画面中不要出现任何文字"},
"reward_guide": {"prompt": "角色双手捧心卖萌,纯白背景,画面中不要出现任何文字",
"text": "喜欢就赞赏一下吧", "sub": "你的支持是更新的动力"},
"reward_thanks": {"prompt": "角色鞠躬致谢,纯白背景,画面中不要出现任何文字",
"text": "谢谢你的喜欢", "sub": "祝你天天开心"}
}
JSON
# 4. 生成表情原图(同时写出 output/index.json)
python3 scripts/generate-stickers-v2.py
# 5. 【动态专辑才需要】把素材/视频合成合规 GIF
python3 scripts/make-gifs.py
# 6. 打包成可直接上传微信后台的素材包
python3 scripts/format-stickers.py
三个脚本的分工:
| 脚本 | 输入 | 输出 | 依赖 |
|---|---|---|---|
generate-stickers-v2.py |
参考图 reference/portrait.jpg + stickers.json |
output/sticker-<key>.png、cover_raw.png、banner_raw.png、reward_guide_raw.png、reward_thanks_raw.png、index.json |
requests(+ 可选 openai) |
make-gifs.py |
output/videos/<key>.mp4(方案A)或 output/<key>_v.png(方案B) |
output/<key>.gif |
Pillow;方案A 需 ffmpeg |
format-stickers.py |
上面全部 | output/wechat-ready/ 素材包(含 06_赞赏素材/)+ 提交清单.md |
Pillow(含 ImageFont) |
selftest.py |
无(自建临时副本) | 不产出文件,只报结果 | Pillow;ffmpeg 可选 |
> 有 output/<key>.gif 即判定为动态专辑,主图输出 GIF;否则按静态专辑输出 PNG。
> 混用会被平台驳回,format-stickers.py 会直接报错退出(退出码 1)。
装完先跑一次自检(不联网、不消耗 API 额度,约 20 秒):
python3 scripts/selftest.py # 退出码 0 = 链路可用
stickers.example.json 是表情清单示例,改名为 stickers.json 即可直接使用。
工作流程
第一步:用户上传参考图 + 定义风格
用户输入:
- 参考图(1 张,人物/动物/角色照片或插画)
- 风格描述(如:Q 版卡通、超写实、水墨风、像素风、3D 渲染、日系动漫、美式漫画等)
- 可选:角色名称、角色设定文本
行为:
- 分析参考图:用视觉模型提取角色特征(长相、体型、服装风格、颜色体系)
- 与用户确认风格方向(如果描述不够具体,建议 2-3 个方向供选择)
第二步:生成定妆照
- 用生图模型生成角色定妆照
- 定妆照要求:
- 角色正面全身或半身
- 展示主要特征(服饰、标志物、颜色体系)
- 透明背景或纯色背景
- 比例:1:1(正方形,基础用于后续表情裁剪)
- 格式:PNG,至少 512×512px
输出: 定妆照 + 预览链接
用户确认: 用户需确认"定妆照可用"才进入下一步。如需修改,调整 prompt 重新生成。
第三步:设计表情列表
建议默认表情列表(可编辑):
- 基础情绪:开心、难过、生气、惊讶、喜欢
- 日常场景:OK、收到、加油、拜拜、好的
- 工作/特定场景:加载中、报错、算力告急、稳了、裂开、救救我、麻了
用户确认: 表情列表确认后才开始生成。
第四步:生成表情
4a 生成静态表情(PNG)
- 每张表情基于定妆照 + 具体表情描述生成
- 生成后在角色图上叠加上文字
- 输出规格:
- 尺寸:240×240px(微信表情标准)
- 格式:PNG,透明背景
- 命名:em01.png ~ em24.png
4b 生成动态贴图(GIF)
方案 A(推荐):生图 → 视频 → GIF
静态图 → 视频(wan2.6-i2v-flash) → ffmpeg 转 GIF:
ffmpeg -i input.mp4 -vf "fps=16,scale=240:240:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=64[p];[s1][p]paletteuse=dither=bayer" output.gif
方案 B(备用):多帧静态图拼接
生成 3-5 帧关键帧 → 用 ffmpeg/ImageMagick 拼接为 GIF
4c 生成专辑配套素材
| 素材 | 尺寸 | 格式 | 说明 |
|---|---|---|---|
| 表情主图 | 240×240 | PNG / GIF | em01~em24 |
| 表情缩略图 | 120×120 | PNG | 每张主图各一张 |
| 详情页横幅 | 750×400 | PNG / JPG | 不得含任何文字,不得白底,不得透明底 |
| 表情封面图 | 240×240 | PNG | 必须透明底,不要出现方形边框 |
| 聊天面板图标 | 50×50 | PNG | 必须透明底,取头部正面,≤100KB |
| 赞赏引导图 | 750×560 | PNG | 可含文字,须与表情同风格;打包脚本自动产出 |
| 赞赏致谢图 | 750×750 | PNG | 可含文字;打包脚本自动产出 |
| 专辑介绍文本 | — | md / txt | 名称≤8汉字、介绍≤80汉字、含义词各≤4汉字 |
第五步:组装微信表情开放平台专辑
输出目录结构(序号即后台上传栏位):
output/wechat-ready/
├── 01_表情主图/ em01.gif ...(动态)或 em01.png ...(静态) 240×240
├── 02_表情缩略图/ em01_thumb.png ... 120×120
├── 03_详情页横幅/ banner_750x400.png 750×400 无文字
├── 04_表情封面图/ cover_240x240.png 240×240 透明底
├── 05_聊天面板图标/ icon_50x50.png 50×50 透明底
├── 06_赞赏素材/ reward_guide_750x560.png 750×560 不透明
│ reward_thanks_750x750.png 750×750 不透明
└── 提交清单.md 逐栏上传对照表
> 06_赞赏素材 保证产出(v1.2.0 起)。赞赏引导图 750×560 与致谢图 750×750 曾是
> 「选填 + 手工做图」,现在由 format-stickers.py 直接合成:主体抠底后置于渐变底上,
> 文案恒在底部文案带内(结构上杜绝文字压脸)。原图来源按「专用原图 →
> 封面原图 → 首张表情原图」逐级降级,即使什么都不配也不会缺件。
> 文案可在 stickers.json 里改:
> json
> "reward_guide": {"text": "喜欢就赞赏一下吧", "sub": "你的支持是更新的动力"},
> "reward_thanks": {"text": "谢谢你的喜欢", "sub": "祝你天天开心"}
>
> 若要让模型单独出图,再给它们各加一个 "prompt" 即可(prompt 里务必写明不要出现文字)。
微信表情开放平台规范
必备素材
| 项目 | 表情主图 | 缩略图 | 详情页横幅 | 表情封面图 | 聊天面板图标 |
|---|---|---|---|---|---|
| 数量 | 8~24 | 同主图 | 1 | 1 | 1 |
| 尺寸 | 240×240px | 120×120px | 750×400px | 240×240px | 50×50px |
| 格式 | 动态 GIF / 静态 PNG·JPG·GIF | PNG | PNG / JPG | PNG | PNG |
| 大小 | ≤500KB | ≤500KB | ≤500KB | ≤500KB | ≤100KB |
| 背景 | — | — | 不透明,禁文字,禁白底 | 透明底 | 透明底 |
赞赏素材(平台侧开通赞赏时才需要上传,但素材包总是产出这两张)
| 项目 | 赞赏引导图 | 赞赏致谢图 | 赞赏引导语 |
|---|---|---|---|
| 尺寸 | 750×560px | 750×750px | — |
| 格式 | PNG(脚本产出) | PNG(脚本产出) | 5~15 汉字 |
| 大小 | ≤500KB | ≤500KB | — |
| 背景 | 不透明 | 不透明 | — |
| 字体 | GUI 默认取系统首个可用中文字体(PingFang / 冬青黑体 / 思源黑体 / 微软雅黑 …) | 同左 | — |
动态表情附加要求
| 项目 | 要求 |
|---|---|
| 帧率 | 16~20 fps |
| 颜色数 | ≤64 色 |
| 时长 | 1~3 秒 |
| 循环 | 应循环播放,节奏流畅不卡顿 |
> ⚠️ 同一套专辑必须统一为「全动态」或「全静态」,不可混用。
审核注意事项
- 不得包含二维码、微信号、手机号、网址、水印等联系方式
- 不得包含政治敏感、色情、暴力内容
- 文字建议使用中文(可少量英文)
- 不得使用未授权的品牌 LOGO 或 IP 形象(宝可梦、三丽鸥等一律驳回),不得使用真人肖像
- 动态贴图需要流畅,抖动不能太剧烈
- 字体需确认无版权问题(推荐思源黑体、得意黑等开源字体)
- 详情页横幅内不得出现任何文字,不得使用白底或接近白的底色,不得透明底
- 封面图与聊天面板图标必须是透明底,否则必然被驳回;不得有白边、锯齿、生硬直角或方形边框
- 封面取下半身或全身像,不要只截头部;图标取头部正面
- 同一套表情的含义词不可重复(两张都表达「哈哈」会被算作一张)
- 名称与简介不得出现「官方 / 正版 / 认证」等背书词,不得蹭热点人名
- 角色类型选「动漫卡通」,不要错选「男人 / 女人」
交互模式
单张模式
用户 → 发一张参考图 + 风格要求
→ AI 生成定妆照
→ 用户确认
→ AI 逐个生成表情(用户每确认一张再生成下一张)
批量模式
用户 → 发一张参考图 + 风格要求 + 表情列表
→ AI 生成定妆照
→ 用户确认定妆照
→ AI 批量生成全部表情
→ 输出完整专辑
输出交付清单
- ✅ 定妆照(使用确认后的版本)
- ✅ 全部表情主图 + 缩略图(符合腾讯规范)
- ✅ 详情页横幅(750×400,无文字)
- ✅ 表情封面图(240×240 透明底)
- ✅ 聊天面板图标(50×50 透明底)
- ✅ 赞赏引导图(750×560)+ 赞赏致谢图(750×750),含文案,无需手工做图
- ✅ 专辑介绍文案 / 提交清单.md
- ✅ 打包好的专辑目录(可直接提交微信表情开放平台)
已知问题与修复记录
v1.2.0 修复
- 赞赏引导图(750×560)与赞赏致谢图(750×750)原先根本不会被生成:
SKILL.md只在规范表里写了尺寸,format-stickers.py末尾只打印一句
「选填,见 SKILL.md」,把球踢给使用者;stickers.json也没有对应字段,
提交清单.md里更没有这两栏。现已在06_赞赏素材/下自动产出,
并在提交清单中单列「赞赏填写」小节。 - 这两张图现在是"保证产出":源图按「
reward_*_raw.png→cover_raw.png→
首张表情原图」逐级降级,即使stickers.json什么都不配也不会缺件。 - 构图采用「上主体、下文字带」,文案恒在底部条内 —— 从结构上避免
文字压住角色面部(此前手工做图时踩过这个坑)。 - 中文字体自动探测(PingFang / 冬青黑体 / 思源黑体 / 微软雅黑 …),
跨 macOS / Linux / Windows 可用;探测不到时仍出图,只跳过文案。 - 赞赏图体积超 500KB 时自动量化到 256 色再存(真彩 PNG 常超限)。
generate-stickers-v2.py支持reward_guide/reward_thanks的prompt,
可让模型单独出图;文案由打包脚本叠加,避免模型把字画成乱码。- 自检扩展到 67 项断言,新增:赞赏原图产出、赞赏素材尺寸/体积/不透明、
底部文案带是否真的叠上了文字、删掉全部原图后的降级产出。
v1.1.0 修复
format-stickers.py原先把源/目标目录写死为作者本机路径
(/var/www/html/ip-brand-showcase/、/root/.openclaw/agents/101/...),
在任何其它机器上都无法运行。已改为相对本 skill 的output/目录。format-stickers.py原先写死了另一个专辑(张三丰太极)的 10 个文件名。
已改为读取output/index.json驱动,缺失时回退扫描output/sticker-*.png。format-stickers.py原先调用 ImageMagick 的convert命令做缩放,
但 macOS 默认不预装 ImageMagick,且 SKILL.md 从未把它列为依赖。
已全部改用 Pillow 实现,依赖收敛为pip install pillow。- 原先的规范表把「详情页横幅」写成 750×560(那是赞赏引导图的尺寸),
且完全缺少聊天面板图标 50×50。已按平台官方规范更正并补齐素材。 - 脚本输出的文件名(
sticker-<key>.png)与规范里的em01~em24命名不一致,
素材包落盘时统一转为em01~em24。 - 动态专辑原先会被错误地打包成静态 PNG 主图。现在检测到
output/<key>.gif就按动态专辑输出 GIF 主图,并在混用时告警。 - 新增
make-gifs.py:把视频(ffmpeg)或两帧静态图合成符合微信规范的 GIF
(240×240 / ≤64 色 / 循环 / 1~3 秒),动态路径不再需要手敲 ffmpeg。 - 新增
stickers.json外部清单:定义表情不再需要编辑 Python 源码。 format-stickers.py现在会一并产出提交清单.md(逐栏上传对照表 + 自查项)。- 详情页横幅原先把 alpha 通道一起带出(RGBA),而平台要求"避免使用透明底"。
现强制转换为 RGB 不透明输出。 - 原先把"动态/静态混用"只做告警就继续打包,会产出必被驳回的包。
现直接报错退出(退出码 1)并给出两条修正路径。 - 原先不清理
output/wechat-ready/,在动态↔静态之间切换重跑时会残留上一版的
em01.gif与em01.png并存,极易误传。现每次打包前清空。 - 方案B(两帧静态图合成)原先只拼 3 帧 A→B→A,单循环仅 ~0.36 秒,
达不到平台要求的 1~3 秒。现改为在两帧之间线性插值,产出 10 帧 ≈ 1.2 秒循环。 - 新增
scripts/selftest.py:不联网、不消耗额度的链路自检(v1.2.0 起为 67 项断言),
可一键确认打包链路是否可用。