API Wayback Machine - Récupération d'archives
Problème
Lors de la récupération de données à partir de services disparus, vous devez savoir quels endpoints API ont été archivés par la Wayback Machine et comment y accéder. Tous les endpoints ne sont pas archivés - les endpoints authentifiés ne sont généralement pas capturés.
Contexte / Conditions de déclenchement
- Récupération de données d'un service arrêté (Vine, ancienne API Twitter, plateformes défuntes)
- Création d'un crawler d'archives pour la préservation numérique
- Besoin de reconstruire les données d'engagement (commentaires, likes, followers) à partir des archives
- Obtenir des résultats vides lors de la tentative d'accès aux endpoints API archivés
Solution
Étape 1 : Découvrir ce qui a été archivé
Utilisez l'API CDX pour chercher les endpoints archivés :
# Trouver tous les endpoints archivés sous un préfixe de chemin
curl "https://web.archive.org/cdx/search/cdx?url=vine.co/api/posts/&matchType=prefix&output=json&fl=original,timestamp&filter=statuscode:200&limit=100"
# Vérifier le nombre total de pages disponibles
curl "https://web.archive.org/cdx/search/cdx?url=vine.co/api/&matchType=prefix&showNumPages=true"
Paramètres clés de CDX :
matchType=prefix- Correspondre aux préfixes d'URL avec wildcardsfl=original,timestamp- Sélectionner les champs à retournerfilter=statuscode:200- Uniquement les captures réussiescollapse=urlkey- Dédupliquer par URLlimit=N- Limiter les résultats
Étape 2 : Comprendre ce qui est archivé
Généralement archivé (endpoints publics) :
- Listes de commentaires :
/api/posts/{id}/comments - Profils utilisateur :
/api/users/profiles/{id} - Timelines :
/api/timelines/users/{id} - Flux publics :
/api/timelines/promoted
Généralement NON archivé (nécessite authentification) :
- Listes de likes :
/api/posts/{id}/likes - Listes de followers/following :
/api/users/{id}/followers - Données privées : DMs, paramètres, notifications
Étape 3 : Récupérer les réponses API archivées
Utilisez le modificateur id_ pour obtenir du JSON brut sans la barre d'outils Wayback :
# Sans id_ - peut retourner un wrapper HTML
curl "https://web.archive.org/web/20161209032217/https://vine.co/api/posts/123/comments"
# Avec id_ - retourne du JSON brut
curl "https://web.archive.org/web/20161209032217id_/https://vine.co/api/posts/123/comments"
Étape 4 : Extraire les données intégrées comme solution de secours
Quand les endpoints API n'ont pas été archivés, vérifiez si les données ont été intégrées dans les pages web archivées :
# De nombreuses SPAs intègrent les données initiales dans des balises script
import re
import json
html = fetch_archived_page(url)
# Chercher du JSON intégré (motifs courants)
patterns = [
r'window\.POST_DATA\s*=\s*({.*?});', # Vine
r'window\.__INITIAL_STATE__\s*=\s*({.*?});', # Redux apps
r'<script type="application/json"[^>]*>({.*?})</script>',
]
for pattern in patterns:
match = re.search(pattern, html, re.DOTALL)
if match:
data = json.loads(match.group(1))
Remarque : Les données intégrées sont souvent partielles (p. ex., seulement les 3 premiers commentaires rendus).
Étape 5 : Déduire les données manquantes à partir des interactions
Quand les listes de followers/following ne sont pas disponibles, déduisez les relations :
# Si A a commenté le post de B → A suit probablement B
inferred_follows.append({
'follower': commenter_id,
'followee': post_creator_id,
'inference_type': 'commented_on_post',
'confidence': 0.7
})
# Si A a mentionné @B → A suit probablement B
# Si A et B ont mutuellement commenté → follow bidirectionnel (collaborateurs)
Vérification
- La requête CDX retourne des résultats avec le statut 200
- La récupération avec le modificateur
id_retourne du JSON valide - L'analyse des données intégrées produit la structure attendue
Exemple
import urllib.request
import json
def find_archived_endpoints(base_url):
"""Trouver tous les endpoints API archivés pour un service."""
cdx_url = f"https://web.archive.org/cdx/search/cdx?url={base_url}&matchType=prefix&output=json&fl=original,timestamp&filter=statuscode:200"
with urllib.request.urlopen(cdx_url, timeout=60) as resp:
data = json.loads(resp.read())
# Ignorer la ligne d'en-tête, extraire les URLs uniques
endpoints = {}
for row in data[1:]:
url, timestamp = row[0], row[1]
if url not in endpoints:
endpoints[url] = timestamp
return endpoints
def fetch_archived_json(url, timestamp):
"""Récupérer le JSON archivé en utilisant le modificateur id_."""
archive_url = f"https://web.archive.org/web/{timestamp}id_/{url}"
with urllib.request.urlopen(archive_url, timeout=30) as resp:
return json.loads(resp.read())
# Utilisation
endpoints = find_archived_endpoints("vine.co/api/posts/")
print(f"Found {len(endpoints)} archived endpoints")
# Filtrer vers les endpoints de commentaires
comments = {k: v for k, v in endpoints.items() if '/comments' in k}
Notes
- La Wayback Machine applique des limites de débit - ajoutez des délais (1+ seconde) entre les récupérations
- Les timestamps archivés varient - le même endpoint peut avoir des captures de dates différentes
- APIs paginées : vérifiez les paramètres
page,offset,cursordans les URLs archivées - Certaines archives retournent des redirections 302 - suivez-les ou vérifiez les archives « obsolètes »
- L'API CDX elle-même peut être lente pour de grands ensembles de résultats - utilisez la pagination