wayback-indirect-asset-recovery

Par divinevideo · divine-mobile

Récupérez des ressources (images, vidéos, données) qui n'ont pas été directement archivées par Wayback Machine en explorant les pages archivées qui les référencent. À utiliser quand : (1) L'URL directe de la ressource renvoie une 404/503 depuis Wayback, (2) La ressource était hébergée sur un CDN que Wayback n'a pas crawlé, (3) Vous disposez de l'URL de la page mais pas de celle de la ressource, (4) Vous cherchez à récupérer des avatars, miniatures ou médias intégrés provenant de services disparus. L'idée clé : les pages ont souvent été archivées même quand leurs ressources ne l'ont pas été — extrayez les URLs depuis le HTML archivé, puis tentez des méthodes de récupération alternatives.

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

Récupération d'actifs indirects Wayback

Problème

Lors de l'archivage de contenu provenant de services disparus, les URL d'actifs directs (images, vidéos, avatars) retournent souvent des 404/503 depuis Wayback Machine même quand les pages les référençant ont été archivées. Les actifs eux-mêmes n'ont peut-être pas été crawlés, mais leurs URL existent dans le HTML archivé.

Contexte / Conditions de déclenchement

  • L'URL Wayback directe pour l'actif retourne 404 ou 503
  • Vous avez une URL de profil/page mais pas l'URL de l'actif
  • Récupération de média depuis des services disparus (Vine, Tumblr, startups défuntes)
  • Wayback a la page mais pas les actifs intégrés
  • Actifs hébergés sur CDN qui n'étaient pas dans le périmètre de crawl de Wayback

Solution

Étape 1 : Récupérer la page archivée

import requests
import re

session = requests.Session()
session.headers['User-Agent'] = 'YourCrawler/0.1 (archival research)'

# Récupérer le profil/page archivés
page_url = f"https://web.archive.org/web/20170110/https://example.com/user/{username}"
resp = session.get(page_url, timeout=20, allow_redirects=True)

Étape 2 : Extraire les URL d'actifs du HTML

# Essayer plusieurs patterns - la structure des pages varie
patterns = [
    # Image Open Graph
    (r'og:image["\s]+content="([^"]+)"', 'og:image'),
    # Données JSON dans la page
    (r'"avatarUrl"\s*:\s*"([^"]+)"', 'JSON avatarUrl'),
    (r'"imageUrl"\s*:\s*"([^"]+)"', 'JSON imageUrl'),
    # URL CDN
    (r'(https?://[^"\s]+cdn\.[^"\s]+\.(jpg|png|mp4))', 'CDN URL'),
    # URL S3
    (r'(https?://[^"\s]+\.s3\.amazonaws\.com/[^"\s]+)', 'S3 URL'),
]

for pattern, name in patterns:
    match = re.search(pattern, html)
    if match:
        asset_url = match.group(1).replace('&', '&')
        break

Étape 3 : Gérer les URL encapsulées par Wayback

Les URL extraites des pages archivées sont souvent déjà des URL Wayback :

# Si l'URL est déjà encapsulée, convertir im_ en id_ pour le contenu brut
if 'web.archive.org/web/' in asset_url:
    # Remplacer /web/TIMESTAMP/ ou /web/TIMESTAMPim_/ par /web/TIMESTAMPid_/
    download_url = re.sub(r'/web/(\d+)(im_)?/', r'/web/\1id_/', asset_url)
else:
    # Encapsuler l'URL brute dans Wayback
    download_url = f"https://web.archive.org/web/{timestamp}id_/{asset_url}"

Étape 4 : Méthodes de secours si Wayback échoue

Si Wayback retourne 404/503 pour l'actif, essayer des alternatives :

# Extraire l'URL CDN originale
cdn_match = re.search(r'(https?://[^/]+cdn\.[^"\s]+)', asset_url)
if cdn_match:
    original_url = cdn_match.group(1)

    # Méthode 1 : Essayer le CDN live via IP (si le DNS est mort mais les serveurs vivent)
    # Voir : skill dead-cdn-dns-bypass

    # Méthode 2 : Essayer différents timestamps Wayback
    for ts in ['20170110', '20160601', '20150601']:
        alt_url = f"https://web.archive.org/web/{ts}id_/{original_url}"
        resp = session.get(alt_url, timeout=30)
        if resp.status_code == 200:
            break

    # Méthode 3 : Vérifier si l'actif existe sur la plateforme successeur
    # (ex. : utilisateur migré vers Twitter/TikTok avec le même nom d'utilisateur)

Vérification

  1. Vérifier la réponse HTTP 200 depuis l'URL de téléchargement finale
  2. Valider que le content-type correspond au type attendu
  3. Vérifier les magic bytes du fichier (JPEG : \xff\xd8\xff, PNG : \x89PNG)
  4. Confirmer que la taille du fichier dépasse le seuil minimum

Exemple : Récupération d'avatars Vine

def recover_avatar_from_profile(vanity_url: str, user_id: str, session) -> bool:
    """Récupérer l'avatar en crawlant le profil Vine archivé."""
    timestamps = ['20170110', '20161201', '20160601', '20150601']

    for ts in timestamps:
        # Récupérer la page de profil archivée
        profile_url = f"https://web.archive.org/web/{ts}/https://vine.co/{vanity_url}"
        resp = session.get(profile_url, timeout=20)

        if resp.status_code != 200:
            continue

        # Extraire l'URL de l'avatar depuis la page
        match = re.search(r'og:image["\s]+content="([^"]+)"', resp.text)
        if not match:
            match = re.search(r'"avatarUrl"\s*:\s*"([^"]+)"', resp.text)

        if match:
            avatar_url = match.group(1).replace('&', '&')

            # Convertir en URL de contenu brut
            if 'web.archive.org/web/' in avatar_url:
                download_url = re.sub(r'/web/(\d+)(im_)?/', r'/web/\1id_/', avatar_url)
            else:
                download_url = f"https://web.archive.org/web/{ts}id_/{avatar_url}"

            # Télécharger
            img_resp = session.get(download_url, timeout=30)
            if img_resp.status_code == 200 and len(img_resp.content) > 100:
                # Valider et sauvegarder
                if img_resp.content[:3] == b'\xff\xd8\xff':  # JPEG
                    save_avatar(user_id, img_resp.content, 'jpg')
                    return True

    return False

Résultat : Avatars récupérés pour 95 % des top créateurs Vine (incluant Logan Paul, Nash Grier, Lele Pons) dont les URL d'avatar directes n'étaient pas archivées.

Notes

  • Modificateurs Wayback im vs id : im_ retourne l'image avec la barre d'outils Wayback, id_ retourne les bytes bruts
  • Rate limiting : Respecter les serveurs Wayback - ajouter des délais de 1-2 secondes entre les requêtes
  • Plusieurs timestamps : Essayer plusieurs dates d'archive - certaines peuvent avoir l'actif, d'autres non
  • Décodage d'entités HTML : Toujours décoder & en & dans les URL extraites
  • Gestion des redirections : Utiliser allow_redirects=True - Wayback redirige souvent vers le snapshot le plus proche

Skills associées

  • dead-cdn-dns-bypass - Quand le DNS du CDN est mort mais les serveurs répondent encore
  • wayback-api-archive-recovery - Pour découvrir ce qui a été archivé via l'API CDX
  • wayback-machine-raw-content-id-modifier - Pour récupérer le contenu brut sans l'encapsulation Wayback

Skills similaires