Was macht Reddit ICP Monitor?
Überwacht Subreddits auf Beiträge, die das von Ihnen gelöste Problem beschreiben. Bewertet deren Relevanz. Entwirft eine hilfreiche Antwort für jeden Treffer.
Wichtige Regel: Erfinden Sie niemals Beitrags-URLs, Titel oder Inhalte. Jeder Beitrag in der Ausgabe muss aus einem Reddit-Suchergebnis stammen. Kennzeichnen Sie jeden Abschnitt ohne Ergebnisse als "Keine Treffer gefunden." Entwerfen Sie niemals eine Antwort auf einen Beitrag, der nicht von der Suche zurückgegeben wurde.
Anti-Spam-Regel: Entworfene Antworten dürfen niemals Ihren Produkt- oder Firmennamen erwähnen, es sei denn, der Beitrag fragt explizit nach Tool-Empfehlungen. Klingen Sie wie ein Praktiker, nicht wie ein Vermarkter.
Schritt 1: Setup-Prüfung
echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+gesetzt}"
echo "REDDIT_CLIENT_ID: ${REDDIT_CLIENT_ID:-nicht gesetzt, verwende öffentliche Endpunkte (10 RPM)}"
Wenn GEMINI_API_KEY fehlt: Anhalten. Teilen Sie dem Benutzer mit: "GEMINI_API_KEY wird benötigt. Holen Sie ihn unter aistudio.google.com. Fügen Sie ihn Ihrer .env-Datei hinzu."
Wenn Reddit-Anmeldeinformationen fehlen: Fortfahren. Verwenden Sie die öffentlichen JSON-Endpunkte von Reddit (keine Authentifizierung erforderlich, 10 RPM-Limit). Für die meisten Überwachungssitzungen mit 3-6 Subreddit-Suchen ist dies ausreichend.
Wenn REDDIT_CLIENT_ID gesetzt ist: Verwenden Sie OAuth für 60 RPM. Holen Sie zuerst ein Token:
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'])")
Verwenden Sie Authorization: Bearer $TOKEN und die Basis-URL https://oauth.reddit.com für alle nachfolgenden Anfragen.
Schritt 2: ICP laden
Prüfen Sie auf eine vorhandene ICP-Datei:
ls docs/icp.md 2>/dev/null && echo "icp gefunden" || echo "icp fehlt"
Wenn docs/icp.md existiert: Lesen Sie sie. Extrahieren Sie:
product: Produktbeschreibung in einem Satzpain_points: Liste von Schmerzpunkt-Phrasen (exakte Käufersprache)anti_keywords: Phrasen, die einen Beitrag disqualifizierensubreddits: Liste der zu durchsuchenden Subreddits
Wenn docs/icp.md nicht existiert: Stellen Sie diese 3 Fragen. Fahren Sie erst fort, wenn alle 3 beantwortet sind:
- Was macht Ihr Produkt? (ein Satz)
- In welchen Subreddits postet Ihr ICP? (kommasepariert, z.B. devops, startups, SaaS)
- Welche Schmerzpunkt-Phrasen sollten einen Treffer auslösen? (3-5 Phrasen in den eigenen Worten Ihres Käufers, z.B. "Onboarding dauert ewig", "kann nicht sehen, warum Benutzer abwandern")
Nachdem die Antworten gesammelt wurden, speichern Sie sie in docs/icp.md im kanonischen Format aus references/icp-format.md. Bestätigen Sie: "ICP gespeichert in docs/icp.md. Es wird bei zukünftigen Läufen automatisch verwendet."
Lesen Sie references/icp-format.md für das kanonische Format und Beispiele für gute vs. schlechte Schmerzpunkt-Phrasen.
Schritt 3: Reddit durchsuchen
Führen Sie für jede Kombination aus Subreddit und Schmerzpunkt-Phrase eine Suche durch. Verwenden Sie öffentliche Endpunkte, sofern keine OAuth-Anmeldeinformationen gesetzt sind.
Ohne OAuth (öffentlicher Endpunkt):
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']
}))
"
Mit OAuth:
Ersetzen Sie https://www.reddit.com durch https://oauth.reddit.com und fügen Sie -H "Authorization: Bearer $TOKEN" hinzu.
URL-kodieren Sie die Phrase, bevor Sie sie in die Abfragezeichenfolge einfügen:
ENCODED=$(python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" "{PHRASE}")
Zeitfenster-Standardwerte:
- Standard:
t=week(letzte 7 Tage) - Benutzer sagt "heute" oder "letzte 24 Stunden":
t=day - Benutzer sagt "diesen Monat":
t=month
Nach allen Suchen:
- Sammeln Sie alle Beiträge in einer Liste
- Entfernen Sie Duplikate anhand der Beitrags-ID. Wenn derselbe Beitrag auf mehrere Phrasen passt, behalten Sie ihn einmal und notieren Sie alle passenden Phrasen.
- Wenn eine Suche 0 Beiträge zurückgibt: notieren Sie es und fahren Sie fort. Nicht anhalten.
Geben Sie die Gesamtzahl der Kandidaten vor der Bewertung an: "X Kandidatenbeiträge in Y Subreddits gefunden."
Schritt 4: Relevanz mit Gemini bewerten
Schreiben Sie alle Kandidatenbeiträge und den ICP-Kontext in eine temporäre Datei, dann bewerten Sie:
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'])"
Ersetzen Sie POSTS_AND_ICP_CONTEXT_HERE durch:
- Die Produktbeschreibung und Schmerzpunkt-Phrasen aus Schritt 2
- Jeden Kandidatenbeitrag: id, title, body snippet
- Anti-Keywords aus dem ICP (Gemini sollte diese niedriger bewerten)
Behalten Sie nur Beiträge mit einem Score >= 4 für die Antwort-Erstellung.
Geben Sie an: "X Beiträge haben 4 oder 5 Punkte erzielt. Antworten werden erstellt."
Wenn 0 Beiträge >= 4 Punkte erzielt haben: geben Sie die Null-Ergebnis-Nachricht aus Schritt 7 aus und stoppen Sie. Erstellen Sie keine leeren Antworten.
Schritt 5: Antworten mit Gemini erstellen
Lesen Sie references/reply-rules.md vor dem Erstellen. Bestimmen Sie den Beitragstyp für jeden hochbewerteten Beitrag (Modus 1, 2 oder 3) und übergeben Sie den Modus an Gemini.
Für jeden Beitrag mit Score >= 4, erstellen Sie eine Antwort (maximal 5 Antworten pro Sitzung):
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'])"
Ersetzen Sie POST_CONTENT_AND_MODE_HERE durch:
- Den vollständigen Beitragstitel und -text
- Den Antwortmodus (Modus 1: Frustration/Luft ablassen, Modus 2: Wie-handhabt-ihr-X, Modus 3: Tool-Empfehlung)
- Die Produktbeschreibung (damit Gemini weiß, was es in Modus 1/2 nicht nennen darf)
- Wenn Modus 3: Gemini darf das Produkt nennen UND muss eine Alternative nennen
Schritt 6: Selbst-QA
Führen Sie jede Prüfung durch und beheben Sie Verstöße, bevor Sie präsentieren:
- Kein Produktname in Antworten des Modus 1 oder 2
- Keine verbotenen Wörter in Antworten: "game-changer", "best-in-class", "streamline", "transform", "revolutionize", "leverage", "seamless", "robust", "innovative"
- Jede Antwort ist 2-5 Sätze lang (zählen und angeben)
- Jede Antwort adressiert direkt die spezifische Frage oder Frustration im Beitrag
- Alle URLs in der Ausgabe sind echte Reddit-URLs aus den Suchergebnissen (nicht konstruiert oder erraten)
- Nicht mehr als 5 Antworten insgesamt erstellt
- Antworten des Modus 3 erwähnen mindestens eine Alternative (nicht nur das Produkt)
- Wenn ein Subreddit über alle Keyword-Suchen hinweg 0 Ergebnisse lieferte, markieren Sie es in der Ausgabe
Beheben Sie jeden Verstoß vor der Präsentation.
Schritt 7: Ausgabe und Speichern
Präsentieren Sie den vollständigen Bericht:
## Reddit ICP Monitor — [JJJJ-MM-TT]
**Überwachte Subreddits:** r/[subreddit1], r/[subreddit2]
**Zeitfenster:** Letzte 7 Tage
**Durchsuchte Keywords:** [phrase1], [phrase2], [phrase3]
**Gefundene Kandidaten:** X Beiträge
**Hochsignifikante Treffer (Score 4-5):** Y Beiträge
---
### Treffer 1 — Score [N]/5
**Beitrag:** [title](url)
**Subreddit:** r/[subreddit] | [N] Upvotes | [N] Kommentare
**Signalzitat:** "[relevanter Auszug aus dem Beitragstext]"
**Passendes Keyword:** [phrase]
**Beitragstyp:** Modus [1/2/3]
**Entworfene Antwort:**
[Antworttext]
**Antwort-Wortanzahl:** N Wörter
---
[wiederholen für jeden Treffer]
---
**Subreddits mit 0 Ergebnissen:** [alle auflisten, die nichts zurückgaben]
Wenn 0 Beiträge >= 4 Punkte erzielt haben: "Keine hochsignifikanten Treffer in den letzten 7 Tagen in [Subreddits] gefunden. Durchsuchte Keywords: [Liste]. Versuchen Sie, das Zeitfenster zu erweitern (führen Sie es erneut aus und sagen Sie 'letzten Monat') oder erweitern Sie Ihre Schmerzpunkt-Phrasen in docs/icp.md."
In Datei speichern:
mkdir -p docs/reddit-intel
OUTFILE="docs/reddit-intel/$(date +%Y-%m-%d).md"
cat > "$OUTFILE" << 'EOF'
REPORT_CONTENT_HERE
EOF
echo "Gespeichert in $OUTFILE"