內容
把社群討論變成一份每週傾聽簡報
搜尋過去一週品牌和競品相關的 X 貼文,補充有來源的網頁背景,讀頁面背後的內容,再把每期簡報歸檔,讓下週從已知開始。
複製 prompt
把方括號裡的欄位替換掉,然後貼到 Claude Code、Codex 或任何能存取終端機的 AI。它會安裝 Felo skill、在花額度前詢問,並執行這套工作流程。
為[品牌、產品或品類]執行一份社群聆聽簡報。 監控詞:[品牌]、[產品名]、[競品名]、[品類關鍵字]。 時間範圍:過去 [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
實際呼叫
給開發者:同一套工作流程的可複製程式碼,依執行順序排列。
展開實際 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 會先請求確認。
相關工作流程
改成你的版本
同一套配方,依你實際的交付方式調整。
只看一個話題
把搜尋範圍縮到一個產品發佈或爭議,簡報會更聚焦。
加入 YouTube 觀點
用影片轉錄補充創作者觀點,但明確標為個人經驗。
做成月報
把頻率改成每月,適合品牌和公關團隊。
繼續深入
這套配方背後的參考頁面,以及下一步可以看什麼。