Reddit ICP 監控器
監控 Reddit 子版塊,尋找正在描述你所解決問題的人。為他們評分。為每個匹配對象擬寫一封有幫助的回覆。
關鍵規則: 絕對不能編造貼文網址、標題或內容。輸出中的每篇貼文都必須來自 Reddit 搜尋結果。將沒有任何結果的區塊標記為「未找到匹配。」切勿為未由搜尋回傳的貼文擬寫回覆。
反垃圾訊息規則: 擬寫的回覆不得提及您的產品或公司名稱,除非該貼文明確要求工具推薦。聽起來要像一位從業人員,而不是行銷人員。
第一步:設定檢查
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
echo "REDDIT_CLIENT_ID: ${REDDIT_CLIENT_ID:-not set, using public endpoints (10 RPM)}"
如果 GEMINI_API_KEY 缺失: 停止。告訴使用者:「GEMINI_API_KEY 是必要的。請前往 aistudio.google.com 取得。並將其加入您的 .env 檔案。」
如果 Reddit 憑證缺失: 繼續進行。使用 Reddit 的公開 JSON 端點(無需認證,限制每分鐘 10 次請求)。對於大多數監控會話(3 到 6 個子版塊搜尋),這已經足夠。
如果 REDDIT_CLIENT_ID 已設定: 使用 OAuth 以達到每分鐘 60 次請求。首先獲取令牌:
TOKEN=$(curl -s -X POST \
-d "grant_type=password&username=$REDDIT_USERNAME&password=$REDDIT_PASSWORD" \
--user "$REDDIT_CLIENT_ID:$REDDIT_CLIENT_SECRET" \
-H "User-Agent: varnan-skills/1.0" \
https://www.reddit.com/api/v1/access_token \
| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
在後續所有請求中使用 Authorization: Bearer $TOKEN 標頭和 https://oauth.reddit.com 基礎 URL。
第二步:載入 ICP
檢查現有的 ICP 檔案:
ls docs/icp.md 2>/dev/null && echo "icp found" || echo "icp missing"
如果 docs/icp.md 存在: 讀取它。擷取出:
product:一句話的產品描述pain_points:痛點短語列表(精確的買家語言)anti_keywords:會使貼文不符合資格的短語subreddits:要搜尋的子版塊列表
如果 docs/icp.md 不存在: 詢問這 3 個問題。在所有 3 個問題都回答之前,不要繼續:
- 您的產品是做什麼的?(一句話)
- 您的 ICP 在哪個子版塊發文?(逗號分隔,例如 devops, startups, SaaS)
- 哪些痛點短語應該觸發匹配?(3-5 個用買家自己的話描述的短語,例如「入職流程花費很長的時間」、「無法看出使用者為何流失」)
收集完答案後,使用 references/icp-format.md 中的標準格式儲存到 docs/icp.md。確認:「ICP 已儲存至 docs/icp.md。未來執行時將自動使用。」
閱讀 references/icp-format.md 以了解標準格式以及好的與不好的痛點短語範例。
第三步:搜尋 Reddit
針對每個子版塊和痛點短語的組合,執行一次搜尋。除非設定了 OAuth 憑證,否則使用公開端點。
未使用 OAuth(公開端點):
curl -s \
-H "User-Agent: varnan-skills/1.0" \
"https://www.reddit.com/r/{SUBREDDIT}/search.json?q={PHRASE}&sort=new&t=week&limit=25&restrict_sr=true" \
| python3 -c "
import sys, json
d = json.load(sys.stdin)
posts = d.get('data', {}).get('children', [])
for p in posts:
data = p['data']
print(json.dumps({
'id': data['id'],
'title': data['title'],
'body': data.get('selftext', '')[:600],
'url': 'https://reddit.com' + data['permalink'],
'score': data['score'],
'comments': data['num_comments'],
'subreddit': data['subreddit'],
'created_utc': data['created_utc']
}))
"
使用 OAuth:
將 https://www.reddit.com 替換為 https://oauth.reddit.com 並加入 -H "Authorization: Bearer $TOKEN"。
對短語進行 URL 編碼,然後插入查詢字串:
ENCODED=$(python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" "{PHRASE}")
時間視窗預設值:
- 預設:
t=week(最近 7 天) - 使用者說「今天」或「最近 24 小時」:
t=day - 使用者說「這個月」:
t=month
所有搜尋完成後:
- 將所有貼文收集到一個清單中
- 根據貼文 ID 去除重複。如果同一篇貼文匹配多個短語,只保留一次,並記錄所有匹配的短語。
- 如果某次搜尋回傳 0 篇貼文:記錄該情況並繼續。不要停止。
在評分前說明候選貼文總數:「在 Y 個子版塊中找到 X 篇候選貼文。」
第四步:使用 Gemini 評分相關性
將所有候選貼文和 ICP 上下文寫入一個暫存檔案,然後進行評分:
cat > /tmp/reddit-score-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "You are a GTM analyst identifying Reddit posts where someone is experiencing the exact pain point that a specific product solves. For each post provided, output a JSON object with these fields: id (the post id), score (integer 1-5), reason (one sentence explaining the score). Scoring rubric: 5 = person clearly has the problem AND is actively seeking help or venting frustration about it; 4 = strong signal, problem is present but less explicit; 3 = possible match, uncertain; 2 = tangentially related but not the core pain; 1 = unrelated. Output only a JSON array of score objects. No commentary before or after the array."
}]
},
"contents": [{
"parts": [{
"text": "POSTS_AND_ICP_CONTEXT_HERE"
}]
}],
"generationConfig": {
"temperature": 0.2,
"maxOutputTokens": 2048
}
}
ENDJSON
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/reddit-score-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
將 POSTS_AND_ICP_CONTEXT_HERE 替換為:
- 第二步中的產品描述和痛點短語
- 每篇候選貼文:ID、標題、內文片段
- ICP 中的反關鍵字(Gemini 應將這些貼文評為較低分數)
僅保留評分 >= 4 的貼文,以進行回覆擬寫。
說明:「X 篇貼文評分為 4 或 5。正在擬寫回覆。」
如果 0 篇貼文評分 >= 4:輸出第七步中的零結果訊息並停止。不要擬寫空回覆。
第五步:使用 Gemini 擬寫回覆
在擬寫之前閱讀 references/reply-rules.md。為每篇高分貼文判斷貼文類型(模式 1、2 或 3),並將模式傳遞給 Gemini。
針對每篇評分 >= 4 的貼文擬寫回覆(每次會話最多 5 則回覆):
cat > /tmp/reddit-reply-request.json << 'ENDJSON'
{
"system_instruction": {
"parts": [{
"text": "You are a practitioner who has personally solved the exact problem being described in this Reddit post. Write a helpful reply that: (1) directly addresses what the person asked or is frustrated about, (2) shares a specific, useful insight from real experience, (3) does NOT mention any product, tool, or company by name unless the post explicitly asks for tool recommendations, (4) is 2-5 sentences, written in plain conversational prose with no headers or bullet lists, (5) optionally ends with a low-pressure invitation to continue the conversation. Do not use marketing language. Do not use these words: game-changer, best-in-class, streamline, transform, revolutionize, leverage, seamless, robust, comprehensive, innovative. Sound like a real person."
}]
},
"contents": [{
"parts": [{
"text": "POST_CONTENT_AND_MODE_HERE"
}]
}],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 512
}
}
ENDJSON
curl -s -X POST \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/reddit-reply-request.json \
| python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
將 POST_CONTENT_AND_MODE_HERE 替換為:
- 完整的貼文標題和內文
- 回覆模式(模式 1:發洩情緒/挫折,模式 2:如何處理 X,模式 3:工具推薦)
- 產品描述(讓 Gemini 知道在模式 1/2 中要避免提及什麼)
- 如果是模式 3:Gemini 可以提及產品名稱,而且必須提及一個替代方案
第六步:自我問答
在呈現之前執行每項檢查並修正違規:
- 在模式 1 或模式 2 的回覆中未出現產品名稱
- 任何回覆中未出現禁用字詞:「game-changer」、「best-in-class」、「streamline」、「transform」、「revolutionize」、「leverage」、「seamless」、「robust」、「innovative」
- 每則回覆是 2-5 句話(計算並說明)
- 每則回覆直接針對貼文中的具體問題或挫折
- 輸出中的所有網址都是來自搜尋結果的真實 Reddit 網址(非建構或猜測的)
- 總共擬寫不超過 5 則回覆
- 模式 3 的回覆至少提及一個替代方案(不僅僅是產品)
- 如果任何子版塊在整個關鍵字搜尋中回傳 0 個結果,則在輸出中標記它
在呈現之前修正任何違規。
第七步:輸出與儲存
呈現完整報告:
## Reddit ICP 監控器 — [YYYY-MM-DD]
**已監控的子版塊:** r/[subreddit1], r/[subreddit2]
**時間視窗:** 最近 7 天
**已搜尋的關鍵字:** [phrase1], [phrase2], [phrase3]
**找到的候選貼文:** X 篇
**高訊號匹配(評分 4-5):** Y 篇
---
### 匹配 1 — 評分 [N]/5
**貼文:** [title](url)
**子版塊:** r/[subreddit] | [N] 讚 | [N] 則留言
**訊號引述:** "[貼文內文的相關摘錄]"
**匹配的關鍵字:** [phrase]
**貼文類型:** 模式 [1/2/3]
**擬寫的回覆:**
[回覆文字]
**回覆字數:** N 字
---
[為每個匹配重複]
---
**回傳 0 個結果的子版塊:** [列出任何未回傳結果的子版塊]
如果 0 篇貼文評分 >= 4: 「在過去 7 天內,在 [subreddits] 中未找到高訊號匹配。已搜尋的關鍵字:[list]。請嘗試加寬時間視窗(重新執行並說『last month』)或擴大 docs/icp.md 中的痛點短語。」
儲存到檔案:
mkdir -p docs/reddit-intel
OUTFILE="docs/reddit-intel/$(date +%Y-%m-%d).md"
cat > "$OUTFILE" << 'EOF'
REPORT_CONTENT_HERE
EOF
echo "已儲存至 $OUTFILE"