Files
feadulta/mirror-antiguo/scripts/60-quitar-ua.py
rafa 275aff1430 Mirror del Joomla antiguo: versionar los scripts y reponer los assets que faltaban
Los scripts del mirror (00-90) vivian solo en el disco. Van al repo; los datos que
generan no (16 GB entre crawl, snapshot del origen y Joomla restaurado) -> .gitignore.

Nuevo 91-repone-assets404.sh: repone los ficheros que el crawl no capturo porque se
referencian SOLO desde CSS y el crawler seguia enlaces HTML (system.css, los fondos de
fe_adulta_1, ratingstars.gif de K2). Salian como 404 en los logs de nginx del Hetzner.

Descarga por HTTP desde el Joomla local aislado, nunca del filesystem -- mismo principio
que el crawl, para no arrastrar los .php comprometidos del #183 -- y escanea PHP embebido
antes de copiar a site/.

Resultado sobre las 286 rutas unicas con 404 del log: 196 repuestas y verificadas en
produccion (196/196 en 200 tras el rsync), 82 que dan 301->404 tambien en el origen (ya
estaban rotas en la web original) y 8 rutas basura /%22/... de HTML mal formado.

Refs #180

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 14:04:31 -04:00

75 lines
2.6 KiB
Python

#!/usr/bin/env python3
"""Quita el tag de Google Analytics clasico (UA-32008163-1) del mirror servible.
UA dejo de procesar datos en julio de 2023: el snippet solo sirve para pedir un
ga.js muerto en cada carga. Se quita el bloque <script> ENTERO que lo contiene,
no solo la linea del ID, porque dejar el `_gaq.push` suelto no ahorra la peticion.
**GA4 (G-6RT9ZRS4LW) se queda**: es un bloque <script> distinto y Rafa quiere
seguir midiendo el archivo (#180 comment-504, decision 4).
Solo se toca `site/` (el arbol servible). `raw/` queda intacto como captura fiel
del original, igual que se hizo con los botones sociales.
Uso: python3 60-quitar-ua.py [--dry-run]
"""
import os, re, sys, hashlib
DRY = "--dry-run" in sys.argv
BASE = "/home/rafa/joomla-migration/mirror-antiguo"
RUN = open(os.path.join(BASE, "CURRENT_RUN")).read().strip()
SITE = os.path.join(BASE, "runs", RUN, "site", "antiguo.feadulta.com")
UA = "UA-32008163-1"
GA4 = "G-6RT9ZRS4LW"
# Bloque <script>…</script> que contiene el UA. El (?:(?!</script>).)*? impide
# que el .*? se coma varios bloques seguidos y se lleve por delante el GA4.
BLOQUE = re.compile(
r"[ \t]*<script[^>]*>(?:(?!</script>).)*?" + re.escape(UA) +
r"(?:(?!</script>).)*?</script>\s*", re.S)
tocados = errores = 0
sin_ga4 = []
bytes_antes = bytes_despues = 0
for raiz, _, ficheros in os.walk(SITE):
for f in ficheros:
if not f.lower().endswith((".html", ".htm")) and "." in f:
continue
ruta = os.path.join(raiz, f)
try:
txt = open(ruta, encoding="utf-8", errors="surrogateescape").read()
except (OSError, UnicodeDecodeError):
continue
if UA not in txt:
continue
tenia_ga4 = GA4 in txt
nuevo, n = BLOQUE.subn("\n", txt)
if UA in nuevo:
# El bloque no casó: no dejar el fichero a medias, mejor avisar.
errores += 1
continue
if tenia_ga4 and GA4 not in nuevo:
sin_ga4.append(ruta)
continue
bytes_antes += len(txt)
bytes_despues += len(nuevo)
tocados += 1
if not DRY:
with open(ruta, "w", encoding="utf-8", errors="surrogateescape") as fh:
fh.write(nuevo)
print(f"ficheros modificados : {tocados}")
print(f"no casó el patron : {errores}")
print(f"habrian perdido GA4 : {len(sin_ga4)}")
for r in sin_ga4[:5]:
print(" ", r)
if tocados:
print(f"bytes : {bytes_antes:,} -> {bytes_despues:,} "
f"({bytes_antes - bytes_despues:,} menos)")
print("(DRY RUN, no se ha escrito nada)" if DRY else "escrito")