Charmoji
一张 IP 正面照 → 整套可提交的微信表情素材:出图、切图、机检、文案校验、提交清单全脚本化(Claude Code skill)
Install
git clone https://github.com/webkubor/charmojiInstall command taken from the project's README or registry entry. Always review code before running it.
README excerpt
Read full README on GitHub →charmoji
一张 IP 正面照,出一整套能直接提交的微信表情素材。
微信表情开放平台的投稿门槛不在画功,在规格:240×240 的表情图、750×400 的横幅、 必须透明背景的封面与图标、每张 ≤4 字且不许重复的含义词…… 而超规格的素材平台不拒收、不报错,直接压缩裁剪 —— 主体被裁掉才发现就白做了。
这是一个 Claude Code skill:形象管理、出图、切图、机检、
文案校验、提交清单全部脚本化,零美术基础也能跑完。上架之后还能一条命令把整套串成
1080×1920 竖版推广视频发朋友圈 / 视频号 —— 合成委托 reel-kit,
本 skill 只负责读 album.yml 拼参数,出片和排版的事不在这里重造。
规范与拒因都是实测的,不是抄文档:官方规范全文抓取归档,登录后的真实 URL 与提交表单 逐字段记录,还有一条真实驳回记录(画面里写「微信」二字会被判推广非自有版权的应用程序)—— 这些在官方文档里读不到。
产物演示
一整套真跑出来的 —— 输入只有一张正面照,一条命令产出表情图 + 封面 + 图标 + 横幅,机检 FAIL 0:
文件名自带含义词(01-开心.png、02-委屈.png…),编号即上传顺序,不用回头对映射表。
三件套的要求彼此矛盾,所以流水线分开处理:封面用正面半身像 + 透明背景, 图标用头部特写 + 透明背景,横幅要不透明、有场景、画面内不得有文字。
照片型表情 → 透明贴纸
不透明的白底照片发到微信就是一个白方块,深色模式下边缘生硬。抠图 + 重绘文字之后:
关键是顺序:先擦字再抠图。反过来的话,压在主体身上的文字会随主体保留, 和重绘的新文字叠在一起 —— 抠图按「主体/背景」二分,文字归哪边取决于它压在什么上面,不可控。
推广视频(1080×1920 竖版)
一条命令把整套表情串成朋友圈 / 视频号能发的竖版视频,版式对齐官方秒剪模板:
scripts/make_promo.py <系列目录> # 配乐默认「儿童轻快」
scripts/make_promo.py <系列目录> --sec 1.8 # 张数多时压缩每张停留
scripts/make_promo.py <系列目录> --voice narrator # 加配音,镜长由念白决定
文案的真源是 album.yml 的 captions 段,写「什么时候发这张」而不是重复画面文字,
传播力更强。配乐走配乐库别名(reel bgm 看清单),出片时会打印授权。
出视频的能力在 reel-kit(reel 命令),
这个脚本只负责读 album.yml 拼参数。要改版式就去改 reel-kit 的 templates/*.html,
丢一个 HTML 进去就是一个新版式,不用改代码。
前置:
cd ~/dev/github/devtool/reel-kit && pnpm install && npm link(需 ffmpeg + Chrome)
museav slideshow已下线。2026-08-28 曾在 museav-cli 里做过一个, 后来发现 reel-kit 早就做了同一件事且更好(HTML/CSS 排版能换行、支持配音驱动镜长、 本地 TTS 零成本),已收敛到一处。
动态表情(透明 GIF)
240×240 / 20 帧 / 465KB / 循环,深浅底都不出白边:
GIF 只有 1-bit 透明(每像素要么全透明要么全不透明),半透明像素必须二选一。
方案取阈值 128 + 主体腐蚀 1px,思路来自 hackerb9/mktrans。
别用 PS 教程常说的「杂边设为白色」 —— 浅色模式干净,深色模式每张镶白边。
详见 references/animated.md。
它替你解决什么
| 你会踩的坑 | skill 怎么拦 |
|---|---|
| 素材超尺寸被平台静默裁掉 | 切图流水线统一归一到规格尺寸并压到体积上限 |
| 封面/图标忘了透明背景 | 机检对封面/图标判 FAIL,表情图判 WARN,横幅反过来 |
| 「四角透明」当成抠过图 | 切图留的几像素透明边会骗过四角检测 → 改判主体外接框是否「实心矩形」 |
| 主体一圈白描边 | 比对「轮廓 vs 主体内部」亮度 —— 白猫这类白色系角色不会误报 |
| 整套画面差异不足(第一大拒因) | 裁到主体后算差分哈希两两比对,太像就 FAIL |
| 不同专辑用了同一张封面/图标 | 跨专辑差分哈希比对(官方明文禁止) |
| 把台词当含义词(「555…我没事」) | 校验 ≤4 字、无标点、同套不重复、条数与张数一一对应 |
| 图标裁成方块、四角发硬 | 自动取头部正面并留 12% 边 |
| 竖构图素材居中裁切掉主体 | --anchor top/center/bottom;赞赏引导图必须 top(下半部会叠加金额 UI) |
| 出图偶发失败导致张数不足 | 单张重试;上游限流识别 + 三级退避;重跑只补缺失的 |
| 多个 IP 混着做,简介/头像串了 | IP 库分层存放;形象名重复、不同形象同头像都会被拒 |
| 作品挂错表情形象 | album.yml 的 ip_name 与 --ip 不一致直接拦下(改归属只有 1 次机会) |
| 形象母版只存在本地,丢了合集就断 | ip.py sync 推私有仓库版本化,换机 clone 即恢复 |
| 画面里写「微信」二字 | 机检拦不住 —— 这条只能靠人眼,已写进红线清单 |
安装
git clone https://github.com/webkubor/charmoji.git \
~/.claude/skills/charmoji
装完在 Claude Code 里说「帮我做一套微信表情」即可触发;也可以只当命令行工具用。
⚠️ 必须 clone 到
~/.claude/skills/下的真目录。Claude Code 不跟随 symlink 加载 skill —— 把真目录放别处、这里放软链会导致 skill 直接消失。
数据模型:形象唯一,系列多套
微信那边是两个独立配置,且一对多:
表情形象(唯一) 表情系列 / 专辑(多套)
名称·简介·头像·图标 ──┬── 系列 A:表情图 8~24 张 + 封面 + 横幅 + 含义词
├── 系列 B:另一套,复用同一个形象
└── 系列 C:…
本地照这个分层,并按「能不能再生」决定是否进版本库:
Similar plugs
Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.
Turn any codebase, with its docs, SQL schemas, configs, and PDFs, into a queryable knowledge graph. A /graphify skill for Claude Code, Cursor, Codex, and Gemini CLI: local…
Why use many token when few token do trick. Viral skill + proxy for coding agents that cuts 65% of tokens by talking like a caveman.
Production-grade engineering skills for AI coding agents.
The 1st Collaborative AI Design Agent Workspace. Local-first and open source. Create prototypes, websites, apps, dashboards, presentations, images, and videos with your team…