wayback-machine-raw-content-id-modifier

Par divinevideo · divine-mobile

Corrigez les erreurs de parsing JSON lors de la récupération de réponses API archivées depuis la Wayback Machine. À utiliser quand : (1) Vous obtenez des erreurs de décodage JSON "Expecting value: line 1 column 1 (char 0)" depuis des URLs archivées, (2) La Wayback Machine renvoie du HTML au lieu du JSON/contenu brut attendu, (3) Vous crawlez des API REST archivées ou des endpoints JSON depuis web.archive.org. Le modificateur `id_` renvoie le contenu brut sans l'encapsulation de la barre d'outils Wayback.

npx skills add https://github.com/divinevideo/divine-mobile --skill wayback-machine-raw-content-id-modifier

Wayback Machine - Contenu brut avec modificateur id_

Problème

Lors de la récupération d'endpoints API JSON archivés depuis la Wayback Machine, vous obtenez du contenu enveloppé en HTML avec la barre d'outils Wayback au lieu de la réponse JSON brute. Cela provoque des erreurs de parsing JSON comme « Expecting value: line 1 column 1 (char 0) » car la réponse commence par <!DOCTYPE html> au lieu d'un JSON valide.

Contexte / Conditions de déclenchement

  • Récupération d'endpoints API archivés depuis web.archive.org/web/{timestamp}/{url}
  • Le parsing JSON échoue avec « Expecting value: line 1 column 1 (char 0) »
  • Le contenu de la réponse commence par du HTML au lieu du JSON attendu
  • Crawling d'API REST archivées, de flux JSON ou de tout contenu non-HTML depuis Wayback
  • Utilisation de json.loads(), response.json() ou parsing JSON similaire en Python

Solution

Ajoutez id_ après le timestamp dans l'URL Wayback pour obtenir le contenu brut :

Par défaut (enveloppé en HTML) :

https://web.archive.org/web/20170112012313/https://vine.co/api/users/profiles/123

Contenu brut (ajoutez id_) :

https://web.archive.org/web/20170112012313id_/https://vine.co/api/users/profiles/123

Correction du code

# AVANT (cassé - retourne du HTML)
url = f"https://web.archive.org/web/{timestamp}/https://example.com/api/data"

# APRÈS (marche - retourne du JSON brut)
url = f"https://web.archive.org/web/{timestamp}id_/https://example.com/api/data"

Autres modificateurs Wayback

  • id_ - Brut/identité (sans modifications, retourne le contenu original)
  • if_ - Mode iframe embed
  • js_ - Mode réécriture JavaScript
  • cs_ - Mode réécriture CSS
  • im_ - Mode image

Vérification

  1. Testez l'URL avec curl pour voir la réponse réelle :

    # Sans id_ - affiche du HTML avec la barre d'outils Wayback
    curl -s "https://web.archive.org/web/20170112012313/https://example.com/api/data" | head -5
    
    # Avec id_ - affiche du JSON brut
    curl -s "https://web.archive.org/web/20170112012313id_/https://example.com/api/data" | head -5
  2. Vérifiez que le parsing JSON fonctionne :

    import json
    import urllib.request
    
    url = f"https://web.archive.org/web/{timestamp}id_/{api_url}"
    with urllib.request.urlopen(url) as resp:
        data = json.loads(resp.read())  # Devrait marcher maintenant

Exemple

Crawling de profils archivés de l'API Vine :

WAYBACK_BASE = "https://web.archive.org/web"

def fetch_profile(user_id: str, timestamp: str):
    # Utilisez le modificateur id_ pour obtenir du JSON brut au lieu du contenu enveloppé en HTML
    url = f"{WAYBACK_BASE}/{timestamp}id_/https://vine.co/api/users/profiles/{user_id}"

    with urllib.request.urlopen(url) as resp:
        data = json.loads(resp.read())
        return data['data']  # Marche correctement maintenant

Notes

  • Le modificateur id_ fonctionne pour tout type de contenu, pas seulement JSON (images, CSS, JS, etc.)
  • Certains contenus archivés peuvent toujours échouer s'ils n'ont jamais été correctement capturés
  • Les requêtes à l'API CDX (pour trouver des URL archivées) n'ont pas besoin du modificateur
  • Limitez le débit des requêtes vers archive.org (5+ secondes entre les requêtes recommandées)
  • Les réponses vides (0 octet) indiquent que l'entrée d'archive existe mais le contenu n'a pas été capturé

Références

Skills similaires