Aperçu
Ce workflow surveille quotidiennement les mots-clés de marque des concurrents sur le SERP Google. Il suit les changements de position organique, détecte les nouveaux contenus des concurrents (articles de blog, pages d'atterrissage, communiqués de presse) et inclut le nombre de mentions sur Reddit. Le digest par e-mail arrive avant votre réunion matinale avec des informations exploitables.
Déclencheur
Planification Cron (tous les jours à 6h30 UTC)
Planification
Tous les jours à 6h30 UTC
Étapes du workflow
Charger les mots-clés de marque des concurrents
Lire les noms des concurrents et les mots-clés de marque depuis la configuration. Inclure des variantes comme 'Avis ConcurrentName', 'Tarifs ConcurrentName', 'ConcurrentName vs'.
Rechercher chaque mot-clé sur Google
Appeler la recherche Google Scavio pour chaque mot-clé de marque. Enregistrer les 10 premières positions organiques avec titres et URL.
Comparer avec les données d'hier
Comparer le top 10 d'aujourd'hui avec les données stockées d'hier. Identifier les nouvelles URL (nouveau contenu), les changements de position et les résultats disparus.
Vérifier les mentions sur Reddit
Rechercher Reddit pour chaque nom de concurrent via Scavio. Compter les fils de discussion des dernières 24 heures pour évaluer l'activité.
Digest par e-mail
Formater tous les changements dans un digest concis par e-mail, regroupé par concurrent. Mettre en avant les nouveaux contenus et les changements de position significatifs.
Implémentation Python
import requests, os, json
from pathlib import Path
SCAVIO_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": SCAVIO_KEY}
COMPETITORS = {"Tavily": ["tavily pricing", "tavily review", "tavily api"],
"Serper": ["serper pricing", "serper review", "serper api"]}
def search_keyword(keyword: str) -> list:
resp = requests.post("https://api.scavio.dev/api/v1/search", headers=H,
json={"platform": "google", "query": keyword}, timeout=10)
return [{"pos": r["position"], "title": r["title"], "url": r["link"]}
for r in resp.json().get("organic", [])[:10]]
baseline_path = Path("competitor_baseline.json")
baseline = json.loads(baseline_path.read_text()) if baseline_path.exists() else {}
today = {}
changes = []
for comp, keywords in COMPETITORS.items():
today[comp] = {}
for kw in keywords:
results = search_keyword(kw)
today[comp][kw] = results
old = baseline.get(comp, {}).get(kw, [])
old_urls = {r["url"] for r in old}
new_urls = {r["url"] for r in results}
new_content = new_urls - old_urls
if new_content:
changes.append(f"{comp} [{kw}]: {len(new_content)} new URLs")
baseline_path.write_text(json.dumps(today))
for c in changes:
print(c)Implémentation JavaScript
import { readFileSync, writeFileSync, existsSync } from "fs";
const COMPETITORS = {
Tavily: ["tavily pricing", "tavily review", "tavily api"],
Serper: ["serper pricing", "serper review", "serper api"],
};
async function searchKeyword(keyword) {
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ platform: "google", query: keyword })
});
return ((await resp.json()).organic || []).slice(0, 10).map(r => ({
pos: r.position, title: r.title, url: r.link
}));
}
const baselinePath = "competitor_baseline.json";
const baseline = existsSync(baselinePath) ? JSON.parse(readFileSync(baselinePath, "utf8")) : {};
const today = {};
const changes = [];
for (const [comp, keywords] of Object.entries(COMPETITORS)) {
today[comp] = {};
for (const kw of keywords) {
const results = await searchKeyword(kw);
today[comp][kw] = results;
const oldUrls = new Set((baseline[comp]?.[kw] || []).map(r => r.url));
const newUrls = results.filter(r => !oldUrls.has(r.url));
if (newUrls.length > 0) changes.push(`${comp} [${kw}]: ${newUrls.length} new URLs`);
}
}
writeFileSync(baselinePath, JSON.stringify(today, null, 2));
changes.forEach(c => console.log(c));Plateformes utilisées
Recherche web avec graphe de connaissances, PAA et aperçus IA
Communauté, publications et commentaires imbriqués de n'importe quel subreddit