Un agent de surveillance de marque scrute un mot-clé sur Reddit et vous avertit dès qu’un nouveau résultat apparaît. Ce tutoriel explique comment en construire un en environ 40 lignes de Python : rechercher Reddit selon un planning, conserver les identifiants de posts déjà vus et vous alerter sur les nouveaux. Vous pouvez remplacer le canal d’alerte par Slack, un email ou n’importe quel webhook.
Prérequis
- Python 3.8 ou supérieur
- bibliothèque requests installée
- Une clé API Scavio
- Un mot‑clé à surveiller (nom de marque, produit, concurrent)
Parcours
Étape 1: Définir le mot‑clé et le fichier d’état
Conserver un petit fichier JSON des identifiants de posts déjà vus afin que les exécutions répétées ne déclenchent pas une nouvelle alerte.
KEYWORD = "your brand name"
STATE_FILE = "reddit_seen.json"Étape 2: Récupérer les nouveaux posts
Trier par nouveauté pour privilégier les posts récents. Vous pouvez également passer une requête ciblée sur un subreddit, par exemple 'r/startups yourbrand'.
import os, requests
resp = requests.post(
"https://api.scavio.dev/api/v1/reddit/search",
headers={"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"},
json={"query": KEYWORD, "sort": "new"},
timeout=30,
)
posts = resp.json()["data"]["posts"]Étape 3: Comparer avec le fichier d'état
Charger les identifiants de posts déjà vus, calculer la différence et traiter les nouveaux identifiants comme des alertes.
import json, pathlib
state = pathlib.Path(STATE_FILE)
seen = set(json.loads(state.read_text())) if state.exists() else set()
new_posts = [p for p in posts if p["id"] not in seen]
seen.update(p["id"] for p in posts)
state.write_text(json.dumps(list(seen)))Étape 4: Émettre une alerte
Ici nous nous contentons d’afficher, mais c’est là qu’il faudrait envoyer une requête POST vers un webhook Slack ou mettre en file d’attente dans votre système de tâches.
for p in new_posts:
print(f"NEW mention: r/{p['subreddit']} -- {p['title']}")
print(f" {p['url']}")Exemple Python
import os, json, pathlib, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
KEYWORD = os.environ.get("MONITOR_KEYWORD", "scavio")
STATE = pathlib.Path("reddit_seen.json")
def fetch(query: str):
r = requests.post(
"https://api.scavio.dev/api/v1/reddit/search",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query, "sort": "new"},
timeout=30,
)
r.raise_for_status()
return r.json()["data"]["posts"]
def load_state():
if STATE.exists():
return set(json.loads(STATE.read_text()))
return set()
def save_state(ids):
STATE.write_text(json.dumps(list(ids)))
def main():
seen = load_state()
posts = fetch(KEYWORD)
new = [p for p in posts if p["id"] not in seen]
for p in new:
print(f"NEW r/{p['subreddit']}: {p['title']} ({p['url']})")
save_state(seen | {p["id"] for p in posts})
if __name__ == "__main__":
main()Exemple JavaScript
import fs from "node:fs";
const API_KEY = process.env.SCAVIO_API_KEY;
const KEYWORD = process.env.MONITOR_KEYWORD ?? "scavio";
const STATE = "reddit_seen.json";
async function fetchPosts(query) {
const r = await fetch("https://api.scavio.dev/api/v1/reddit/search", {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ query, sort: "new" }),
});
return (await r.json()).data.posts;
}
const seen = new Set(
fs.existsSync(STATE) ? JSON.parse(fs.readFileSync(STATE, "utf8")) : []
);
const posts = await fetchPosts(KEYWORD);
const fresh = posts.filter((p) => !seen.has(p.id));
for (const p of fresh) {
console.log(`NEW r/${p.subreddit}: ${p.title}`);
}
fs.writeFileSync(
STATE,
JSON.stringify([...seen, ...posts.map((p) => p.id)])
);Sortie attendue
NEW r/SaaS: Has anyone used scavio for Reddit search?
https://www.reddit.com/r/SaaS/comments/1smxyz1/
NEW r/devtools: scavio vs serpapi for agent builders
https://www.reddit.com/r/devtools/comments/1smxyz2/