Aperçu
Ce workflow surveille quotidiennement Reddit pour les discussions correspondant à vos mots-clés cibles. Il note les publications en fonction de l'engagement, identifie les questions et points douloureux récurrents, et met en avant les discussions au signal le plus élevé comme opportunités de création de contenu. Les résultats alimentent les calendriers de contenu avec une priorisation des sujets basée sur les données.
Déclencheur
Planification cron (tous les jours à 7h UTC)
Planification
S'exécute quotidiennement à 7h UTC
Étapes du workflow
Charger la configuration des mots-clés
Lire les mots-clés cibles et les seuils d'engagement minimum depuis la configuration.
Rechercher chaque mot-clé sur Reddit
Appeler Scavio avec la plateforme reddit pour chaque mot-clé afin d'obtenir les discussions récentes.
Noter et filtrer les publications
Noter les publications en fonction des votes positifs, du nombre de commentaires et de la récence. Filtrer les résultats à faible signal.
Extraire les angles de contenu
Analyser les titres et les extraits des publications pour identifier la question spécifique ou le point douloureux abordé.
Dédoublonner et classer
Supprimer les sujets en double entre les mots-clés et classer par signal d'engagement combiné.
Générer les opportunités de contenu
Enregistrer les opportunités classées sous forme de briefs de contenu avec les liens sources et les données d'engagement.
Implémentation Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
KEYWORDS = ["search api", "web scraping alternative", "SERP data", "google results api"]
MIN_SCORE = 5
MIN_COMMENTS = 3
def search_reddit(keyword: str) -> list[dict]:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "reddit", "query": keyword},
timeout=15,
)
res.raise_for_status()
return res.json().get("organic", [])
def score_post(post: dict) -> float:
score = post.get("score", 0)
comments = post.get("comments", 0)
return score + (comments * 2) # Weight comments higher
def run():
all_opportunities = []
seen_titles = set()
for keyword in KEYWORDS:
posts = search_reddit(keyword)
for post in posts:
title = post.get("title", "")
if title in seen_titles:
continue
post_score = post.get("score", 0)
post_comments = post.get("comments", 0)
if post_score >= MIN_SCORE and post_comments >= MIN_COMMENTS:
seen_titles.add(title)
all_opportunities.append({
"keyword": keyword,
"title": title,
"subreddit": post.get("subreddit", ""),
"score": post_score,
"comments": post_comments,
"signal_score": score_post(post),
"link": post.get("link", ""),
"content_angle": post.get("snippet", "")[:200],
})
# Rank by signal score
all_opportunities.sort(key=lambda x: x["signal_score"], reverse=True)
top_opportunities = all_opportunities[:15]
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {
"date": date,
"keywords_searched": len(KEYWORDS),
"total_posts_found": len(all_opportunities),
"top_opportunities": top_opportunities,
}
Path(f"reddit_signals_{date}.json").write_text(json.dumps(report, indent=2))
print(f"Found {len(all_opportunities)} content opportunities, top {len(top_opportunities)} saved")
for opp in top_opportunities[:5]:
print(f" [{opp['subreddit']}] {opp['title'][:60]} (signal: {opp['signal_score']:.0f})")
if __name__ == "__main__":
run()Implémentation JavaScript
const API_KEY = "your_scavio_api_key";
const KEYWORDS = ["search api", "web scraping alternative", "SERP data", "google results api"];
const MIN_SCORE = 5;
const MIN_COMMENTS = 3;
async function searchReddit(keyword) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "reddit", query: keyword }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return (await res.json()).organic ?? [];
}
function scorePost(post) {
return (post.score ?? 0) + (post.comments ?? 0) * 2;
}
async function run() {
const fs = await import("fs/promises");
const allOpportunities = [];
const seenTitles = new Set();
for (const keyword of KEYWORDS) {
const posts = await searchReddit(keyword);
for (const post of posts) {
const title = post.title ?? "";
if (seenTitles.has(title)) continue;
const postScore = post.score ?? 0;
const postComments = post.comments ?? 0;
if (postScore >= MIN_SCORE && postComments >= MIN_COMMENTS) {
seenTitles.add(title);
allOpportunities.push({
keyword,
title,
subreddit: post.subreddit ?? "",
score: postScore,
comments: postComments,
signalScore: scorePost(post),
link: post.link ?? "",
contentAngle: (post.snippet ?? "").slice(0, 200),
});
}
}
}
allOpportunities.sort((a, b) => b.signalScore - a.signalScore);
const topOpportunities = allOpportunities.slice(0, 15);
const date = new Date().toISOString().slice(0, 10);
const report = { date, keywordsSearched: KEYWORDS.length, totalPostsFound: allOpportunities.length, topOpportunities };
await fs.writeFile(`reddit_signals_${date}.json`, JSON.stringify(report, null, 2));
console.log(`Found ${allOpportunities.length} opportunities, top ${topOpportunities.length} saved`);
for (const opp of topOpportunities.slice(0, 5)) {
console.log(` [${opp.subreddit}] ${opp.title.slice(0, 60)} (signal: ${opp.signalScore})`);
}
}
run();Plateformes utilisées
Communauté, publications et commentaires imbriqués de n'importe quel subreddit