Reel 封面
每个 Reel 都有其专属封面。它使用您的真实照片和真实字体构建,并将文字保持在 Instagram 个人资料网格显示的区域之内。
配置:在此设置您的品牌
首次运行前编辑一次。
| 设置 | 位置 | 默认值 |
|---|---|---|
| 强调色 | scripts/cover.html 中的 --brand | #3b82f6 |
| 标题字体 | scripts/cover.html 中的 --display-font | Anton (免费,Google Fonts) |
| 副标题字体 | scripts/cover.html 中的 .sub | Montserrat Bold (免费) |
| 默认副标题 | 您的封面 | 例如 "from a Home Cook",或留空 |
| 照片文件夹 | library.json 中的 photos_dir | <PATH_TO_YOUR_COVER_PHOTOS> |
| Canva 照片文件夹 (可选) | library.json 中的 canva_folder | <YOUR_CANVA_FOLDER_ID> |
| Canva 封面母版文档 (可选) | 您当前风格的参考 | <YOUR_CANVA_COVER_MASTER_DOC_ID> |
| Canva 草稿设计 (可选) | 用于从 Canva 导出照片 | <YOUR_CANVA_SCRATCH_DESIGN_ID> |
| 封面日志 | pick.py 的 COVER_LOG 环境变量 | 项目根目录下的 drafts/social/cover-log.json |
| 完成封面的存放位置 | 步骤 8 | <YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/ |
| 禁用词 | hooks.md 规则 | 您的列表 (例如旧的优惠名称) |
专为 Instagram 设计。 封面可以作为普通 IG + TikTok + Shorts 帖子的视频缩略图(例如 Metricool 的 videoThumbnailUrl)。仅 Instagram 网格对设计至关重要。切勿替换帖子已有的封面。
切勿使用 AI 生成图片。 背景是您的照片,布局复制自您的封面。代码仅负责排列它们。
默认品牌风格 (可根据喜好更改)
仅参考您母版文档中最新的封面。 您已淘汰的旧风格不计入在内。
- 一张明亮、中性的照片,包含您和一个相关道具(笔记本电脑、相机、手机、产品),文字所在位置为纯色背景。
- 标题使用白色展示字体,始终全大写,居中,2 或 3 行,字号相对较小。
- 可选的副标题使用 Montserrat Bold 字体,正常大小写。
- 默认:无阴影、无轮廓、无文字后的色带或暗化处理、无强调色文字。
- 无标签、无斜体字、无手写体或草书字体、无大数字或系列布局。
- 唯一的额外元素:偶尔使用一个纯色强调手绘箭头。
- Reel 图标下方不放任何内容:Instagram 的网格将图标放置在每个磁贴的右上角。如果任何内容位于 x > 760 且 y < 540 的区域,
render.mjs会发出警告。
标题规则、钩子类型和标签在 hooks.md 中。编写标题前请先阅读它。
文件
| 文件 | 说明 |
|---|---|
scripts/cover.html | 唯一布局:标题 + 可选副标题,以及 arrow / inset / avatar 等额外元素。品牌配置位于顶部。 |
scripts/render.mjs | 渲染 1080x1920 的 JPG 图片 + 两种预览图,并对超出安全区域的文字或大于 8MB 的文件发出警告。 |
scripts/pick.py | 根据主题筛选照片,阻止使用最近 9 张用过的照片,并打印最近的布局和钩子类型。 |
library.json | 每张照片及其标签(姿势、道具、空白区域位置、焦点)。附带一个示例;请构建您自己的。 |
封面日志 (COVER_LOG) | 已发布的所有封面记录。这是保持封面唯一性的关键。 |
photos_dir | 您的高分辨率照片(仅限本地,请勿加入 git 仓库)。 |
scripts/ 需要 puppeteer-core(在 scripts/ 中执行 npm i puppeteer-core,或将 scripts/node_modules 符号链接到另一个技能的安装目录)、Google Chrome 和 ffmpeg。render.mjs 指向 macOS 默认的 Chrome 路径;如果您的路径不同,请更改 executablePath。
运行流程
1. 了解 Reel。 您需要每个 Reel 的文字记录、标题和开头文字卡片。确定 Reel 的核心承诺。
2. 标题。 选择一个与上一个封面不同的钩子类型(pick.py 会打印出来)。编写 3 到 4 个选项,每个 3 到 8 个词,然后选出最强的一个。它不能逐字重复开头文字卡片的内容。
3. 照片。
python3 .claude/skills/reel-covers/scripts/pick.py "<主题词>" --space top
然后 查看前 3 或 4 张 后再选择(使用 ffmpeg 创建联系表)。道具要与主题匹配:邮件、系统或网站相关用笔记本电脑;设备或产品相关用相机或产品;销售和心态相关用您正在说话的照片。对于客户案例,使用客户的嵌入图或头像(需获得许可)。
4. 布局。 不要与上一个封面的布局相同(参见 pick.py)。将文字放在照片的空白区域(space),设置 focus 以确保面部清晰,并设置 y 使文字块位于 300 到 1250 之间。
5. 渲染。
OUT="<work>/covers" node .claude/skills/reel-covers/scripts/render.mjs covers.json
{"covers":[{"id":"3-the-exact-close","img":"<PATH_TO_YOUR_COVER_PHOTOS>/<file>.jpg",
"data":{"head":"the exact close I use on sales calls","sub":"from a Home Cook","y":560,"headroom":280}}],
"history":["<最近几个已发布封面的文件名,最新的在前>"]}
将 ~ 扩展为实际路径;render.mjs 不会自动扩展。非零退出码表示存在警告,请在分享前修复。
6. 先自行检查。 打开 _proof.png 和 _grid-phone.png:
- 标题在网格预览图(130px 宽)中是否可读?如果不可读,请减少字数。
- 在完整封面和网格裁剪图中,面部是否都没有被文字遮挡?
- 在网格中与其他封面相比,它看起来是否不同(照片、布局、文字位置),但又明显属于同一套?
7. 门控。 向用户展示 _grid-phone.png 和 _proof.png,以及每个标题及其一个备选标题。询问:"这些封面能吸引人滑动吗?" 根据要求更换照片或文字并重新渲染。这只需几秒钟。
8. 批准后:
- 将每个 JPG 复制到
<YOUR_VIDEO_FOLDER>/<Video> YYYY-MM-DD/Covers/,命名为类似 Reel 的名称(例如3. the exact close.jpg)。 - 在封面日志中为每个封面添加一条记录:
{"date":"YYYY-MM-DD","video":"<video-slug>","reel":"3. the exact close","photo":"<file>","layout":"stack","hook_type":"how","head":"the exact close I use on sales calls","file":"<Covers 文件夹中 jpg 文件的绝对路径>"} - 将这些文件交给您的排期步骤,由该步骤上传每个文件并将其附加到 Instagram 帖子。
唯一性规则
- 最近 9 个封面使用过的照片不得再次使用。
pick.py强制执行此规则。 - 连续两次不得使用相同的布局或钩子类型。
- 轮换副标题:无副标题、居中副标题、或右偏移并倾斜的副标题(
subdx、subrot)。 - 根据照片改变文字位置(顶部、中间、左对齐或右对齐)。不要总是居中在顶部。
- 如果照片库资源紧张(近期所有好照片都已使用),请说明情况并建议进行新的拍摄,而不是打破规则。
布局经验
- 9:16 裁剪会把人脸位置抬高。 大多数照片是 2:3 比例。缩放到 1920 高时,会裁掉两侧而非顶部,因此原始照片中看起来位置较低的面部会位于 y 600 到 800 左右。最常见的错误是文字压在拍摄对象的头发上。 在检查任何其他内容之前,请先仔细查看每张预览图。
- 使用
headroom修复,而不是缩小文字。"headroom": 150-350会将照片向下推,并在拍摄对象上方拉伸纯色背景区域。在纯色工作室背景上是不可见的。不要在复杂的户外背景(树木和天空会使背景模糊)上使用。 - 标题大小: 自动:4 个词或以下为 104px,更长时为 84px,会缩小以适应 3 行。
- 如果副标题会碰到头部,则放弃使用它。 它只是纹理,不是信息。
- 放置文字时要考虑 Reel 图标: 要么将文字块起始位置设为 y 560 或更低(用
headroom向下推照片以避开头部),要么保持在高位并使用align: left, right: 320。在整批封面中混合使用这两种方法。 - 3:4 网格裁剪图会隐藏 y 240 以上的所有内容。将文字起始位置保持在 280 或更低(
render.mjs会发出警告)。
添加照片
从本地文件夹添加: 使用 md5 检查 photos_dir 中是否有重复,将文件复制为 <name>-<k>__local<MMDD>.jpg,然后添加标签。
从 Canva 添加 (可选)。 Canva 不会直接从上传文件夹下载图片。一个可行的方案是使用一个仅用于导出的草稿设计:
- 对
<YOUR_CANVA_FOLDER_ID>执行list-folder-items,并将资源 id 与library.json中的进行比对(在每个文件名中__后保留 id)。 - 使用
open_transaction对<YOUR_CANVA_SCRATCH_DESIGN_ID>执行read-design,然后为每张新照片调用一次edit-design并附带add_page(2400x3600,标题 = 资源 id)。读取新的页面 id,然后为每个页面调用一次insert_fill(整页,top 0, left 0)。执行commit。 - 以 PDF 格式 导出设计,
export_quality: pro,然后运行pdfimages -j -f <第一页> -l <最后一页> -p all.pdf ex/img。PDF 会原样嵌入原始 JPEG。JPG 导出也可以,但会为每个页面提供一个 URL。 - 将每张图片保存为
<名称>__<assetid>.jpg到photos_dir中。多张照片可能共享同一个 Canva 名称,因此 id 用于区分它们。然后添加标签。
如果同一张照片上传了两次,保留一份并将其标记为 ok,另一份标记为 "ok": false, "note": "duplicate of N",否则不重复规则可能会选择同一张图片两次。
通过查看每张新文件,在 library.json 中为其添加标签:
{"file":"photo_-13.jpg","pose":"smiling at laptop","props":["laptop","desk"],"topics":["email","follow","systems","website"],
"cap":false,"space":["top"],"focus":"50% 55%","ok":true}
space 是文字可以放置而不触及面部的区域。将模糊、过暗或角度不好的照片标记为 "ok":false,而不是删除它们。
相关
video-reels:开头文字卡片,封面标题不得重复其内容。- 排期技能 (可选):上传封面并排期 Reel。