Skip to content

Charmoji

一张 IP 正面照 → 整套可提交的微信表情素材:出图、切图、机检、文案校验、提交清单全脚本化(Claude Code skill)

Install

$git clone https://github.com/webkubor/charmoji

Install command taken from the project's README or registry entry. Always review code before running it.

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

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.

The 1st Collaborative AI Design Agent Workspace. Local-first and open source. Create prototypes, websites, apps, dashboards, presentations, images, and videos with your team…