关于 content-ideas
content-ideas 是面向内容创作者的营销 Skill,定期整理社交内容表现。它将已追踪账号的帖子与细分领域新发现合并为可筛选的 HTML 信息流,并根据反馈个性化后续创意。
主要功能
- 01按日期保存每日调研
- 02抓取已追踪创作者的社交内容
- 03评估帖子表现并发现细分领域异军
- 04提供含 Posts 和 Ideas 标签页的可筛选 HTML 信息流
- 05利用反馈个性化后续创意
适用场景
- 01查看竞品帖子和细分领域趋势
- 02根据互动表现寻找内容创意
- 03归档每日调研记录
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ bradautomates/ content-ideas --skill content-ideas安装后在 Claude Code 中输入/content-ideas确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/for-you-template.htmlreferences/content-strategy.mdscripts/generate_feed.pyscrape.pyscripts/lib/__init__.pyanalyze.pydates.pyenv.pyhttp.pyinstagram.pylog.pypipeline.pyplatforms.pyrelevance.pyscoring.pytiktok.pyurls.pyx.pyyoutube.py详细介绍
content-ideas
你的「为你推荐」页面。抓取你关注的创作者发布内容的所有平台,对表现进行评分,并将其转化为可付诸行动的内容创意。
此工具专为每日运行而设计——每次运行都会在 $CONTENT_HOME/research/ 下创建带日期的内容流。
输出是一个独立的 HTML 页面(包含两个选项卡:Posts——一个可排序、可筛选的内容流,汇总关注账号的帖子和发现的细分领域热门内容;以及 Ideas),你可以在浏览器中打开、做出反馈并保存。系统会记录反馈,用于今后的个性化推荐。
确定技能目录
此技能运行的所有内容都位于其自身文件夹中。此技能在 Claude Code 和 Codex 中的安装方式相同,因此请先在两个插件缓存目录(以及普通的仓库检出目录)中解析 SKILL_DIR,再执行其他操作:
# 1) Codex plugin cache, or a repo cloned into ~/.codex/skills/ (latest wins on upgrade).
SKILL_DIR="$(ls -d "$HOME/.codex/plugins/cache/"*/content-ideas/*/skills/content-ideas/ "$HOME/.codex/skills/"*/skills/content-ideas/ 2>/dev/null | sort -V | tail -1)"
SKILL_DIR="${SKILL_DIR%/}"
# 2) Claude Code plugin cache.
if [ -z "$SKILL_DIR" ] || [ ! -f "$SKILL_DIR/scripts/scrape.py" ]; then
CLAUDE_ROOT="$(ls -d "$HOME/.claude/plugins/cache/content-ideas/content-ideas/"*/ 2>/dev/null | sort -V | tail -1)"
CLAUDE_ROOT="${CLAUDE_ROOT%/}"
[ -n "$CLAUDE_ROOT" ] && [ -f "$CLAUDE_ROOT/skills/content-ideas/scripts/scrape.py" ] && SKILL_DIR="$CLAUDE_ROOT/skills/content-ideas"
fi
# 3) Plugin root passed by the host, or a repo checkout / local dev.
if [ -z "$SKILL_DIR" ] || [ ! -f "$SKILL_DIR/scripts/scrape.py" ]; then
for dir in "${CLAUDE_PLUGIN_ROOT:-}/skills/content-ideas" "${CLAUDE_PLUGIN_ROOT:-}" "${GEMINI_EXTENSION_DIR:-}/skills/content-ideas" "./skills/content-ideas" "."; do
[ -n "$dir" ] && [ -f "$dir/scripts/scrape.py" ] && SKILL_DIR="$dir" && break
done
fi
echo "$SKILL_DIR"
如果你已经能看到此文件的路径,直接使用其所在目录即可。你将调用的两个脚本是 $SKILL_DIR/scripts/scrape.py 和 $SKILL_DIR/scripts/generate_feed.py。渲染器模板位于 $SKILL_DIR/assets/for-you-template.html(生成器会自动找到它)。
确定内容目录
此技能读取和写入的所有持久文件——brand/ 资料和带日期的 research/ 运行记录——都存放在同一个稳定的基目录下,绝不会放在当前工作目录中。此技能每天运行,且可能从任何位置调用,因此每次都必须使用相同的基目录,否则就会丢失资料和运行历史。请一次性确定该目录并记录其具体路径:
CONTENT_HOME="${CONTENT_HOME:-$HOME/Documents/Content}"
mkdir -p "$CONTENT_HOME/brand" "$CONTENT_HOME/research"
echo "$CONTENT_HOME"
在本指南中,所有 brand/... 和 research/... 路径都相对于 $CONTENT_HOME(因此 brand/profile.md 表示 $CONTENT_HOME/brand/profile.md)。
对这些文件进行任何读取或写入时,都使用打印出的绝对路径——文件工具不会展开 shell 变量,因此直接写入 brand/profile.md 会将文件放到错误的目录。(凭据单独存放在 ~/.config/content/.env。)抓取和生成脚本会自行读取 CONTENT_HOME,因此传给它们的相对路径 research/{today} 也会在此目录下解析。
步骤 0:首次运行设置
无论用户是否提供了主题,都要先执行此步骤。 检查 ~/.config/content/.env 是否存在且包含 SETUP_COMPLETE=true,以判断是否为首次运行。静默检查。如果已经完成设置,则跳到步骤 1。
0a. 欢迎语 + API 密钥
设置分为三个简单部分:API 密钥、你的资料(根据你自己的频道建立),以及你想要关注的竞争对手。只有密钥是必需的——其余内容由此技能为你自动建立,你也可以随时完善。无需安装任何内容;一个 ScrapeCreators API 密钥即可用于全部四个平台:X、Instagram、TikTok 和 YouTube(包括转录文本)。
将以下内容作为普通消息显示,然后调用 AskUserQuestion(不要在弹窗中重复欢迎语):
我会将你的社交影响力转化为每日「为你推荐」内容流:根据你自己的频道建立资料,关注你选择的竞争对手,并将表现出色的内容转化为有真实互动数据支撑的内容创意。我只需要一个 ScrapeCreators API 密钥(一个密钥适用于全部四个平台;包含 100 次免费调用,无需银行卡)。
AskUserQuestion——“添加 ScrapeCreators API 密钥?”
- 打开 scrapecreators.com 获取免费密钥
- 我现在粘贴密钥
- 暂时跳过
如果用户选择“打开 scrapecreators.com”,运行 open https://scrapecreators.com,然后请他们粘贴密钥。用户粘贴密钥后,写入 ~/.config/content/.env(创建目录;追加内容,不要覆盖其他密钥):
SCRAPECREATORS_API_KEY={key}
SETUP_COMPLETE=true
如果用户跳过,只写入 SETUP_COMPLETE=true。
0b. 手动设置
如果用户更愿意手动配置,告诉他们将这两行添加到 ~/.config/content/.env。如果他们在此处粘贴密钥,可提出代为写入该文件。
0c. 构建你的品牌档案
这是个性化所有内容的关键:将创意结合你的细分领域、内容支柱和目标进行构思,并对照你已发布的内容进行检查。根据用户自己的线上内容来构建档案,而不是让他们填写冗长的问卷。
询问他们自己的社交账号(AskUserQuestion:“现在设置你的档案吗?” → 我会提供我的账号 / 跳过——我之后再添加)。他们提供账号后——可自由填写任意平台的账号(X 上的 @me、YouTube 频道、TikTok 账号等)——将其规范为 {platform: [handle]} 格式,并像抓取竞争对手账号一样抓取,不过时间范围要大得多(--days 90,最大值),这样你就能根据完整一个季度的内容来描述他们的创作,而不仅仅是近期帖子:
python3 "$SKILL_DIR/scripts/scrape.py" \
'{"x": ["me"], "youtube": ["@mychannel"]}' \
--pillars "" --days 90
根据返回的帖子(以及评论/文字稿)起草档案:
- 细分领域、受众、语气说明——根据反复出现的话题、表达方式和语气进行推断。
- 内容支柱——其帖子实际聚集成的 3–5 个主题。这些内容支柱将在今后的每次运行中用于
--pillars,因此务必准确。 - 我的社交档案——根据抓取结果,记录各平台的账号、关注者数量、简介,以及一行内容风格说明。
- 目标平台/研究渠道——他们活跃的平台。
- 搜索词——从他们的热门话题中提取的具体关键词。
有两项内容无法通过抓取获取——需要询问(AskUserQuestion),然后将回答纳入档案:
- 内容目标——他们发布内容的原因(获取潜在客户/提升认知度/增长/思想领导力/销售等)、引流渠道,以及正在推广的内容。
- 内容支柱确认——展示推断出的 3–5 个内容支柱,让他们在写入前进行编辑或确认。
按照 FILE-SCHEMAS.md 中的架构编写 brand/profile.md。如果抓取到的本人帖子足够多,还要创建初始的 brand/my-content.md(涵盖表现总结、有效内容、涉及的话题,以及从评论中提炼出的受众需求)——这从第一天起就能用于避免内容重复,并展示“你的受众正在询问”横幅。
如果他们跳过了(或还没有可用于抓取的 API 密钥),不要因此停下:通过 2–3 个问题的问答(细分领域、大致的内容支柱、目标)创建精简版 brand/profile.md,说明之后使用 API 密钥重新运行设置会自动补充档案,然后继续。
0d. 跟踪竞争对手
询问他们想跟踪哪些账号(AskUserQuestion:现在列出/跳过并使用示例)。如果他们列出账号,请按照插件中 FILE-SCHEMAS.md 的架构创建 brand/tracked-accounts/{platform}.md 文件。如果他们跳过,则运行一个小示例,让他们了解格式,并告知他们之后可以添加真正的竞争对手。
首次设置到此结束。 然后继续处理用户的原始请求。
第 1 步:加载上下文
1a. 将上次运行的反馈纳入品味记忆
首先,将上次运行的反馈纳入记忆——这正是每次运行都比上次更好的原因。列出
$CONTENT_HOME/research/ 中日期格式为 YYYY-MM-DD 的子文件夹,并选择最近的一个。如果其中有
feedback.json,请读取并将 reviews[] 中的每条反馈(▲“多来点这样的”/▼“少来点”/备注)提炼为可泛化的品味信号,而不是个别情况:
- “▲ 用户对其细分领域的三个逆向观点都表示赞赏” → “倾向于逆向观点”;“▼ 不喜欢清单式文章” → “清单式文章不合其意。”备注往往会直接说明原因——请据此处理。
- 将这些内容记录到项目记忆中(你维护的自动记忆),作为用户的内容品味——与 1b 回顾内容相同。更新已有的品味记录,而不是重复添加;单条 ▼ 反馈只能作为参考,不应推翻已确立的偏好。不要记录没有形成规律的个别反馈、
brand/profile.md中已显而易见的内容,或具体帖子/运行情况(这些内容保存在research/中)。只记录品味。
如果没有之前的日期文件夹、没有 feedback.json,或其中没有任何反馈,则静默跳过。如果此环境中无法使用自动记忆,也请跳过——这些反馈会留在 feedback.json 中,等到可用时再处理。(本次运行的反馈将由下次运行以相同方式纳入;运行结束时无需进行提炼。)
1b. 回顾品味并加载品牌背景
读取现有的品牌背景(均为可选——请灵活处理):
brand/profile.md— 细分领域、内容支柱、搜索词、内容目标、受众brand/tracked-accounts/*.md— 各平台的跟踪创作者brand/my-content.md— 用户自己的内容表现及受众需求
回顾用户的内容品味。 此技能会在项目记忆中存储不断完善的品味档案(你维护的自动记忆)。生成创意前,请回想你对该用户偏好的了解——偏好的主题、形式、角度、反复收藏的创作者,以及哪些内容不合其意。如果相关的品味信号已出现在上下文中,请加以利用;如果没有,且记忆可用,请查找标记为此技能的品味记录。这是最重要的个性化输入:互动数据衡量的是受众喜欢什么,品味记忆衡量的是用户本人喜欢什么。如果无法使用自动记忆,请仅依据互动数据(如有 brand/my-content.md,也请参考)。
如果没有跟踪账号,也没有主题筛选条件,请先询问账号名称或主题,再开始抓取。
1c. 更新你自己的内容(my-content.md)
在生成创意之前,先更新 brand/my-content.md——这是 Step 0c 一次性构建的每次运行对应版本,也是随着用户持续发布内容,确保避免自我竞争并如实呈现“你的受众正在询问”横幅的关键。(my-content.md 在 FILE-SCHEMAS.md 中声明为每次运行都更新;这一步负责更新它。)
从刚刚加载的 brand/profile.md 中的 ## My Social Profiles 部分获取用户自己的账号名称,将其规范化为 {platform: [handle]} 格式,然后用足够宽的时间范围重新抓取,以覆盖用户自己的发布频率(--days 30——创作者自己的帖子比合并后的竞品信息流更稀疏,但仍要保持“近期”,而不是 Step 0c 中 90 天的个人资料构建范围):
python3 "$SKILL_DIR/scripts/scrape.py" \
'{"x": ["me"], "youtube": ["@mychannel"]}' \
--pillars "<pillars from profile.md>" --days 30
抓取工具已经会获取热门帖子的评论,因此返回的数据包含所需的受众回复。根据 FILE-SCHEMAS.md 中的架构,用这些数据重写 brand/my-content.md(表现摘要、哪些内容有效/无效、涵盖的主题,以及从评论中提炼的受众需求)——这是替换,不是追加。在本次运行的后续步骤中,使用这个新版本,而不是你在 1b 中读取的副本。
尽力而为——绝不阻塞信息流。 如果 profile.md 中没有用户自己的账号名称(用户跳过了个人资料设置),或者抓取没有返回内容或出错,则保留现有的 my-content.md 并继续。这次更新用于丰富内容,不是必经关卡。
Step 2:创建每日运行文件夹
列出 $CONTENT_HOME/research/ 中现有的日期子文件夹(YYYY-MM-DD)。最新的、不是今天的文件夹日期就是上次运行日期——在 Step 3 中将其作为 --since 传入,这样抓取只会保留该日期及之后的帖子。如果没有之前的日期文件夹,则不传入 --since。
无论哪种情况,抓取工具都会强制执行近期窗口,确保每日信息流不会显示过时帖子:默认只保留最近 7 天(--days)。--since 只能缩小该窗口,不能扩大它——因此,默认情况下,首次运行和长时间间隔后的运行都限制在一周内。(脚本的硬性上限为 90 天;每日信息流应保持较短,最多一个月。90 天窗口用于 Step 0c 的一次性个人资料构建,而非每日信息流。)
创建 $CONTENT_HOME/research/{today}/。
如果 $CONTENT_HOME/research/{today}/feed-data.json 已存在,询问用户是否要:
- 刷新——重新抓取并重建(复用相同的
--since/--days) - 扩展——扩大时间窗口:移除
--since和/或调高--days(信息流保持在约 30 天以内),适用于用户想查看更多内容而非仅查看最近一周的情况 - 查看——仅(重新)打开现有信息流(跳至 Step 6)
Step 3:抓取竞品
构建一个 JSON 对象,将各个平台映射到其已跟踪的账号名称。通过 --pillars 传入内容支柱(来自 brand/profile.md,或用户的细分领域/主题),以便脚本评估相关性;同时通过 --since 传入上次运行日期。除非用户要求更宽的时间窗口,否则让 --days 保持默认值(7);如果用户要求,则调高(最多 31)。
python3 "$SKILL_DIR/scripts/scrape.py" \
'{"x": ["h1","h2"], "instagram": ["h3"], "youtube": ["@h4"]}' \
--pillars "<the user's content pillars>" \
--since 2026-04-15 \
--days 7
告知用户这需要几分钟;进度会输出到 stderr。脚本会并行获取所有账号的内容,丢弃近期窗口之外的内容,评估互动度和相关性,标记异常表现内容,并获取热门帖子的评论/文字稿。返回内容如下:
{ "results": { "x": { "h1": [ {post}, ... ] } }, "errors": [] }
每篇帖子都包含 text、url、author、date、platform、engagement、score(加权)、relevance(相对于内容支柱的 0–1 相关性)、baseline(该账号平均值的 N 倍)、outlier(布尔值);热门帖子还包含 comments / transcript。
**出错时:**报告失败的账号,并使用已返回的内容继续。
临时任务:按 URL 获取特定帖子
当用户提供特定帖子的 URL(例如竞品的热门帖子或用户看到的链接)时,使用 URL 模式,而不是个人资料模式。它会返回形状相同的扁平 [post] 数组:
python3 "$SKILL_DIR/scripts/scrape.py" urls "https://x.com/u/status/1" "https://www.tiktok.com/@u/video/2" --pillars "..."
步骤 4:审查评分后的数据
脚本会预先计算 score、baseline、relevance 和 outlier。
找出表现最佳的帖子,以及推动互动的主题/话题/切入角度,尤其是相关性较高的内容。这些是 Ideas 标签页的原始素材。
步骤 5:构建信息流
两个标签页。展示的所有内容都已证明能带来互动。构建一个 FEED_DATA 对象并将其写入文件(步骤 6)。字段结构详见插件的
FILE-SCHEMAS.md(feed-data.json)。
标签页 1 — 帖子。 一个扁平的 posts[] 数组,合并两个来源,形成一个可排序、可筛选的信息流(页面会在客户端处理排序和分组——不要预先排序或分组):
-
已追踪账号的帖子 — 已追踪账号发布的所有帖子(不设互动门槛)。根据账号基准设置
performance/performanceDirection(例如"+210% vs baseline"、"up")。 -
发现的细分领域异常值 — 统计异常值(
outlier: true、z-score 达 2+,或高于基准 2 倍以上)。设置zScore和一行why说明。无论来源如何,每篇帖子都要提供:1–3 句话的
text摘要、url、handle+displayName(创作者筛选器)、platform、engagement对象、值得关注时的吸引点说明,以及让信息流正常运作的两个字段——timestamp(ISO 8601 格式,用于 Recent 排序和相对时间显示)和sortValue(互动/触达总量的数值,用于默认的 Popular 排序)。只要帖子有zScore或performanceDirection: "up",就会被标记为异常值(徽章和强调色条的强度会随数值变化)——因此,表现超过账号基准的已追踪帖子也会显示为异常值。
标签页 2 — Ideas。 唯一可以加入编辑观点的地方(请标注为 AI 建议)。最多生成 10 条 Ideas,每条都要包含:具体且有差异化的切入角度、来自竞争对手表现的真实证据,以及与竞争对手已有内容之间明确的差异。
关于内容创作——将主题转化为有差异化的切入角度、撰写吸引点、判定漏斗阶段(TOFU/MOFU/BOFU)、匹配 CTA、跨平台改编以及生成完整简报——请阅读
references/content-strategy.md。构建此标签页时,请牢记以下简要原则:
- 打造你自己的版本,绝不重新包装。 好的切入角度至少能回答以下一个问题:你知道哪些原作者不知道的内容(专业知识)?你做过哪些受众尚未见过的事(独特经历)?或者你在哪些方面持不同意见(反主流观点)?
- 避免内容内耗。 如果存在
brand/my-content.md,除非切入角度确实有差异化(内容更深入、格式不同、提供更新,或回应反馈),否则不要重新推荐用户已经涉及的主题。请明确注明之前涉及过该主题。 - 优先考虑自有受众需求。 用户自己的受众提出的需求(见
brand/my-content.md)优先于竞争对手的信号——应在简报的“为何现在”部分重点突出。 - 依据偏好记忆筛选。 与步骤 1 记录的偏好信号相符的 Idea(该用户偏好的主题/格式/切入角度),比仅凭互动数据支撑的 Idea 更值得优先考虑,也值得点明(“这符合你反复关注的一种模式”)。反过来,应降低符合已记录的“效果不好”信号的内容的优先级。
第 6 步:写入并打开信息流
将信息流数据写入 $CONTENT_HOME/research/{today}/feed-data.json——这是一个包含
meta、posts、ideas 键的 JSON 对象(参见 FILE-SCHEMAS.md)。
不要自行编写 HTML;生成器会将此 JSON 嵌入模板。
然后渲染。默认使用实时服务器(用户可以对条目作出反应,这些反应会保存到 feedback.json,用于未来的个性化设置):
python3 "$SKILL_DIR/scripts/generate_feed.py" "$CONTENT_HOME/research/{today}"
这会启动本地服务器,并自动在用户的默认浏览器中打开信息流。仍要将命令打印的 http://localhost:<port> URL 提供给用户,以便他们在标签页关闭后重新打开。(传入 --no-browser 可禁止自动打开;无论是否传入,都会打印 URL。)命令会在前台持续运行,直到用户按 Ctrl+C 停止;如果你还需要继续工作,请在后台运行它。
在无头/无显示环境中,请改为写入一个独立文件并告知用户文件位置(页面允许他们下载自己的反应):
python3 "$SKILL_DIR/scripts/generate_feed.py" "$CONTENT_HOME/research/{today}" --static
# → $CONTENT_HOME/research/{today}/for-you.html
然后简要总结(帖子数量、其中有多少条是离群项、几条亮点帖子),并告知页面位置。
第 7 步:提供后续选项
用户在浏览器中的信息流上作出反应;这些反应会自行保存到
research/{today}/feedback.json:服务器模式下会自动保存,静态模式下则通过页面上的下载按钮保存。这里没有“完成”信号,也没有什么需要你现在读取或提炼的内容:文件只会不断累积反应,下一次运行时会在第 1a 步将它们纳入偏好记忆。这样可以让工作流保持简单,而且至关重要的是,即使本次对话结束后用户才作出反应,也能将其记录下来。
主动提出可以:深入探讨任何想法、添加/移除跟踪账号,或改用不同的主题重点重新运行。
备注
- 反应/反馈 → 偏好记忆。 信息流页面允许用户在两个标签页中标记条目(▲ 更多类似内容/▼ 更少类似内容/备注)。在服务器模式下,用户点击时,反应会自动保存到
research/{date}/feedback.json;在静态模式下,用户会将该文件下载到本次运行文件夹。该文件只是不断累积反应的列表——没有状态,也没有提交步骤。下一次运行会在第 1a 步读取上一次运行的feedback.json,并将其提炼到项目记忆中,让未来的运行实现个性化——不存在偏好文件;偏好存储在自动记忆中。 - 没有 API 密钥 = 无法运行。 配置文件模式和 URL 模式都需要
SCRAPECREATORS_API_KEY——包括 YouTube 字幕在内的所有平台,都通过 ScrapeCreators 处理。如果缺少密钥,脚本会返回错误;请停止并展示设置说明,不要编造数据。