wayback-api-archive-recovery

Par divinevideo · divine-mobile

Récupérez des données depuis des REST APIs archivées à l'aide de la Wayback Machine. À utiliser pour : (1) récupérer des données de services disparus comme Vine, Twitter ou d'autres plateformes, (2) identifier quels endpoints d'API ont été archivés par rapport à ceux nécessitant une authentification, (3) construire des pipelines de récupération de données depuis web.archive.org. Couvre les requêtes CDX API pour découvrir les endpoints archivés, la compréhension de ce qui est archivé (public) par rapport à ce qui ne l'est pas (authentifié), et l'extraction de JSON embarqué dans des pages web archivées en solution de repli.

npx skills add https://github.com/divinevideo/divine-mobile --skill wayback-api-archive-recovery

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 wildcards
  • fl=original,timestamp - Sélectionner les champs à retourner
  • filter=statuscode:200 - Uniquement les captures réussies
  • collapse=urlkey - Dédupliquer par URL
  • limit=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

  1. La requête CDX retourne des résultats avec le statut 200
  2. La récupération avec le modificateur id_ retourne du JSON valide
  3. 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, cursor dans 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

Références

Skills similaires