内容
把社媒讨论变成一份每周倾听简报
搜索过去一周品牌和竞品相关的 X 帖子,补充有来源的网页背景,读页面背后的内容,再把每期简报归档,让下周从已知开始。
复制 prompt
把方括号里的字段替换掉,然后粘贴到 Claude Code、Codex 或任何能访问终端的 AI。它会安装 Felo skill、在花额度前询问,并执行这套 workflow。
为[品牌、产品或品类]执行一份社媒聆听简报。 监控词:[品牌]、[产品名]、[竞品名]、[品类关键词]。 时间范围:过去 [7 / 14] 天。时区:[时区]。读者:[团队]。 允许的来源:仅公开 X 帖子和公开网页。 输出: 1. 用五行总结对话中发生了什么变化。 2. 主题,每个主题写明大家在说什么、支持它的帖子,以及这些帖子覆盖的日期范围。 3. 竞品提及:谁被推荐,以及在什么语境下。 4. 风险:投诉、故障、重复提问或反弹。 5. 下一步,分为“立即回复”“持续观察”“反馈给产品”。 6. 来源列表,包含每个帖子和页面的 URL 及日期。 规则: - 只报告 API 返回的帖子和页面。不要编造情绪分数、互动数据、引文或来源。 - 把 X 当作信号,不是代表性调查。样本太小时要说明无法下结论。 - 把客户原话和你自己的总结分开,简短引用并附链接。 - 把时间范围落实为明确的开始和结束日期,并注明时区。 - 消耗额度前,先展示计划执行的搜索和抽取并等待我批准。 - 不要回复、发帖、关注或给任何人发消息。这份简报是只读的。 - 将结果写入 ./social-listening.md,并在对话中总结。
复制的内容也包含安装步骤和安全规则。
你会得到什么
一次运行的示例输出,不是实时生成。
社媒聆听简报 — 2026-10-30
变化
- 对导出流程的抱怨成为头号主题。
- 价格帖里有人在推荐更便宜的竞品。
- 2026-10-27 的故障已不再被提及。
主题
- 更新后导出很慢 — @example_dev:“40 页文档的导出按钮现在要几分钟。”(2026-10-28);@example_ops:“还有谁月底导出排队?”(2026-10-29)
- 有人在推荐更便宜的替代品 — Example Rival 出现在询问更低价格的帖子中
竞品
当人们询问更便宜的替代品时,Example Rival 会被推荐;推荐是关于价格,不是功能。
风险
导出抱怨也出现在支持相关帖子中,可能进入流失对话。
下一步
- 立即回复:2026-10-28 的导出帖。
- 观察:抱怨是否会扩散到 API 受众。
- 反馈给产品:月底导出延迟。
来源
- https://x.com/example_dev/status/... — 2026-10-28
- https://example.com/export-thread — 2026-10-29
实际调用
给开发者:同一套 workflow 的可复制代码,按执行顺序排列。
展开实际 API 调用
搜索过去一周的帖子
用 X Search 搜品牌名和竞品名,限定最近 7 天,保留账号和日期。
listening.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; metrics: { retweet_count: number; favorite_count: number; reply_count: number }; url: string; }[]; }; }; const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000); const search = await felo<XData>("/v2/x/tweet/search", { query: '"Acme" OR "Acme app"', limit: 50, since_time: since, }); const posts = search.data.tweets;示例输出
{ "data": { "tweets": [ { "content": "The export flow is slow again.", "author": { "username": "example_dev" }, "created_at": "2026-10-28T09:14:00Z", "metrics": { "retweet_count": 4, "favorite_count": 21, "reply_count": 6 }, "url": "https://x.com/example_dev/status/..." } ] } }补充有来源的网页背景
用 Chat 问这些讨论背后的背景,拿到有来源的网页列表。
listening.ts type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const context = await felo<ChatData>("/v2/chat", { query: "Recent customer complaints and competitor mentions around Acme", }); const sources = context.data.resources.slice(0, 5);示例输出
{ "answer": "The main threads are …", "sources": [ { "link": "https://example.com/thread", "title": "…", "snippet": "…" } ] }读页面背后的内容
用 Web Fetch 读取最相关的两三页,补充事实背景和链接。
listening.ts type ExtractData = { data: { content: string } }; const pages = await Promise.all( sources.slice(0, 3).map((source) => felo<ExtractData>("/v2/web/extract", { url: source.link, output_format: "markdown", with_readability: true, with_cache: true, }).then((page) => ({ ...source, content: page.data.content })), ), );示例输出
// pages[0].content "# Example thread summary\n\nExtracted page content…"
按主题写成周报
按主题、代表性帖子、背景、风险和下周关注点组织 Markdown。
listening.ts const date = new Date().toISOString().slice(0, 10); const ranked = [...posts].sort( (a, b) => b.metrics.favorite_count - a.metrics.favorite_count, ); const brief = [ `# Social listening brief — ${date}`, "", "## What the web says", context.data.answer, "", "## What people are posting", ...ranked.slice(0, 10).map( (post) => `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}\n ${post.url}`, ), "", "## Pages behind the answer", ...pages.map((page) => `- [${page.title}](${page.link})`), "", "## Sources", ...sources.map((source) => `- [${source.title}](${source.link})`), ].join("\n"); console.log(brief);归档并对比上周
把周报和来源存进 LiveDoc,下周先检索上一期做对比。
listening.ts type LiveDocData = { data: { short_id: string } }; const archive = await felo<LiveDocData>("/v2/livedocs", { name: "Social listening archive", description: "One document resource per weekly brief", }); await felo(`/v2/livedocs/${archive.data.short_id}/resources/doc`, { title: `Social listening — ${date}`, content: brief, }); type Retrieved = { data: { title: string; content: string; score: number }[] }; const previous = await felo<Retrieved>( `/v2/livedocs/${archive.data.short_id}/resources/retrieve`, { query: "what changed since last week" }, ).then((res) => res.data.filter((hit) => hit.score >= 0.7));示例输出
[ { "title": "Social listening — 2026-10-23", "content": "…", "score": 0.88 } ]
包含什么
- 过去一周带日期的 X 帖子
- 有来源的网页背景
- 按主题聚类的讨论摘要
- 一份可直接分享的周报
- 保存每期简报的 LiveDoc
不做什么
- X 覆盖不完整,不代表全体用户
- 不提供情绪识别的确定性结论
- 不自动发帖或回复
- 不包含私信和私有社群数据
- 每周运行一次,调度由你的 agent 或 cron 负责
常见问题
哪些内容算简报里的来源?
每条 X 帖子都保留链接、账号和日期;网页背景来自 Chat 和 Web Fetch 的公开页面。没有来源的断言不会写进简报。
可以同时跟踪竞品吗?
可以。把品牌名和竞品名一起搜索,并在周报里分组呈现。
它会测量情绪吗?
会按主题和语气做归纳,但明确标为编辑判断,不宣称精确的情绪百分比。
会看多久以前的帖子?
默认最近 7 天,适合周报;需要更长窗口时改 `since_time`。
可以每周自动跑吗?
可以。把同一套 prompt 放进 cron 或 agent 调度,每周写入同一份 LiveDoc。
一份简报要花多少?
X 搜索、Chat 和页面抽取都按用量计费;当前费率在价格页面,prompt 会先请求确认。
相关 workflow
改成你的版本
同一套配方,按你实际的交付方式调整。
只看一个话题
把搜索范围缩到一个产品发布或争议,简报会更聚焦。
加入 YouTube 观点
用视频转录补充创作者观点,但明确标为个人经验。
做成月报
把频率改成每月,适合品牌和公关团队。
继续深入
这套配方背后的参考页面,以及下一步可以看什么。