Construisez un système d'alerte de changement des AI Overview qui établit une référence du contenu des AI Overview pour vos requêtes cibles, exécute des recherches quotidiennes avec analyse des AI Overview, compare le contenu actuel à la référence, et alerte lorsque des citations sont ajoutées, supprimées, ou lorsque le texte du résumé change significativement. Les AI Overview de Google sont désormais une source de trafic principale pour de nombreuses requêtes, et les citations peuvent apparaître ou disparaître sans avertissement. Un système de surveillance automatisé détecte ces changements en 24 heures au lieu de semaines.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Une liste de requêtes cibles à surveiller
Parcours
Étape 1: Requêtes de référence
Effectuez des recherches initiales pour établir une référence du contenu des AI Overview pour chaque requête cible.
import os, requests, json, datetime, hashlib
API_KEY = os.environ['SCAVIO_API_KEY']
QUERIES = [
'best search api for developers',
'how to add search to ai agent',
'serp api comparison 2026',
]
BASELINE_FILE = 'ai_overview_baseline.json'
def fetch_ai_overview(query: str) -> dict:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'platform': 'google', 'query': query}, timeout=15)
data = resp.json()
ai = data.get('ai_overview', {})
if isinstance(ai, dict):
return {
'text': ai.get('text', ''),
'citations': ai.get('citations', []),
}
return {'text': str(ai), 'citations': []}
def create_baseline(queries: list) -> dict:
baseline = {}
for q in queries:
overview = fetch_ai_overview(q)
baseline[q] = {
'date': datetime.date.today().isoformat(),
'text_hash': hashlib.md5(overview['text'].encode()).hexdigest(),
'text': overview['text'][:500],
'citations': overview['citations'],
}
print(f'{q}: {len(overview["text"])} chars, {len(overview["citations"])} citations')
with open(BASELINE_FILE, 'w') as f:
json.dump(baseline, f, indent=2)
return baseline
baseline = create_baseline(QUERIES)Étape 2: Recherche quotidienne avec analyse des AI Overview
Effectuez des recherches quotidiennes et analysez le contenu actuel des AI Overview pour comparaison.
def daily_scan(queries: list) -> dict:
current = {}
for q in queries:
overview = fetch_ai_overview(q)
current[q] = {
'date': datetime.date.today().isoformat(),
'text_hash': hashlib.md5(overview['text'].encode()).hexdigest(),
'text': overview['text'][:500],
'citations': overview['citations'],
}
return current
current = daily_scan(QUERIES)
for q, data in current.items():
print(f'{q}: {len(data["citations"])} citations')Étape 3: Comparer les citations
Comparez les citations actuelles à la référence pour trouver les ajouts et les suppressions.
def extract_urls(citations: list) -> set:
urls = set()
for c in citations:
if isinstance(c, dict):
urls.add(c.get('url', c.get('link', '')))
elif isinstance(c, str):
urls.add(c)
return urls
def diff_citations(baseline_entry: dict, current_entry: dict) -> dict:
base_urls = extract_urls(baseline_entry.get('citations', []))
curr_urls = extract_urls(current_entry.get('citations', []))
added = curr_urls - base_urls
removed = base_urls - curr_urls
text_changed = baseline_entry.get('text_hash') != current_entry.get('text_hash')
return {
'added': list(added),
'removed': list(removed),
'text_changed': text_changed,
'has_changes': bool(added or removed or text_changed),
}
# Example:
base = {'citations': [{'url': 'https://a.com'}, {'url': 'https://b.com'}], 'text_hash': 'abc'}
curr = {'citations': [{'url': 'https://b.com'}, {'url': 'https://c.com'}], 'text_hash': 'def'}
diff = diff_citations(base, curr)
print(f'Added: {diff["added"]}, Removed: {diff["removed"]}, Text changed: {diff["text_changed"]}')Étape 4: Alerter en cas de changements
Générez des alertes pour tout changement détecté et imprimez un rapport récapitulatif.
def generate_alerts(baseline: dict, current: dict) -> list:
alerts = []
for query in current:
if query not in baseline:
continue
diff = diff_citations(baseline[query], current[query])
if diff['has_changes']:
alert = {
'query': query,
'date': current[query]['date'],
'added_citations': diff['added'],
'removed_citations': diff['removed'],
'text_changed': diff['text_changed'],
}
alerts.append(alert)
print(f'CHANGE DETECTED: {query}')
if diff['added']:
print(f' Added: {diff["added"]}')
if diff['removed']:
print(f' Removed: {diff["removed"]}')
if diff['text_changed']:
print(f' AI Overview text modified')
if not alerts:
print('No changes detected in AI Overviews')
return alerts
alerts = generate_alerts(baseline, current)Étape 5: Journaliser l'historique des changements
Maintenez un journal continu de tous les changements détectés pour une analyse des tendances au fil du temps.
HISTORY_FILE = 'ai_overview_changes.jsonl'
def log_changes(alerts: list):
if not alerts:
return
with open(HISTORY_FILE, 'a') as f:
for alert in alerts:
f.write(json.dumps(alert) + '\n')
print(f'Logged {len(alerts)} changes to {HISTORY_FILE}')
def read_history() -> list:
entries = []
try:
with open(HISTORY_FILE) as f:
for line in f:
if line.strip():
entries.append(json.loads(line))
except FileNotFoundError:
pass
return entries
# Update baseline after processing
def update_baseline(current: dict):
with open(BASELINE_FILE, 'w') as f:
json.dump(current, f, indent=2)
print('Baseline updated')
log_changes(alerts)
history = read_history()
print(f'Total historical changes: {len(history)}')Exemple Python
import requests, os, hashlib
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def check_ai_overview(query):
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': query}).json()
ai = data.get('ai_overview', {})
text = ai.get('text', '') if isinstance(ai, dict) else str(ai)
citations = ai.get('citations', []) if isinstance(ai, dict) else []
return {'hash': hashlib.md5(text.encode()).hexdigest(), 'citations': len(citations)}
print(check_ai_overview('best search api 2026'))Exemple JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
async function checkAiOverview(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H, body: JSON.stringify({platform: 'google', query})
});
const ai = (await r.json()).ai_overview || {};
const text = ai.text || '';
return {length: text.length, citations: (ai.citations || []).length};
}
checkAiOverview('best search api 2026').then(console.log);Sortie attendue
An automated daily system that monitors Google AI Overview changes, detects citation additions/removals, tracks text modifications, and maintains a change history log.