做内容运营的人都有过这种经历:一条视频要同时发 YouTube、Bilibili、小红书,三个平台的标题、描述、标签、封面文案风格完全不同。手动整理一份发布包至少要花半小时,而且每次都要重来。用 ChatGPT 做个 Skill,可以把这套重复流程固定下来:只要提供视频信息,AI 就按统一规则生成三套发布文案,整个发布包 5 分钟内就能产出。这篇文章会从 Skill 的概念讲起,逐步完成环境准备、目录搭建、脚本编写、运行验证和常见报错排查,最终得到一个可复用的多平台发布包生成器。
1. 先理解 Skill 在 ChatGPT/Codex 里的作用方式
1.1 Skill 是什么,解决什么问题
Skill 可以理解成“给 AI 的一份岗位手册”。它不是普通的提示词,而是一组包含说明文件、脚本、模板和资源的目录。AI 在收到任务时,会根据 Skill 的描述判断是否匹配,匹配后按照手册里定义的流程执行任务。
它的价值在于:把“如何生成一份发布包”这个完整流程固化下来。第一次手动写好规则后,之后每次调用都是同一套标准,不会出现这次写标题很夸张、下次写标题又很平的情况。对于需要稳定输出的内容运营场景,Skill 比单纯复制粘贴提示词可靠得多。
1.2 Skill 的运行位置和加载原理
不同客户端的 Skill 目录格式会有差异,下面以常见的 Codex 系环境为例。Skill 通常放在用户目录下的.codex/skills中,每个 Skill 是一个独立目录,目录里至少要有一个SKILL.md描述文件。
目录结构大致如下:
~/.codex/skills/ └── content-publisher/ ├── SKILL.md ├── scripts/ │ └── generate_package.py └── assets/ └── templates/ ├── youtube.md ├── bilibili.md └── xiaohongshu.md当用户在对话中提出“生成发布包”这类需求时,AI 会扫描 Skill 目录,查看每个SKILL.md中的description字段。如果描述与当前任务匹配,AI 就会加载对应 Skill,并按照SKILL.md中的指引读取脚本和模板。
注意:不同版本的 ChatGPT 桌面版和 Codex CLI 对 Skill 的加载方式可能不同。落地前先确认自己所用版本的官方文档,避免路径写错。
1.3 Skill 的边界:哪些任务适合做成 Skill
不是所有任务都适合做 Skill。适合做成 Skill 的任务通常有这些特征:
- 输出结构固定,比如标题、描述、标签、封面文案。
- 操作流程重复,比如每次都要读取输入文件、渲染模板、输出结果。
- 规则可以写成文字或代码,不依赖实时外部数据。
- 结果可以被检查,比如生成后直接打开文件确认。
不适合做成 Skill 的场景包括:需要频繁获取实时热点、依赖用户高度个性化偏好、需要长时间人工审核判断的内容。下面是适合与不适合的对比表格。
| 任务类型 | 是否适合 | 原因 |
|---|---|---|
| 生成三平台发布文案 | 适合 | 模板明确,步骤重复 |
| 自动剪辑视频并导出 | 不适合 | 涉及复杂逻辑和资源依赖,Skill 不适合承载 |
| 根据热点新闻写短评 | 不适合 | 需要实时信息,固定流程反而限制质量 |
| 将视频信息转录为周报 | 适合 | 输入输出固定,规则清晰 |
2. 环境准备和 Skill 目录结构
2.1 准备环境与工具
要跑通这套发布包生成 Skill,需要准备以下环境。
| 工具 | 版本建议 | 用途 |
|---|---|---|
| ChatGPT 桌面版或 Codex CLI | 支持 Skill 机制的最新版本 | 运行 AI 并加载 Skill |
| Python | 3.9 及以上 | 执行模板渲染脚本 |
| 本地终端 | 系统自带即可 | 创建目录、运行脚本 |
| git | 可选 | 管理 Skill 和输出结果 |
还需要确认 Codex CLI 可执行文件已经安装,并且可以被 ChatGPT 桌面版找到。具体的排查方式在后面的报错章节会展开。
2.2 创建 Skill 目录
打开终端,执行下面的命令创建 Skill 目录。这里把 Skill 命名为content-publisher,表示“内容发布包生成器”。
mkdir -p ~/.codex/skills/content-publisher/scripts mkdir -p ~/.codex/skills/content-publisher/assets/templates创建后可以查看目录结构:
find ~/.codex/skills/content-publisher -type f -o -type d目录用途如下:
SKILL.md:Skill 的核心描述,写清楚触发条件和使用步骤。scripts/:存放生成脚本,比如渲染模板的 Python 文件。assets/templates/:存放不同平台的文案模板。
2.3 设计三平台发布包模板
不同平台的文案规则差异很大,模板必须按照平台特点设计。
| 平台 | 标题长度 | 标签数量 | 描述风格 | 封面文案 |
|---|---|---|---|---|
| YouTube | 60 字符内 | 10~15 个 | 前两行写核心信息,适合搜索 | 大字加对比色 |
| Bilibili | 25 字左右 | 5~10 个 | 互动感强,带话题活动 | 吸引点击但不夸张 |
| 小红书 | 20 字左右 | 5~8 个 | 口语化,带 emoji 和话题词 | 封面需突出利益点 |
这些规则会写进模板文件里。模板文件使用 Markdown 格式,并在关键位置预留变量,例如:
# {title} ## 描述 {description} ## 标签 {tags} ## 封面文案 {cover_text}三个模板文件分别命名为youtube.md、bilibili.md、xiaohongshu.md,后续脚本会读取这些模板并替换变量。
3. 编写发布包生成 Skill
3.1 编写 SKILL.md 描述文件
SKILL.md是 Skill 的入口,包含两部分:YAML frontmatter 和正文说明。frontmatter 里的name与description最重要,description决定了 AI 是否会加载这个 Skill。
在~/.codex/skills/content-publisher/SKILL.md中创建以下内容:
--- name: content-publisher description: 根据用户提供的视频信息,生成 YouTube、Bilibili、小红书三个平台的发布包,包括标题、描述、标签、封面文案和发布时间建议。 --- # Content Publisher Skill 这个 Skill 用于把视频信息转换为多平台发布文案。 ## 输入 - `video.json` 文件,包含视频标题、核心主题、目标观众、关键词、视频时长、卖点等信息。 - 或者直接在对话中提供上述信息,由 AI 整理成 JSON。 ## 执行步骤 1. 读取输入文件 `video.json`。 2. 根据 `assets/templates/` 下的模板渲染三个平台文件。 3. 将结果输出到 `output/` 目录。 4. 输出文件名为 `youtube.md`、`bilibili.md`、`xiaohongshu.md`。 ## 注意事项 - 标题不要重复使用同一种句式。 - 描述中不要出现“AI 生成”等字样,除非用户要求。 - 标签使用半角逗号分隔。 - 输出文件使用 UTF-8 编码。这里的description要写清楚“什么时候用”,AI 才能准确匹配。不要写得太宽泛,比如“处理内容”这种描述会让 AI 无法判断。
3.2 设计输入数据 video.json
为了让脚本稳定运行,输入最好使用 JSON 文件,而不是让 AI 从对话里自由提取。下面是一个示例video.json:
{ "video_title": "我用 Python 自动抓取天气数据并生成可视化大屏", "core_topic": "Python 爬虫与数据可视化入门", "target_audience": "Python 初学者、数据分析师", "keywords": ["Python", "爬虫", "数据可视化", "天气数据", "大屏"], "video_duration": "12:30", "selling_points": [ "不需要复杂环境", "20 行代码搞定数据抓取", "可视化大屏模板可直接复用" ], "platform_preference": "all" }字段说明如下表:
| 字段 | 含义 | 是否必填 |
|---|---|---|
| video_title | 视频原始标题 | 必填 |
| core_topic | 视频核心主题 | 必填 |
| target_audience | 目标受众 | 建议填写 |
| keywords | 内容关键词数组 | 建议填写 |
| video_duration | 视频时长 | 可选 |
| selling_points | 卖点数组 | 建议填写 |
| platform_preference | 指定只生成某个平台 | 可选,默认 all |
有人会问,为什么不直接在对话里说“帮我写三平台发布文案”,让 AI 自己发挥?因为脚本更适合处理固定规则。比如标签数量、标题长度限制、封面文案格式,这些逻辑写进代码后,AI 只需要提供创意内容,脚本负责结构化和落地,结果更可控。
3.3 编写模板渲染脚本 generate_package.py
在scripts/generate_package.py中编写核心生成逻辑。这个脚本会读取video.json,遍历assets/templates/下的模板,渲染后输出到output/。
下面是一个最小可运行的 Python 脚本:
import argparse import json from pathlib import Path def load_templates(template_dir: Path) -> dict: templates = {} for file_path in template_dir.glob("*.md"): templates[file_path.stem] = file_path.read_text(encoding="utf-8") return templates def render_template(template: str, data: dict) -> str: result = template result = result.replace("{title}", data["title"]) result = result.replace("{description}", data["description"]) result = result.replace("{tags}", data["tags"]) result = result.replace("{cover_text}", data["cover_text"]) return result def build_platform_data(video_data: dict) -> dict: title = video_data["video_title"] keywords = video_data.get("keywords", []) selling_points = video_data.get("selling_points", []) youtube_description = ( f"本期视频讲解:{video_data['core_topic']}\n\n" f"视频时长:{video_data.get('video_duration', '未知')}\n" f"适合人群:{video_data.get('target_audience', '不限定')}\n" ) if selling_points: youtube_description += "\n本期亮点:\n" for point in selling_points: youtube_description += f"- {point}\n" bilibili_description = ( f"这个视频带你了解 {video_data['core_topic']}。" f"如果你也在学相关技术,欢迎在弹幕里交流。" ) if selling_points: bilibili_description += " 看完你会掌握:" + ",".join(selling_points) xiaohongshu_description = ( f"分享一个关于 {video_data['core_topic']} 的实用方法," f"特别适合 {video_data.get('target_audience', '感兴趣的伙伴')}。" ) return { "youtube": { "title": title, "description": youtube_description, "tags": ", ".join(keywords[:15]), "cover_text": "Python天气大屏", }, "bilibili": { "title": title[:25], "description": bilibili_description, "tags": " ".join(keywords[:10]), "cover_text": "20行代码搞定", }, "xiaohongshu": { "title": title[:20], "description": xiaohongshu_description, "tags": " ".join(keywords[:8]), "cover_text": "Python入门必备", }, } def main(): parser = argparse.ArgumentParser(description="生成多平台发布包") parser.add_argument("--input", type=Path, required=True, help="video.json 路径") parser.add_argument("--output", type=Path, default=Path("output"), help="输出目录") args = parser.parse_args() video_data = json.loads(args.input.read_text(encoding="utf-8")) templates = load_templates(Path(__file__).parent.parent / "assets" / "templates") platform_data = build_platform_data(video_data) args.output.mkdir(parents=True, exist_ok=True) for platform, data in platform_data.items(): if "all" in video_data.get("platform_preference", "all") or platform == video_data.get("platform_preference"): content = render_template(templates[platform], data) output_file = args.output / f"{platform}.md" output_file.write_text(content, encoding="utf-8") print(f"生成完成: {output_file}") if __name__ == "__main__": main()脚本的关键点有三个:
load_templates自动读取assets/templates/下所有.md文件,后续新增平台模板时不需要改脚本。build_platform_data根据平台特点生成不同风格的 description 和标签格式。render_template通过字符串替换,把模板里的变量替换成实际内容。
这个脚本没有依赖第三方库,使用 Python 标准库即可运行,适合入门和二次修改。
3.4 一键生成三个平台发布包
在 Skill 根目录下创建output目录,并运行脚本:
cd ~/.codex/skills/content-publisher python3 scripts/generate_package.py --input video.json --output output/如果一切正常,终端会输出类似下面的信息:
生成完成: output/youtube.md 生成完成: output/bilibili.md 生成完成: output/xiaohongshu.md打开output/youtube.md,可以看到类似这样的内容:
# 我用 Python 自动抓取天气数据并生成可视化大屏 ## 描述 本期视频讲解:Python 爬虫与数据可视化入门 视频时长:12:30 适合人群:Python 初学者、数据分析师 本期亮点: - 不需要复杂环境 - 20 行代码搞定数据抓取 - 可视化大屏模板可直接复用 ## 标签 Python, 爬虫, 数据可视化, 天气数据, 大屏 ## 封面文案 Python天气大屏到这里,一个最小的发布包生成闭环已经完成。接下来要解决的是如何让 ChatGPT 或 Codex 自动调用这套流程。
4. 运行验证:让 ChatGPT/Codex 调用 Skill 并检查产物
4.1 在 Codex 中让 AI 加载 Skill
启动 Codex 后,在对话里输入类似这样的指令:
使用 content-publisher skill,读取 video.json,生成三个平台的发布包。AI 读取到content-publisher这个 Skill 名后,会打开~/.codex/skills/content-publisher/SKILL.md,然后按照里面的步骤执行。如果 AI 没有自动找到 Skill,可以尝试在提示词里把SKILL.md的绝对路径指出来:
请阅读 ~/.codex/skills/content-publisher/SKILL.md,然后按照说明处理 video.json。如果当前环境没有 Skill 自动扫描机制,也可以复制SKILL.md的正文到系统提示词中,但这样会失去复用性,不推荐作为长期方案。
4.2 检查生成结果的质量
自动脚本只是把文案结构搭出来,最终发布前需要人工检查。下面是发布包的质量检查清单。
| 检查项 | 要求 |
|---|---|
| 标题长度 | YouTube 不超过 60 字符,B 站不超过 25 字,小红书不超过 20 字 |
| 标签数量 | YouTube 10~15 个,B 站 5~10 个,小红书 5~8 个 |
| 描述开头 | 前两行必须包含核心关键词 |
| 封面文案 | 是否突出卖点,是否和视频封面图匹配 |
| 平台规范 | 是否符合各平台社区规范,不包含违规信息 |
| 编码格式 | 文件为 UTF-8,不会出现乱码 |
如果发现某个平台标题被截断后语义不完整,需要调整模板或原视频标题,不要只依赖脚本截断。
4.3 学习环境与生产环境的差异
在学习环境里,把脚本跑通就算完成。但进入生产环境,还需要考虑下面几件事。
| 项目 | 学习环境 | 生产环境 |
|---|---|---|
| 输入管理 | 手动创建 video.json | 接入选题库或待发布视频清单 |
| 版本管理 | 不关心历史版本 | 使用 git 管理模板、脚本和输出 |
| 结果审核 | 看一眼文件 | 设置人工审核节点,至少检查一次 |
| 日志 | 没有日志 | 记录每次生成的输入、输出和异常 |
| 配置 | 路径写死 | 目录路径、平台偏好等通过配置传入 |
| 回滚 | 不需要 | 使用 git 标签或归档目录保存历史发布包 |
生产环境的 Skill 不应该是一个“黑盒”。如果 AI 生成结果出现偏差,要能快速定位是模板问题、脚本问题还是输入数据问题。
5. 常见启动与配置报错排查
5.1 ChatGPT 启动时提示 unable to locate the codex cli binary
现象:ChatGPT 桌面版启动时弹出错误提示,内容类似:
ChatGPT failed to start. Unable to locate the Codex CLI binary. Set CODEX_CLI_PATH or ensure the electron resources include bin/codex.可能原因:
- Codex CLI 没有安装。
- Codex CLI 已经安装,但 ChatGPT 桌面版没有找到它。
- 环境变量
CODEX_CLI_PATH未设置或指向错误路径。
检查方式:
which codex echo $CODEX_CLI_PATH如果没有输出,说明需要先安装 Codex CLI,或设置环境变量。可以执行:
export CODEX_CLI_PATH=/usr/local/bin/codex然后重启 ChatGPT 桌面版。如果路径不对,需要把CODEX_CLI_PATH改成实际的可执行文件路径。
注意:不要为了绕过报错随意修改 electron 内部文件。优先安装或升级 Codex CLI,并确保环境变量正确。
5.2 无法加载 config.toml 导致对话无法继续
现象:ChatGPT 或 Codex 启动后提示:
无法加载 config.toml,因此此对话串无法继续。请修复 config.toml。这类错误常见于~/.codex/config.toml文件格式错误或其中声明的 model 无法识别。检查方式:
cat ~/.codex/config.toml一个最小可用的config.toml示例:
model = "gpt-5"如果原配置文件里有无法解析的字段,可以先备份,再简化配置:
cp ~/.codex/config.toml ~/.codex/config.toml.bak然后只保留必要的 model 配置,重新启动客户端。
在修复之前,建议先确认当前 Codex 版本支持哪些模型字段,避免把不存在的模型名写进配置。
5.3 Skill 没有被识别
现象:对话中让 AI 使用某个 Skill,但 AI 没有加载,或者提示找不到。
可能原因:
- Skill 目录不在
~/.codex/skills/下。 SKILL.md缺少 YAML frontmatter。description描述与实际任务不匹配。- 会话没有重启,AI 没有重新扫描目录。
排查顺序:
# 1. 确认目录存在 ls -la ~/.codex/skills/content-publisher/ # 2. 确认 SKILL.md 开头有 --- 包裹的 frontmatter head -10 ~/.codex/skills/content-publisher/SKILL.md # 3. 在当前会话中重新描述任务,检查 AI 是否加载如果使用的是旧版客户端,可能不支持自定义 Skill。这时可以先通过命令行 Codex 验证,再确认桌面版版本是否匹配。
6. 最佳实践和扩展方向
6.1 给 Skill 加缓存、记忆和版本管理
发布包生成 Skill 第一次跑通后,可以继续完善。一个很实用的改进是给输出目录做版本管理:
cd ~/.codex/skills/content-publisher git init git add . git commit -m "feat: 初始化 content-publisher skill"每次修改模板或脚本后,通过 git diff 可以看到具体改动,方便回滚。还可以在SKILL.md中记录历史备注,避免 AI 下次生成时遗忘之前约定的规则。
另一个改进方向是缓存平台上的历史爆款标题格式。可以将常见的标题句式放在assets/examples/目录中,并在SKILL.md中要求 AI 参考这些句式,但不直接复制。
6.2 扩展更多平台和定时发布
当前脚本只生成三个平台。如果要扩展抖音、Twitter/X 或微信公众号,只需在assets/templates/中新增对应模板,并在build_platform_data中增加平台字段即可。
如果需要定时生成发布包,可以把脚本接入 cron 或 GitHub Actions。比如每天读取当天的选题列表,批量生成发布包,并提交到指定目录。这样团队协作时,运营人员只需要维护video.json,不需要手工复制文案。
下面是一个 cron 配置示例,每天上午 9 点生成当天发布包:
0 9 * * * cd ~/.codex/skills/content-publisher && python3 scripts/generate_package.py --input video.json --output output/6.3 安全与合规建议
发布包生成涉及账号内容,使用时要遵守平台规则。
- 不要把账号 API Key、Cookie 或内部链接写进 Skill 模板。
- 不要在
video.json中保存敏感用户数据。 - 生成结果发布前需要人工审核,尤其是涉及医疗、金融、政治等敏感话题。
- 如果 Skill 要提交到团队仓库,先检查模板里是否有内部术语或跳转链接。
- 使用脚本自动化时,保留人工复审环节,避免“全自动发布”导致账号风险。
最后想说的是,Skill 的真正价值不是“让 AI 写一段文案”,而是把重复性的内容生产流程变成可复用、可版本化、可排查的标准步骤。先从三平台发布包这个小场景开始,跑通后再把选题、审核、定时发布慢慢加进去,你会看到这套机制在内容运营中的实际收益。